平稳有序推进网站建设广州网络哪家比较好

当前位置: 首页 > news >正文

平稳有序推进网站建设,广州网络哪家比较好,岗顶做网站公司,WordPress添加弹窗下载按钮文接上一篇博文C语言#xff1a;三子棋小游戏。本篇博文是使用C语言来实现扫雷小游戏的。这里不对扫雷的规则进行赘述。玩家通过键盘输入坐标来探雷。博主在实现扫雷之前从未看过扫雷实现的相关视频#xff0c;所以这里实现的扫雷完全是博主的原生思路#xff0c;具有逻辑性…文接上一篇博文C语言三子棋小游戏。本篇博文是使用C语言来实现扫雷小游戏的。这里不对扫雷的规则进行赘述。玩家通过键盘输入坐标来探雷。博主在实现扫雷之前从未看过扫雷实现的相关视频所以这里实现的扫雷完全是博主的原生思路具有逻辑性。下面详细介绍一下如何实现扫雷。 建议在阅读过上一篇博文再阅读本文因为再本文中对重复的问题不会再次解读。 步骤一制定框架 框架是什么如何制定框架这些问题在三子棋的实现中就已经解答了这里也不多讲。这里的框架与三子棋的框架完全相同。 #includedetect.h int main() {srand((unsigned)time(NULL));//这里设置了随机种子为了之后随机生成雷int n 0;do{menu();printf(your choice:\n);scanf(%d, n);switch (n){case 1:system(cls);game();break;case 0:system(cls);printf(exit game\n);break;default:printf(input error,again:\n);Sleep(1000);system(cls);}} while (n);return 0; } menu是什么在三子棋实现中也提过这里使用了Sleep函数(程序暂停运行多少毫秒和system(cls)清屏是为了更好的游戏体验。这里的detect.h代码如下 #pragma once #define ROW 10 #define COL 10 #define _CRT_SECURE_NO_WARNINGS #includestdio.h #includestdlib.h #includetime.h #includewindows.h void menu(); void game(); 步骤二实现game函数 跟三子棋的game函数一样我们需要事先想好整个game的流程。 分析过程既然有雷我们需要将雷的位置记录下来那我们就需要一个字符二维数组雷用大写字符O表示雷的位置就初始化为O,其他位置为空格。另外开局时我们一个地方都没探测我们难道要将带雷的数组直接打印上去吗显然这样雷就直接被打印出来了。我们可以想到用第二个字符二维数组里面初始时全是空格字符这个数组是用来打印的。我们在这个数组中进行探测。 结束条件如果探的是雷那么直接宣告失败结束本次游戏如果这一次避开了所有的雷那么直接宣告成功结束本次游戏如果这一次没探到雷而且没有结束那么显示此处旁边雷的个数 那我们怎么知道探出的是不是雷其实很简单在数组一中此处如果是雷说明这次探到雷了 下面是game的代码 void game() {char map1[ROW][COL] { 0 };char map2[ROW][COL] { 0 };mapInit(map1, ROW, COL);//真正存储炸弹mapInit(map2, ROW, COL);//用来打印BoomInit(map1, ROW, COL);system(cls);showMap(map2, ROW, COL);while (1){int retplayerMove(map1, map2, ROW, COL,ROW*COL/8);if (ret1)//炸了{system(cls);showMap(map1, ROW, COL);printf(game over\n);system(pause);break;}else if (ret 2)//排除了所有炸弹{system(cls);showMap(map1, ROW, COL);//展示所有炸弹位置printf(detect successfully\n);Sleep(2000);break;}system(cls);showMap(map2, ROW, COL);} }当然只是代码还是很模糊的下面依然需要对game中的各个部分进行讲解。 map1:即数组一用来存放炸弹的 map2即数组二用来打印的 ROWCOL宏定义这个宏定义在detect.h中之前已经给出 mapInit:用来初始化两个数组将两个数组的每一个元素变成空格字符 BoomInit:用来将map1的随机位置放上炸弹 showMap将map2打印出来连带格子的线条之后会详细实现 playerMove返回值为int类型玩家在map2中的一个位置进行探测如果在map1中相应位置是炸弹就返回1避开所有炸弹就返回2其他情况返回0 步骤三实现game中的函数 ​ ​ void mapInit(char map[ROW][COL], int row, int col) {for (int i 0; i row; i){for (int j 0; j col; j){map[i][j] ;}} }//这个函数很简单不作讲解 void BoomInit(char map[ROW][COL], int row, int col) {int boomNum row * col / 6;//6分之一是炸弹//设置炸弹进mapint curNum 0;int x 0;int y 0;while (curNum ! boomNum){x rand() % row;y rand() % col;if (map[x][y] )//如果是空格才能正常放入如果已经是炸弹就不放重新生成一个坐标{map[x][y] O;curNum;}} }void showMap(char map[ROW][COL], int row, int col) {for (int i 0; i row; i){for (int j 0; j col; j){printf( %c , map[i][j]);if (j col - 1)printf(|);}printf(\n);if (i row - 1){for (int x 0; x col; x){printf(—);if (x col - 1)printf(|);}printf(\n);}//这一段其实是将画格子线和棋子一并画出//需要自己动手操作一下才能明白这段代码每一句是在做什么//不动手再怎么讲都不会弄明白} } //warning函数是为了完成playerMove函数而写的请先看playerMove函数 char warning(char map[ROW][COL], int row, int col, int x, int y) {int countBoom 0;//最大为8加上0变成字符for (int i x - 1; i x 1;i){for (int j y - 1; j y 1; j){if (i 0 i row j 0 j col)//越界了就不判断是不是雷{if (map[i][j] O)countBoom;}}}return countBoom 0; } int playerMove(char map1[ROW][COL],char map2[ROW][COL], int row, int col,int boomNum) {int x 0;int y 0;static count 0;//静态局部变量记录用户一共开了几个格子while (1){printf(input x:\n);scanf(%d, x);printf(input y:\n);scanf(%d, y);x–;y–;//用户输入的1就是第一个位置数组下标就是0if (x 0 || x row || y 0 || y col || map2[x][y] ! ){printf(wrong place,again\n);//非法坐标重新输入}else{break;//合法退出循环}}//如果探到雷了map2的该位置就改成O,没探到雷就显示旁边有几个雷//这里的warning函数就是用来给出map1的相应位置旁边有几个雷返回值是char类型map2[x][y] map1[x][y]O?O:warning(map1,ROW,COL,x,y);if (map2[x][y] O)return 1;//探到雷了返回1else//判断是否排除完{count;if (count col * row - boomNum){count 0;//归零下一次进行游戏count还是从0开始计数否则count还是之前的值return 2;//避开了所有的雷返回2}}return 0;//正常进行下一次探测返回0 }​​ 到这里为止所有的工作就完成了我们来看看效果 测试 配合清屏和睡眠函数效果还是不错的只是和原版的扫雷少了一个功能。我们知道原版的扫雷在探到一个格子旁边没有一个炸弹时也就这里实现的扫雷显示0时会自动将旁边的格子显示出来只是这个功能实现起来有点困难。当时想过用递归解决这个问题就是说如果map2中探到一个0雷格将旁边八个格子打开如果这八个格子还有0雷格就会进行递归继续将旁边的格子打开只是这样会有一个问题0雷格挨在一起的话会陷入死递归。个人感觉这个问题使用递归是最好解决的之后想到了解决方案会更新博文。