设计总体思路
实现游戏可以一直玩,先打印棋盘,玩家和电脑下棋,最后分出胜负。
如果编写较大的程序,我们可以分不同模块
例如这个扫雷,我们可以创建三个文件
分别为:
- game.h 函数的声明
- game.c 函数的实现
- test.c 测试游戏逻辑
首先要有开始界面并且有选项选择,开始你的游戏,代码以及效果图如下:
- void menu()
- {
- printf("*********************************************\n");
- printf("************* 1. play *********\n");
- printf("************* 0. exit *********\n");
- printf("*********************************************\n");
- }
-
- int main()
- {
- srand((unsigned int)time(NULL)); //随机数 无符号整型 时间戳
- //头文件:stdlib.h time.h
- int input = 0;
- 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;
- }

test.c
- void game()
- {
- //mine数组是专门存放布置好的雷的信息
- char mine[ROWS][COLS] = {0};
- //show数组是专门存放排查出的雷的信息
- char show[ROWS][COLS] = {0};
- //初始化棋盘
- InitBoard(mine, ROWS, COLS, '0');//'0'
- InitBoard(show, ROWS, COLS, '*');//'*'
- }
game.c
- void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < rows; i++)
- {
- for (j = 0; j < cols; j++)
- {
- board[i][j] = set; #因为两次调用,数组填充不同,set("0","*")
- }
- }
- }
test.c
- //打印棋盘
- DisplayBoard(show, ROW, COL); //打印show数组
game.c
- void DisplayBoard(char board[ROWS][COLS], int row, int col)
- {
- int i = 0;
- int j = 0;
- printf("******* 扫雷 *******\n");
- for (j = 0; j <= col; j++)
- {
- printf("%d ", j);
- }
- printf("\n");
- for (i = 1; i <= row; i++)
- {
- printf("%d ", i);
- for (j = 1; j <= col; j++)
- {
- printf("%c ", board[i][j]);
- }
- printf("\n");
- }
- }

test.c
- //布置雷
- SetMine(mine,ROW,COL);
game.c
- void SetMine(char mine[ROWS][COLS], int row, int col)
- {
- int count = EASY_COUNT;
- while (count)
- {
- //rand()随机生成范围0-32767
- int x = rand() % row + 1;
- int y = rand() % col + 1;
- if (mine[x][y] == '0')
- {
- mine[x][y] = '1';
- count--;
- }
- }
- }
test.c
- //排查雷
- FindMine(mine,show,ROW,COL);
game.c
- 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
|
- {
- printf("请输入要排查的坐标>:");
- scanf("%d %d", &x, &y);
- if (x >= 1 && x <= row && y >= 1 && y <= col)
- {
- if (show[x][y] == '*')
- {
- if (mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死了\n");
- DisplayBoard(mine, ROW, COL);
- break;
- }
- else
- {
- //如果该坐标不是雷,就要统计这个坐标周围有几个雷
- int count = GetMineCount(mine, x, y);
- show[x][y] = count + '0';
- DisplayBoard(show, ROW, COL);
- win++;
- }
- }
- else
- {
- printf("该位置已经被排查\n");
- }
- }
- else
- {
- printf("排查的坐标非法,请重新输入\n");
- }
- }
- if (win == row * col - EASY_COUNT)
- {
- printf("恭喜你,排雷成功\n");
- DisplayBoard(mine, ROW, COL);
- }
- }

六、最后整理代码(完整代码)
game.h
-
- #include
- #include
- #include
-
-
- //初始化棋盘
- 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 mine[ROWS][COLS], int row, int col);
-
- //排查雷
- void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c
- #define _CRT_SECURE_NO_WARNINGS 1
- #include"game.h"
-
-
- void InitBoard(char board[ROWS][COLS], int rows, int cols, char set)
- {
- int i = 0;
- int j = 0;
- for (i = 0; i < rows; i++)
- {
- for (j = 0; j < cols; j++)
- {
- board[i][j] = set;
- }
- }
- }
-
- void DisplayBoard(char board[ROWS][COLS], int row, int col)
- {
- int i = 0;
- int j = 0;
- printf("******* 扫雷 *******\n");
- for (j = 0; j <= col; j++)
- {
- printf("%d ", j);
- }
- printf("\n");
- for (i = 1; i <= row; i++)
- {
- printf("%d ", i);
- for (j = 1; j <= col; j++)
- {
- printf("%c ", board[i][j]);
- }
- printf("\n");
- }
- }
-
- void SetMine(char mine[ROWS][COLS], int row, int col)
- {
- int count = EASY_COUNT;
- while (count)
- {
- //rand()随机生成范围0-32767
- int x = rand() % row + 1;
- int y = rand() % col + 1;
- if (mine[x][y] == '0')
- {
- mine[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
|
- {
- printf("请输入要排查的坐标>:");
- scanf("%d %d", &x, &y);
- if (x >= 1 && x <= row && y >= 1 && y <= col)
- {
- if (show[x][y] == '*')
- {
- if (mine[x][y] == '1')
- {
- printf("很遗憾,你被炸死了\n");
- DisplayBoard(mine, ROW, COL);
- break;
- }
- else
- {
- //如果该坐标不是雷,就要统计这个坐标周围有几个雷
- int count = GetMineCount(mine, x, y);
- show[x][y] = count + '0';
- DisplayBoard(show, ROW, COL);
- win++;
- }
- }
- else
- {
- printf("该位置已经被排查\n");
- }
- }
- else
- {
- printf("排查的坐标非法,请重新输入\n");
- }
- }
- if (win == row * col - EASY_COUNT)
- {
- printf("恭喜你,排雷成功\n");
- DisplayBoard(mine, ROW, COL);
- }
- }
test.c
- #define _CRT_SECURE_NO_WARNINGS 1
- #include"game.h"
-
-
- void menu()
- {
- printf("*********************************************\n");
- printf("************* 1. play *********\n");
- printf("************* 0. exit *********\n");
- printf("*********************************************\n");
- }
-
- void game()
- {
- //mine数组是专门存放布置好的雷的信息
- char mine[ROWS][COLS] = {0};
- //show数组是专门存放排查出的雷的信息
- char show[ROWS][COLS] = {0};
- //初始化棋盘
- InitBoard(mine, ROWS, COLS, '0');//'0'
- InitBoard(show, ROWS, COLS, '*');//'*'
- //打印棋盘
- DisplayBoard(show, ROW, COL);
- //布置雷
- SetMine(mine,ROW,COL);
- //DisplayBoard(mine, ROW, COL);
- //排查雷
- FindMine(mine,show,ROW,COL);
-
-
-
- }
-
- int main()
- {
- srand((unsigned int)time(NULL)); //随机数 无符号整型 时间戳
- //头文件:stdlib.h time.h
- int input = 0;
- 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;
- }

七、游戏展示


个人建议第一个坐标填1 1(这样比较好排)
扩展:
-
展开一片
-
标记是否是雷
-
-
记录剩余雷数量
展开一片满足下列条件:
- 该坐标不是雷
- 该坐标周围没有雷
- 该坐标没有被排查过
满足就再遍历该坐标周围的八个坐标
本文是简单版的扫雷,之后我会出一个进阶版的扫雷
希望会对你有所帮助
-
相关阅读:
猿创征文 |【数据结构】3个例题带你搞定图的遍历:深度优先搜索
探索数字安全的卓越之选 - Digicert证书
iNeuOS工业互联网操作系统,三维(3D)模型在线编辑应用和实时数据统计(和值、均值、众数、方差、中位数等)
2022年下半年信息系统项目管理师下午真题及答案解析
UDP协议之《传输队列长度sk_wmem_alloc统计》
基于JAVA游戏资讯网站计算机毕业设计源码+系统+数据库+lw文档+部署
异或的4种堪称神奇的运用场景
17. Go并发编程
基于SSH的二手货交易平台的设计与实现(lunwen+任务书+翻译及原文+项目源码+sql文件)
3.1-OR59 字符串中找出连续最长的数字串
-
原文地址:https://blog.csdn.net/Starry__Sky222/article/details/133490119