一、了解扫雷游戏
扫雷游戏的规则主要包括以下几点:
-
游戏组成:扫雷游戏由一个方格网格组成,每个方格可能是雷或者其他数字。游戏开始时,所有方格都是未揭示的状态。
-
操作方式:玩家可以通过点击鼠标左键来打开一个方格,如果该方格下隐藏的是雷,则游戏结束;如果该方格下隐藏的是数字,则表示该方格周围八个方格中的雷数目。
-
胜负判定:如果玩家成功地且没有踩到雷,则游戏胜利。如果在游戏过程中不小心触发了雷,即使揭示了所有的非雷方格,游戏也会失败。
二、开始制作
(1)、关于棋盘:
可以用到C语言中数组进行打印,考虑到扫雷游戏需要未揭示的状态以及和标注雷和非雷的状态,且棋盘为9*9的形式,所以需要建立两个二维数组;且因为“若该方格下不是雷,则该方格周围八个方格中的雷数目”,用到数组时,应该设置为11*11的数组(防止排雷时越界),其中一个数组可以将其赋值为字符‘0’,另一个则为‘*’来表示未揭示状态,可以通过如下函数进行传参;
(2)、如何实现游戏进行
1)、进入游戏界面(菜单界面)
void menu(void)//菜单函数
{
printf("################\n");
printf("##是否进行游戏##\n");
printf("################\n");
printf("################\n");
printf("##YES--1#NO——0##\n");
printf("################\n");
}
2)、搭建一个专门存放进行游戏的各种执行程序的函数 ( game函数)
void game(void)//作为进行扫雷游戏的函数
{
//设置两个棋盘
char mi[ROWS][COLS] = { 0 };//初始化棋盘装放‘0’
char ni[ROWS][COLS] = { 0 };//用“*”修饰棋盘
//初始化棋盘
Inste(mi, ROWS, COLS,'0');
Inste(ni, ROWS, COLS, '*');
arange(mi,ROW,COL);//布置雷;
Print(ni, ROW, COL);//打印棋盘;
Troubles(mi,ni,ROW,COL);//排查雷
}
3)、搭建main函数
int main()
{
srand((unsigned int)time(NULL));
int inpt;//设定为进行选择是否开始游戏的变量
do {
menu();//进入菜单界面
printf("请选择是否进行游戏:\n");
scanf("%d",&inpt);
switch (inpt)
{
case 1:
printf("进入游戏\n");
game();//进入游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择\n");
break;
}
} while (inpt!=1);
return 0;
}
通过do……while循环来实现菜单中的各种选择,而while执行的条件为inpt!=1,这一条件保证了游戏进行一局后无论输赢都会退出程序;通过switch函数来实现游戏的开始或退出,以及对选择错误的情况进行重新操作。
(3)、对game函数中的执行程序进行编辑
1)、设置用于棋盘的数组
2)、初始化棋盘
第一个形参用来接收数组,第二个以及第三个接受数组横和竖,第四个接收数组中装的字符
3)、打印棋盘
void Print(char a[ROWS][COLS], int row, int col)
{
int i, j;
printf("-------扫雷游戏-------\n");
for (i = 0; i <= row; i++)//标明横坐标
{
if (i == 0)
{
putchar(' ');
putchar(' ');
continue;
}
printf("%2d", i);
}
putchar('\n');
for (i = 1; i <= row; i++)
{
printf("%2d", i);//表明纵坐标
for (j = 1; j <= col; j++)
{
printf("%2c", a[i][j]);
}
putchar('\n');
}
}
4)、布置雷
对赋值‘0’的数组随机赋值,我们由‘1’来代表雷下,一个9*9的棋盘中有10个雷,因为是随机存放,所以用到了rand函数(rand%10会随机生成1-9的数,因为row和col是9,所以rand%9+1等价于rand%10),使用rand前还要在main函数中写srand((unsigneed int)time(NULL))进行初始化,可以查看下面链接了解该函数c语言中语句srand(time(NULL))什么意思。_百度知道https://zhidao.baidu.com/question/560482190.htmlrand和srand函数的用法_srand和rand函数怎么用-优快云博客文章浏览阅读1.9k次,点赞23次,收藏32次。目录前言一、rand函数二、srand2.读入数据总结前言之前在敲代码的时候用过rand函数,当时只是知道了rand函数要配合srand函数一起使用,才能达到产生一个随机数的目的,具体原因是什么则一知半解,后来闲着无事,查找了一下资料,差不多弄懂了。不过碍于本人水平有限,可能会有些地方理解有误,敬请给读者批评指正,并提出宝贵意见。一、rand函数rand函数是用来产生一个随机数,返回值为0~RAND_MAX,RAND_MAX不得小于32767,在编译器中可以通过查看定义来查看这个数具体是多少。不_srand和rand函数怎么用
https://blog.youkuaiyun.com/fyadf/article/details/115703427
4)、排查雷
1、建立排查雷相关的函数
此时需要将开头建立的两个数组传过去,因为我们看到的是遮住了雷的数组,需要排查的是设置了雷的数组
2、在该函数中如何设置
建立坐标变量x,y来表示坐标,由于坐标需要一直输入到赢或者输掉游戏,所以由此需要建立一个while循环;而排查雷(即赢得胜利)最多需要9*9-10(格子数减去雷的数)设置win变量代表每一次排雷成功则加1;因此将win<(row*col-Esc_cod)作为while循环条件;进入while,需要通过if条件语句来保证坐标的正确性;当进入了第一个if……else语句以后,开始考虑排雷成功与否;此时则可以再次使用if…eles语句,如果失败了则打印布置好雷的棋盘给玩家观看,此时这里用到了break来打破while循环,游戏结束;若是没选到雷,则继续进行游戏,且打印出该坐标附近雷的个数,每成功避开雷一次则win加1,直至游戏结束。
void Troubles(char add[ROWS][COLS], char ads[ROWS][COLS], int row, int col)//add代表mi(底层),ads代表ni(表层)
{
int x, y;
int win = 0;
while (win < (row * col - Esc_cod))
{
printf("请输入坐标:-->\n");
scanf("%d %d", &x, &y);
if (x > 0 && x <= row && y <= col && y > 0)
{
if (add[x][y] == '1')
{
printf("你被炸死了!!!!\n");
Print(add, ROW, COL);//打印存放雷的棋盘;
break;
}
else
{
int count = Sum(add, x, y);
ads[x][y] = count + '0';
Print(ads, ROW, COL);//打印修饰住雷的棋盘
win++;
}
}
else
{
printf("输入错误,重新输入坐标;\n");
}
if (win == (row * col - Esc_cod))
{
printf("恭喜你赢得胜利!!!\n");
}
}
}
3、如何设置在进行排雷时,未选中雷后显示围绕该坐标的8个坐标中的雷个数的函数
将设置好雷的数组传入如下函数,然后对于周围的数通过双for循环,将减去每个坐标减去’0‘后存放在count中用记录雷的个数(因为ascll码值字符0与1差了1,所以有几个字符1减去字符0就有几个雷),将count的值传回void Troubles(char add[ROWS][COLS], char ads[ROWS][COLS], int row, int col)函数中
4、传回雷的个数后在如何操作
对该坐标进行赋值,用字符0来加雷的个数,因为打印的棋盘显示的数据为字符,所以字符0加几就是字符几;打印带有排查过雷的修饰雷的棋盘
四、总结
简易的扫雷游戏用到了for,if……else,while,do……while,switch等简单的语法,提前了解该游戏需要怎么设定,大致进行框架搭建,明白需要什么,即可开始编写代码,具体的内容可以在编译过程中进行完善,不尝试绝对写不出来,试着写写利于提升自己C语言编写能力(用到了#include<stdlib.h> #include<time.h> 两个头文件)