C语言---数组和函数的实践之扫雷游戏

C语言---数组和函数的实践之扫雷游戏 扫雷游戏分析和设计大家没玩过扫雷的可以试着先玩一玩以便于更好的理解小编给大家整理了网页版扫雷网址http://www.minesweeper.cn/1.扫雷游戏的功能说明1.1使⽤控制台实现经典的扫雷游戏游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格⼦默认随机布置10个雷可以排查雷如果位置不是雷就显⽰周围有⼏个雷如果位置是雷就炸死游戏结束把除10个雷之外的所有⾮雷都找出来排雷成功游戏结束。游戏的界⾯1.2 游戏的分析和设计1.2.1 数据结构的分析扫雷的过程中布置的雷和排查出的雷的信息都需要存储所以我们需要⼀定的数据结构来存储这些信息。因为我们需要在9X9的棋盘上布置雷的信息和排查雷我们⾸先想到的就是创建⼀个9X9的数组来存放信息。如下图的空棋盘会用到二维数组注意 C语言数组行列的创建是从0开始如果这个位置布置雷我们就存放1没有布置雷就存放0。如下图假设我们排查(2,5)这个坐标时我们访问周围的⼀圈8个⻩⾊位置统计周围雷的个数是1如上图假设我们排查(8,6)这个坐标时我们访问周围的⼀圈8个⻩⾊位置统计周围雷的个数时最下⾯的三个坐标就会越界为了防⽌越界我们在设计的时候给数组扩⼤⼀圈雷还是布置在中间的9X9的坐标上周围⼀圈不去布置雷就⾏这样就解决了越界的问题。所以我们将存放数据的数组创建成11X11是⽐较合适。再继续分析我们在棋盘上布置了雷棋盘上雷的信息1和⾮雷的信息0假设我们排查了某⼀个位置后这个坐标处不是雷这个坐标的周围有1个雷那我们需要将排查出的雷的数量信息记录存储并打印出来作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢如果存放在布置雷的数组中这样雷的信息和雷的个数信息就可能或产⽣混淆和打印上的困难。这⾥我们肯定有办法解决比如雷和非雷的信息不要使⽤数字使⽤某些字符就⾏这样就避免冲突了但是这样做棋盘上有雷和⾮雷的信息还有排查出的雷的个数信息就⽐较混杂不够⽅便。这⾥我们采⽤另外⼀种⽅案我们专⻔给⼀个棋盘对应⼀个数组mine存放布置好的雷的信息再给另外⼀个棋盘对应另外⼀个数组show存放排查出的雷的信息。这样就互不⼲扰了把雷布置到mine数组在mine数组中排查雷排查出的数据存放在show数组并且打印show数组的信息给后期排查参考。同时为了保持神秘show数组开始时初始化为字符’*‘为了保持两个数组的类型⼀致可以使用同⼀套函数处理mine数组最开始也初始化为字符’0’布置雷改成’1’。如下2张图mine数组布置雷后的状态如下show输出初始化的状态如下1.3代码实践代码有很多种思路在这里小编仅介绍自己的思路我们用到的对应的数组如下代码块charmine[11][11]{0};//⽤来存放布置好的雷的信息charshow[11][11]{0};//⽤来存放排查出的雷的个数信息用到的文件我们本次采用3个文件text.c//⽂件中写游戏的主要测试逻辑game.c//⽂件中写游戏中函数定义函数的实现等game.h//⽂件中写游戏需要的数据类型和函数声明等三个文件代码实现如下game.h中的代码#define_CRT_SECURE_NO_WARNINGS1#pragmaonce#includestdio.h#includestdlib.h#includetime.h#defineEASY_COUNT10#defineROW9#defineCOL9#defineROWSROW2#defineCOLSCOL2//初始化棋盘voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset);//打印棋盘voidDisplayBoard(charboard[ROWS][COLS],introw,intcol);//布置雷voidSetMine(charboard[ROWS][COLS],introw,intcol);//排查雷voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol);game.c 中的代码#define_CRT_SECURE_NO_WARNINGS1#includegame.hvoidInitBoard(charboard[ROWS][COLS],introws,intcols,charset){inti0;for(i0;irows;i){intj0;for(j0;jcols;j){board[i][j]set;}}}voidDisplayBoard(charboard[ROWS][COLS],introw,intcol){inti0;printf(--------扫雷游戏-------\n);for(i0;icol;i){printf(%d ,i);}printf(\n);for(i1;irow;i){printf(%d ,i);intj0;for(j1;jcol;j){printf(%c ,board[i][j]);}printf(\n);}}voidSetMine(charboard[ROWS][COLS],introw,intcol){//布置10个雷//⽣成随机的坐标布置雷intcountEASY_COUNT;while(count){intxrand()%row1;intyrand()%col1;if(board[x][y]0){board[x][y]1;count--;}}}intGetMineCount(charmine[ROWS][COLS],intx,inty){return(mine[x-1][y]mine[x-1][y-1]mine[x][y-1]mine[x1][y-1]mine[x1][y]mine[x1][y1]mine[x][y1]mine[x-1][y1]-8*0);}voidFindMine(charmine[ROWS][COLS],charshow[ROWS][COLS],introw,intcol){intx0;inty0;intwin0;while(winrow*col-EASY_COUNT){printf(请输⼊要排查的坐标:);scanf(%d %d,x,y);if(x1xrowy1ycol){if(mine[x][y]1){printf(很遗憾你被炸死了\n);DisplayBoard(mine,ROW,COL);break;}else{//该位置不是雷就统计这个坐标周围有⼏个雷intcountGetMineCount(mine,x,y);show[x][y]count0;DisplayBoard(show,ROW,COL);win;}}else{printf(坐标非法重新输⼊\n);}}if(winrow*col-EASY_COUNT){printf(恭喜你排雷成功\n);DisplayBoard(mine,ROW,COL);}}text.c 中的代码#define_CRT_SECURE_NO_WARNINGS1#includestdio.h#includegame.hvoidmenu(){printf(*****************************\n);printf(******** 1.play *************\n);printf(******** 0.NO play **********\n);printf(*****************************\n);}voidgame(){//定义棋盘设置两个二维数组//我们希望mine数组开始都是0//然后布雷进去放进去的都是1// show 数组最开始全部是“*”charmine[11][11]{0};//⽤来存放布置好的雷的信息charshow[11][11]{0};//⽤来存放排查出的雷的个数信息//初始化棋盘//1. mine数组最开始是全0//2. show数组最开始是全*InitBoard(mine,ROWS,COLS,0);InitBoard(show,ROWS,COLS,*);//打印棋盘//DisplayBoard(mine, ROW, COL);DisplayBoard(show,ROW,COL);//1. 布置雷SetMine(mine,ROW,COL);//DisplayBoard(mine, ROW, COL);//2. 排查雷FindMine(mine,show,ROW,COL);}intmain(){intinput0;do{menu();//调用菜单printf(请选择1或0\n);scanf(%d,input);switch(input){case1:game();//若是1则调用执行具体游戏代码break;case0:printf(退出游戏\n);break;default:printf(请选择玩游戏还是不玩游戏即0或者1\n);break;}}while(input);return0;}本文介绍了扫雷游戏的C语言实现方案。通过分析游戏需求采用二维数组存储雷区信息11x11数组其中9x9为有效区域使用两个独立数组分别存储雷的位置mine数组和显示信息show数组。代码实现分为三个文件game.h定义函数声明和常量game.c包含初始化棋盘、布置雷区、计算周围雷数等核心功能text.c处理游戏菜单和主循环。该设计通过控制台实现经典扫雷功能包括随机布雷默认10个、坐标输入排雷、胜负判断等功能并解决了数组越界等问题。本期小编关于扫雷的介绍就到这里大家喜欢的可以给小编点赞支持下小编哦~~下期小编继续给大家介绍一些调试的技巧感兴趣的给小编点个关注小编随时更新哦·