手把手教你用C语言开发扫雷小游戏

张开发
2026/4/13 14:55:17 15 分钟阅读

分享文章

手把手教你用C语言开发扫雷小游戏
C语言扫雷游戏一.游戏逻辑分析与结构框架1.棋盘的创建2.布置炸弹3.排除炸弹二.游戏实现1.头文件game.h2.源文件game.c3.源文件test.c在此之前我们已经对分支与循环语句、数组和函数有了一定得了解接下来我们将写一个简单的扫雷游戏代码在写之前得先对扫雷逻辑要有一定的了解。游戏要求1.电脑生成一个9x9的棋盘2.在这9x9棋盘中随机部署10个炸弹3.在游戏过程中如果踩到炸弹游戏结束并且打印棋盘布局如果没有则统计其周围共有几个炸弹并继续游戏直到把除10个雷之外的所有⾮雷都找出来排雷成功游戏结束。扫雷游戏一.游戏逻辑分析与结构框架1.棋盘的创建首先我们得要创建一个9x9的棋盘来存放炸弹这很简单运用我们之前学的二维数组即可。#defineROW9#defineCOL9但是得想想如果我们只是创建了一个9x9的棋盘就足够了吗在这之前就已经说明了在游戏要求3中如果没有踩到炸弹则统计其周围共有几个炸弹那如果非炸弹刚好布置在棋盘边沿有三个位置已经超出了棋盘范围了又该如何统计其周围共有几个炸弹呢如下图所示其中设0为非炸弹1为炸弹遇到这种情况又该如何去解决仔细想想既然超出的范围我们用不上并且也为非雷区何不将这9x9的棋盘边沿包围住并填充上0在创建一个11x11的棋盘解决了因为范围超出的问题。#defineROWSROW2#defineCOLSCOL2如下图所示创建棋盘代码参考voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset);voidInitBoard(charboard[ROWS][COLS],introws,intcols,charset){inti0;for(i0;irows;i){intj0;for(j0;jcols;j){board[i][j]set;}}}InitBoard(mine,ROWS,COLS,0);InitBoard(show,ROWS,COLS,*);//在这里*是为了覆盖炸弹布置的位置看到这里你会觉得有些迷茫为什么这代码分开来的这是因为第一份代码我放在叫game.h的头文件里主要是写游戏需要的数据类型和函数声明等 第二份代码放在game.c文件里主要是写游戏中函数的实现等第三份代码放在test.c文件里主要是写游戏的测试逻辑如何操作呢如下图所示右击源文件添加新建项然后有两个选项一个是.c后缀的c文件另一个是.h后缀的头文件。通过这些操作我们就可以得到在这里我们又看到除了创建棋盘之外还顺便打印了行和列只需在代码中加上这几句就行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);}}2.布置炸弹那接下来又应该如何布置我们的炸弹呢想一想我们之前学过的猜数字游戏中想要得到一个随机数是如何做到的这就不得不提rand、srand和time这三个函数了并且炸弹布置的范围不能超过棋盘的范围仔细缕一缕思路不就来了吗首先创建随机值srand((unsignedint)time(NULL));接着设置范围arand()%(b-a1);//⽣成a~b的随机数但我们要的是9x9的范围所以可以这样写intxrand()%row1;//rand() % row范围在0~row-1, 1后范围在1~rowintyrand()%col1;最后布置炸弹设置数量count运用while循环将炸弹(1)随机赋值给9x9坐标任何一个每布置完一个count--布置完后count0跳出循环voidSetMine(charboard[ROWS][COLS],introw,intcol){intcountEASY_COUNT;while(count){intxrand()%row1;//rand() % row范围在0~row-1, 1后范围在1~rowintyrand()%col1;if(board[x][y]0){board[x][y]1;count--;}}}在这里我们要注意的是棋盘布局是用char类型所有0和1要写成0和13.排除炸弹既然炸弹都布置完了那接下来的操作便是找出棋盘中所有的炸弹思路是这样的首先得输入一个有效坐标如果该坐标是 ‘1’ ,真倒霉被炸了游戏结束并打印炸弹布局是否再来一局如果该坐标是 ‘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);}}那如果该坐标是 ‘0’ 又该如何统计该坐标周围一共有几个炸弹呢我们可以在判断该坐标不为炸弹调用函数int count GetMineCount(mine, x, y);来计算因为我们在此之前设置炸弹为 ‘1’非炸弹为 ‘0’那我们就可以将选择的坐标(x,y)的周围8个坐标值加起来即可如下所示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);}二.游戏实现声明game.c和test.c的头文件在game.h里面所有这两个文件顶端都要加上#include game.h1.头文件game.h#define_CRT_SECURE_NO_WARNINGS#pragmaonce#includestdio.h#includestdlib.h#includetime.h#defineROW9#defineCOL9#defineROWSROW2#defineCOLSCOL2#defineEASY_COUNT10//设置炸弹数量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);2.源文件game.c#includegame.h//初始棋盘voidInitBoard(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){intcountEASY_COUNT;while(count){intxrand()%row1;//rand() % row范围在0~row-1, 1后范围在1~rowintyrand()%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);}}3.源文件test.c#includegame.h//test.c 写游戏的测试逻辑//game.c 写游戏中函数的实现等//game.h 写游戏需要的数据类型和函数声明等voidmenu()//创建菜单{printf(********************\n);printf(***** 1.play *****\n);printf(***** 0.exit *****\n);printf(********************\n);}voidgame()//创建game{//用二维数组创建棋盘charmine[ROWS][COLS]{0};//存放好布置好的炸弹charshow[ROWS][COLS]{0};//存放排查出的炸弹的信息InitBoard(mine,ROWS,COLS,0);InitBoard(show,ROWS,COLS,*);//布置炸弹SetMine(mine,ROW,COL);//打印棋盘//DisplayBoard(mine, ROW, COL);//如果想看炸弹布局可将DisplayBoard前面//去掉DisplayBoard(show,ROW,COL);FindMine(mine,show,ROW,COL);}intmain(){intinput0;srand((unsignedint)time(NULL));do{menu();//调用menu菜单printf(请选择:);scanf(%d,input);switch(input){case1:game();//调用gamebreak;case0:printf(退出游戏);break;default:printf(请重新选择);break;}}while(input);return0;}运行结果(部分截图)以上为简单扫雷游戏代码想要做到真正的扫雷还需跟进一步学习最后可以动手去试试实践出真知宝剑锋从磨砺出梅花香自苦寒来。

更多文章