C语言实现:幼儿版扫雷
文章目录
外部架构代码
好不容易抽出时间码完了这个幼儿版扫雷,马上就来这里和小伙伴们分享啦!在这种小游戏的制作代码分享,因为程序复杂程度和注意的事项比较多,所以我觉得相较于知识点的讲解方法,一个内容一个注解,我认为保持思维的连贯性是更为必要的。所以我除了大框架思路的构思分享外,在这里不作过多的分割,而是直接上代码,尽量将代码连片的展现给友友们,再在程序中对相应的语句进行注解。不过我会尽量将代码易读性弄高点,希望友友们能耐心看完。
首先,我们还是先将游戏的外部框架设计好。即为游戏的测试程序和游戏菜单的设计。
void menu() //菜单{printf(" \n"); printf("## 1.PLAY ##\n"); //这里将 1 设为进入游戏,0 设为退出游戏在下面的条件语句中有妙用 printf("## 0.EXIT ##\n"); printf(" \n");}void test() //这里是游戏的测试程序{int input;srand((unsigned)time(NULL)); //在用srand()生成随机数种子时不需要进行循环,所以直接放这。并且srand()要用time()函数来获取时间戳来生成随机数种子。time函数声明头文件do //以do while 循环作为外部框架先执行一次程序再进行循环。{menu();//这里是游戏菜单的函数scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出成功!");default:printf("请重新输入:> ");break;}} while (input); //上面菜单的设定使得这里巧妙的用input的值来做判断条件}int main(){test();return 0;}
游戏所需代码声明
接着就是将game()函数里的内部逻辑(扫雷的内部逻辑)进行相关的编写了。
void game() //游戏的主要框架{ int a = 0;char mine[ROWS][COLS] = {0}; //创建数组存储布置的雷的信息,雷用'1'表示,其余用'0'表示char show[ROWS][COLS] = {0}; //创建数组打印排雷信息,初始化为'*' 注意要创建多一圈的数组,排雷用,避免每一次对数组越界的情况进行讨论。InitBoard(mine, ROWS, COLS, '0'); //初始化mine数组,此处多传一个变量使得一个函数就能同时初始化两个数组//DisPlayBoard(mine, ROW, COL);InitBoard(show, ROWS, COLS, '*'); //初始化show数组Set(mine, ROW, COL); //布置雷DisPlayBoard(mine,ROW,COL); //打印雷阵DisPlayBoard(show, ROW, COL);Play(show, mine, ROW, COL); //排雷及游戏胜利与否的逻辑}
游戏内核代码实现
最后就是将游戏内部需要调用的所有函数进行实现
void InitBoard(char board[ROWS][COLS], int row, int col, char set){int i, j;for (i = 0; i < row; i++){for (j = 0; j < col; j++){board[i][j] = set;}}}void Set(char mine[ROWS][COLS],int row,int col){int x = rand() % row+1; //此处记得所打印的雷阵是从下标1~ROWS-1的的show数组信息,但此处传的行列数是ROW和COL,所以在模完随机数后要加一。int y = rand() % col+1;int count = easy_count; //雷个数while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0') //落雷的条件,注意此处是字符型数组,所以这里的零要用单引号''{mine[x][y] = '1'; //字符型数组用'1'count--;}}}void DisPlayBoard(char board[ROWS][COLS],int row,int col){int i, j;for (i = 0; i <= col; i++){printf("%d ",i);}printf("\n");for (i = 1; i < row+1; i++) //此处打印行列号,方便落雷{printf("%d",i);for (j = 1; j < col+1; j++){printf(" %c",board[i][j]);}printf("\n");}}int Size_count(char mine[ROWS][COLS] ,int x ,int y)//这里传扩大一圈的数组行和列的信息,以免数组越界{return mine[x-1][y] +mine[x-1][y-1] +mine[x-1][y+1] +mine[x][y-1] +mine[x][y+1] +mine[x+1][y-1] +mine[x+1][y] +mine[x+1][y+1] - 8*'0'; //此处应知道字符数的相减得到的ASCII值就是对应的整型数}int Play(char show[ROWS][COLS],char mine[ROWS][COLS],int row,int col){int win = 0; //这里声明一个'win'变量来判断排雷完毕的情况while (win < row*col-easy_count){printf("请输入排查雷的坐标:> ");int x, y;scanf("%d%d", &x, &y);if (x > 0 && x <= row && y > 0 && y <= col){if (mine[x][y] == '0'){int count=Size_count(mine, x, y);//这里用函数排查此坐标周围雷的信息show[x][y] = count+'0';//注意这里是字符型数组,count这里不要忘记加上'0'转换为字符数。win++;}elseprintf("很遗憾,你被炸死了\n"); printf("让你死的明白一点:\n"); DisPlayBoard(mine, ROW, COL);//这里让玩家屎的明白一点,人性化的打印雷阵break;}elseprintf("请重新输入!\n");}if (win == row * col - easy_count)printf("恭喜你,游戏胜利!\n");printf("雷阵图:\n"); DisPlayBoard(mine, ROW, COL); }
噢对,这里给的都是执行的主要代码块儿。头文件那些自己也要记得引用噢,具体要引用的头文件注释中都有写明。好啦,大伙儿,时间不早了,我也得去睡个香香的美容觉了,好好学习!
如果内容有误,欢迎评论区大佬们指正嗷。