1.首先扫雷游戏要存储布置好的雷信息,需要一个二维数组
不是雷放* 雷:# 不是雷:0 雷:1
2. 给2个二维数组 9*9 一个存放雷的信息,一个存放布置好雷的信息
3.为了防止在统计坐标周围的雷点个数的时候越界,我们让数组设计为11*11

test.c. - 测试游戏的代码
game.c -游戏的实现
game.h. -游戏函数的声明
初始化棋盘
- //初始化棋盘
- void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
- {
- int i = 0;
- for(i = 0;i
- {
- int j = 0;
- for(j = 0;j < cols; j++)
- {
- board[i][j] = set;
- }
- }
- }
打印棋盘
- //打印棋盘
- void DisplayBoard(char board[ROWS][COLS],int row,int col)
- {
- int i =0;
- printf("-----扫雷游戏-----\n");
- for(i = 0; i <= col ; i++)
- {
- printf("%d ",i);
- }
- printf("\n");
- for(i = 1;i <= row ;i++)
- {
- //行号
- printf("%d ",i);
- int j = 0;
- for(j = 1; j <= col;j++)
- {
- printf("%c ",board[i][j]);
- }
- printf("\n");
- }
- }
布置雷
- //布置雷
- void SetMine(char board[ROWS][COLS],int row,int col)
- {
- //布置10个雷
- //1.生成随机的坐标,布置雷
- int count = EASY_COUNT;
- while(count)
- {
- int x = rand() % row + 1;
- int y = rand() % col + 1;
-
- //判断布置的雷是否重复
- if(board[x][y] == '0')
- {
- board[x][y] = '1';
- count--;
- }
- }
- }
排查雷和计算周围有几个雷
- //计算周围有几个雷
- int GetMineCount(char mine[ROWS][COLS],int x,int y)
- {
- 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');
- }
-
- //排查雷
- void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row ,int col)
- {
- int x = 0;
- int y = 0;
- int win = 0;
-
- while (win < row*col - EASY_COUNT)
- {
- printf("请输入要排查的坐标:>");
- scanf("%d %d", &x ,&y);
- if (x >= 1 && x <= row && y >=1 && y<=col)
- {
- if (mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死了\n");
- DisplayBoard(mine,ROW,COL);
- break;
- } else
- {
- //该位置不是雷,就统计这个坐标周围有几个雷
- int count = GetMineCount(mine,x,y);
- show[x][y] = count + '0';//数字转化为字符 ,+'0'表示转化成ASCII
- DisplayBoard(show,ROW,COL);
- win++;
- }
-
- } else
- {
- printf("坐标非法,重新输入\n");
- }
- }
-
- if (win == row * col -EASY_COUNT)
- {
- printf("恭喜你,排雷成功\n");
- DisplayBoard(mine,ROW,COL);
- }
-
-
-
-
- }
以下完整版代码:
game.h文件
- #include
- #include
- #include
-
- #define EASY_COUNT 10
- #define ROW 9
- #define COL 9
- #define ROWS ROW+2
- #define COLS COL+2
-
- //初始化棋盘
- void InitBoard(char board[ROWS][COLS],int rows,int cols,char set);
-
- //打印棋盘
- void DisplayBoard(char board[ROWS][COLS],int row,int col);
-
- //布置雷
- void SetMine(char board[ROWS][COLS],int row,int col);
-
- //排查雷
- void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row ,int col);
game.c文件
- #include "game.h"
-
- //初始化棋盘
- void InitBoard(char board[ROWS][COLS],int rows,int cols,char set)
- {
- int i = 0;
- for(i = 0;i
- {
- int j = 0;
- for(j = 0;j < cols; j++)
- {
- board[i][j] = set;
- }
- }
- }
-
- //打印棋盘
- void DisplayBoard(char board[ROWS][COLS],int row,int col)
- {
- int i =0;
- printf("-----扫雷游戏-----\n");
- for(i = 0; i <= col ; i++)
- {
- printf("%d ",i);
- }
- printf("\n");
- for(i = 1;i <= row ;i++)
- {
- //行号
- printf("%d ",i);
- int j = 0;
- for(j = 1; j <= col;j++)
- {
- printf("%c ",board[i][j]);
- }
- printf("\n");
- }
- }
-
- //布置雷
- void SetMine(char board[ROWS][COLS],int row,int col)
- {
- //布置10个雷
- //1.生成随机的坐标,布置雷
- int count = EASY_COUNT;
- while(count)
- {
- int x = rand() % row + 1;
- int y = rand() % col + 1;
-
- //判断布置的雷是否重复
- if(board[x][y] == '0')
- {
- board[x][y] = '1';
- count--;
- }
- }
- }
-
- //计算周围有几个雷
- int GetMineCount(char mine[ROWS][COLS],int x,int y)
- {
- 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');
- }
-
- //排查雷
- void FindMine(char mine[ROWS][COLS],char show[ROWS][COLS],int row ,int col)
- {
- int x = 0;
- int y = 0;
- int win = 0;
-
- while (win < row*col - EASY_COUNT)
- {
- printf("请输入要排查的坐标:>");
- scanf("%d %d", &x ,&y);
- if (x >= 1 && x <= row && y >=1 && y<=col)
- {
- if (mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死了\n");
- DisplayBoard(mine,ROW,COL);
- break;
- } else
- {
- //该位置不是雷,就统计这个坐标周围有几个雷
- int count = GetMineCount(mine,x,y);
- show[x][y] = count + '0';//数字转化为字符 ,+'0'表示转化成ASCII
- DisplayBoard(show,ROW,COL);
- win++;
- }
-
- } else
- {
- printf("坐标非法,重新输入\n");
- }
- }
-
- if (win == row * col -EASY_COUNT)
- {
- printf("恭喜你,排雷成功\n");
- DisplayBoard(mine,ROW,COL);
- }
-
-
-
-
- }
test.c文件
- #include "game.h"
-
- void menu()
- {
- printf("****************************\n");
- printf("******** 1.play *****\n");
- printf("******** 0.play *****\n");
- printf("****************************\n");
- }
-
- void game()
- {
- char mine[ROWS][COLS];//存放布置好的雷
- char show[ROWS][COLS];//存放排查出的雷的信息
- //初始化棋盘
- //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);
- }
-
- int main()
- {
- int input = 0;
- srand((unsigned int)time(NULL));
- do
- {
- menu();
- printf("请选择:>");
- scanf("%d",&input);
- switch (input)
- {
- case 1:
- game();
- printf("扫雷\n");
- break;
- case 0:
- printf("退出游戏\n");
- break;
- default:
- printf("选择错误,重新选择\n");
- break;
- }
- } while (input);
-
- return 0;
-
- }
-
相关阅读:
一种ESDF地图实现方法:FIESTA
韩国严厉监管元宇宙相关企业
【原创】鲲鹏ARM构架openEuler操作系统安装Oracle 19c
这一篇让你彻底搞懂 JAVA 内部类
Mybatis plus 分页查询total为0 及日期类格式化配置
php单独使用laravel数据库
Kotlin面向对象
【Rust】快速教程——冻结&表达式
1775. 通过最少操作次数使数组的和相等
acwing语法类最长公共后缀
-
原文地址:https://blog.csdn.net/qq_61658398/article/details/132816225