函数加数组实践——排雷

发布时间:2026/7/19 22:18:59
函数加数组实践——排雷 一.实现排雷分为四个步骤1.初始化棋盘分为一个mine数组一个show数组用show输出打印游戏雷的数组用mine来排雷。其中ROWS为行数COLS为列数char mine[ROWS][COLS];//存放的是雷的信息 char show[ROWS][COLS];//存放的是排查出的雷的信号2.打印棋盘DisplayBoard(show,ROW,COL);3.布置雷setMine(mine, ROW, COL);4.检查雷FindMine(mine,show,ROW,COL);//从mine数组排雷放到show数组里2.详细步骤先建立三个文件一个test.c文件来存放测试游戏的整体逻辑一个game.c文件用来完成游戏的实现一个game.h文件用来进行游戏函数声明。2.1在test.c文件中创建main函数流程步骤首先使用dowhile循环让游戏一直循环进行。intmain() { int input 0; srand((unsigned int)time(NULL)); do { menu(); printf(请输入); scanf(%d,input); switch (input) { case 1: game(); break; case 0: printf(退出游戏\n); break; default: printf(选择错误重新选择\n); break; } } while (input); return 0; }在main函数中通过调用menu菜单打印状态voidmenu() { printf(------------------------------\n); printf(------- 1.play ----------\n); printf(------- 0.exit ----------\n); printf(------------------------------\n); }在main函数中通过调用game函数实现游戏功能voidgame() { char mine[ROWS][COLS];//存放的是雷的信息 char show[ROWS][COLS];//存放的是排查出的雷的信号 //初始化棋盘 InitBoard(mine,ROWS,COLS,0); InitBoard(show,ROWS,COLS, *); //打印棋盘 DisplayBoard(show,ROW,COL); //设置雷 setMine(mine, ROW, COL); //DisplayBoard(mine, ROW, COL); //排雷 FindMine(mine,show,ROW,COL);//从mine数组排雷放到show数组里 }2.2在game.h文件中配置步骤在这里有一个define写法很好可以省去改写数据的麻烦如果你需要修改数据直接在define定义后面修改数据即可不需要修改很多地方的参数define定义的格式#define 标识符 替换文本规则#define、标识符、替换文本之间空格分隔不能用末尾不加分号加分号会把分号一并替换进代码引发语法错误仅简单文本替换无类型检查代码 #define _CRT_SECURE_NO_WARNINGS #include stdio.h #include stdlib.h #include time.h #define EASY_COUNT 10 //定义雷的个数 #define ROW 9 //定义数组中的行数 #define COL 9 //定义数组中的列数 #define ROWS ROW2 #define COLS COL2 //初始化棋盘 void InitBoard(char board[ROWS][COLS], int r, int c, char set); //打印棋盘 void DisplayBoard(char board[ROWS][COLS], int r, int c); //设置雷 void setMine(char board[ROWS][COLS], int r, int c); //排查雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c);2.3在game.c文件中的配置步骤#define _CRT_SECURE_NO_WARNINGS #include game.h #include stdio.h void InitBoard(char board[ROWS][COLS], int r, int c, char set) { int i 0; int j 0; for (i 0; i r;i) { for (j 0;j c;j) { board[i][j] set; } } } void DisplayBoard(char board[ROWS][COLS], int r, int c) { int i 0; int j 0; //打印列序号 for (j 0;j c;j) { printf(%d ,j); } printf(\n);//打印完列号换行 //打印set for (i 1;i r;i) { printf(%d ,i);//打印行号 for (j 1;j c;j) { printf(%c ,board[i][j]); } printf(\n);//每打印完一行换行 } printf(\n);//结束换行 } void setMine(char board[ROWS][COLS], int r, int c) { int count EASY_COUNT; //布雷 while (count) { int x rand() % r 1; int y rand() % c 1; if(board[x][y] 0)//判断是否为0是0就布雷 { board[x][y] 1; count--; } } } static size_t GetMineCount(char mine[ROWS][COLS], int x, int y)//使用static是为了只在这个文件里使用这个函数这个函数主要是计算你输入数组里的雷的个数 { return mine[x - 1][y] mine[x - 1][y - 1] mine[x][y - 1] mine[x 1][y - 1] mine[x 1][y] mine[x 1][y 1] mine[x][y 1] mine[x - 1][y - 1] - 8 * 0;//计算雷的数量0! 0;用0 - 0 0, } //排雷 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int r, int c) { int x 0; int y 0; int win 0; while (win r*c - EASY_COUNT)//通过判断win减去雷的个数看是否超过总次数去实现函数 { printf(请输入要排查的坐标); scanf(%d%d, x, y); if (x 1 x r y 1 y c)//判断坐标不要超出范围 { if (show[x][y] *) { if (mine[x][y] 1) { printf(很遗憾你被炸死了\n); DisplayBoard(mine, ROW, COL); break; } else//如果没被炸输出这个数据周围有几个雷 { size_t count GetMineCount(mine, x, y);//计算mine数组里有几个雷 show[x][y] (char)count 0; DisplayBoard(show, ROW, COL); win; } } else { printf(该坐标已经被排查过不用重复排查\n); } } else { printf(输入的坐标非法重新输入\n); } } if (win r * c - EASY_COUNT)//判断是否找到了没有埋雷的所有格子 { printf(恭喜你排雷成功\n); DisplayBoard(mine, ROW, COL); } }运行截图拓展1.是否可以选择游戏难度简单9*9棋盘10个雷中等16*16棋盘40个雷困难30*16棋盘99个雷2.如果排查位置不是雷周围也没有雷可以展开周围一片3.是否可以标记雷4.是否可以加上排雷的时间显示