扫雷小游戏:
游戏最终效果:
1.先写一下游戏开始的简单界面。
用一个函数来写一下
- void menu()
- {
- printf(" ---------------------------- \n");
- printf("| 1.play |\n");
- printf("| 0.exit |\n");
- printf(" ---------------------------- \n");
-
- }
这里的功能(说明):
输入 1 代表游戏开始;
输入 0 代表游戏结束,并退出页面;
既然写扫雷,那地图中的地雷应该是随机出现的,那我们可以用一个srand函数让它随机出现生成地雷。
srand((unsigned int)time(NULL)); //生成随机数的一个函数
具体用法可以百度一下,简单的概括就是生成一个随机数字。
- int main()
- {
- srand((unsigned int)time(NULL));
- int input = 0; //用与while函数循环的选择
- do { //也就是刚开始说的界面选择开始或结束的选项
- menu();
- printf("请选择>");
- scanf("%d", &input); //这里的input就是游戏开始或结束的选择
- switch (input) //再循环里面嵌套一个switch
- {
- case 1: // 当输入1的时候,那就进入游戏开始的逻辑
- printf("游戏开始!\n");
- system("cls"); // :这里是系统函数,用于清空控制台的消息与文字
- game(); // 这个是游戏开始的函数接口
- break;
- case 0: // 当选择0的时候,即退出游戏退出循环,并程序结束。
- printf("\n即将退出游戏!\n");
- break;
- default : //因为只有输入0/1,否则就是输入错误,需要重新输入
- printf("您的选择有误,请重新输入:\n");
- }
- } while (input);
- return 0;
- }
当我们选择play时,我们将进入游戏,之后就是游戏逻辑的代码了。
- #define ROW 9 //棋盘 行
- #define COL 9 //棋盘 列
- #define ROWS ROW+2 //判断-棋盘 行
- #define COLS COL+2 //判断-棋盘 列
- #define COUNT 10 //地雷个数
扫雷,我们需要创建两个二维数组,之后的操作与逻辑都是围绕这两个棋盘来写
一个用来展示覆盖与否的画面(代码中的 show数组):
一个用来记载着地雷的位置与判断(代码中的mine数组) :
- void game()
- {
- char mine[ROWS][COLS]; //注: ROWS COLS 为头文件define出来的行和列
- char show[ROWS][COLS];
-
- //初始化数据
- Initboard(mine, ROWS, COLS, '0');
- Initboard(show, ROWS, COLS, '*');
-
- //棋盘打印
- Displayboard(show, ROW, COL);
-
- //布置雷
- Setmine(mine, ROW, COL);
-
- //排查雷
-
- Findmine(mine, show, ROW, COL);
- //Displayboard(show, ROW, COL);
-
- }
之后我们需要先把两个二维数组给初始化一下:
这里我们写一个函数Initboard
- //初始化棋盘
- void Initboard(char borad[ROWS][COLS], int rows, int cols,char set)
- {
- int i = 0;
- for (i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- borad[i][j] = set;
- }
- }
- }
我们将mine的二维数组都初始化为’0‘
将show二维数组都初始化为’*‘
注:我们展示出来的一般都是show的二维数组
所以我们需要写一个格式函数
- //打印棋盘 //并设置格式
- void Displayboard(char borad[ROWS][COLS], int row, int col)
- {
- printf("======扫雷游戏======\n");
- int i = 0;
- for (i = 0; i <= row; i++)
- {
- printf("%d ", i);
- }
- printf("\n");
-
- for (int a = 1; a <=row; a++)
- {
- printf("%d ", a);
- for (int b = 1; b <= col; b++)
- {
- Sleep(10);
- printf("%c ", borad[a][b]);
- }
- printf("\n");
- }
- printf("======扫雷游戏======\n");
-
- }
展示出来就是这个样子。
游戏页面的大概就展示出来了,接下来我们需要写一下游戏判断逻辑了
首先我们需要埋雷,但雷的位置是随机的,所以我们需要用一下srand函数,把雷随机的放进mine二维数组中,就是随机生成一个坐标
注:mine二维数组中 “0”代表该位置是安全的坐标
“1”代表该位置是埋有地雷的坐标)
- //布置雷
- void Setmine(char mine[ROWS][COLS], int row, int col)
- {
- int count = COUNT; //COUNT代表的雷的个数,可以自己设置
- while (count)
- {
- int x = rand() % row + 1; //随机生成x坐标
- int y = rand() % col + 1; //随机生成y坐标
- if (mine[x][y] =='0')
- {
- mine[x][y] = '1'; //把mine二维数组的该位置改为1
- count--;
- } //代表着埋入地雷
- }
- }
接下来就是输入坐标来排查雷的步骤了
- //排查雷
- void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
- {
- int a = 0;
- int b= 0;
- int win = 0;
- while(win
|
- printf("请输入您的坐标:");
- scanf("%d", &a); //输入坐标x和y
- scanf("%d", &b);
- if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
- { //这里需要用if来判断一下x和y的值是否大于坐标,不在这个范围就需要重新输入坐标
- if (mine[a][b] == '1') //这里判断的是如果坐标刚好在雷的位置,游戏就结束了
- {
- system("cls"); //清空屏幕
- printf("很抱歉,您被炸死了。\n");
- Displayboard(mine, ROW, COL); //当炸死后,这里在打印一下mine的棋盘
- Sleep(1000); //提示一下并答应雷的位置告诉玩家这里是雷
- break; //游戏结束后这里需要break一下结束这一层的循环
- }
- else
- {
- int count=Getminecount(mine,a,b);//Getminecount函数排查这个坐标周围有多少颗雷
- show[a][b] = count+'0';
- system("cls");
-
- Displayboard(show, ROW, COL);
- win++;
- }
- }
- else //当不在取值范围内就需要重新输入一下 并输出一个坐标有误的提示
- {
- printf("您输入的坐标有误,请重新输入:\n ");
- }
- }
-
- if (win == row * col - COUNT) 当把雷的排完后,就获胜了!
- {
- printf("恭喜你,排雷成功。\n");
- Displayboard(show, ROW, COL);
-
- }
- }
该函数用于统计坐标周围有多少颗雷。
- //统计周围雷的个数
- int Getminecount(char mine[ROWS][COLS], int x, int y)
- {
- return (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] +
- mine[x - 1][y] - 8 * '0');
- }
下面是全代码:
- #define _CRT_SECURE_NO_WARNINGS 1
- #include
- #include
- #include
- #define ROW 9 //棋盘 行
- #define COL 9 //棋盘 列
- #define ROWS ROW+2 //判断-棋盘 行
- #define COLS COL+2 //判断-棋盘 列
-
- #define COUNT 10 //地雷个数
-
- //初始化棋盘
- void Initboard(char borad[ROWS][COLS], int rows, int cols,char set)
- {
- int i = 0;
- for (i = 0; i < rows; i++)
- {
- for (int j = 0; j < cols; j++)
- {
- borad[i][j] = set;
- }
- }
- }
-
- //打印棋盘 //并设置格式
- void Displayboard(char borad[ROWS][COLS], int row, int col)
- {
- printf("======扫雷游戏======\n");
- int i = 0;
- for (i = 0; i <= row; i++)
- {
- printf("%d ", i);
- }
- printf("\n");
-
- for (int a = 1; a <=row; a++)
- {
- printf("%d ", a);
- for (int b = 1; b <= col; b++)
- {
- Sleep(10);
- printf("%c ", borad[a][b]);
- }
- printf("\n");
- }
- printf("======扫雷游戏======\n");
-
- }
-
-
- //布置雷
- void Setmine(char mine[ROWS][COLS], int row, int col)
- {
- int count = COUNT;
- while (count)
- {
- int x = rand() % row + 1;
- int y = rand() % col + 1;
- if (mine[x][y] =='0')
- {
- mine[x][y] = '1';
- count--;
- }
- }
- }
-
- //排查雷
- void Findmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
- {
- int a = 0;
- int b= 0;
- int win = 0;
- while(win
|
- printf("请输入您的坐标:");
- scanf("%d", &a);
- scanf("%d", &b);
- // a = a / a * a;
- // b = b / b * b;
- if ((a <= row + 1 && a > 0) && (b <= col + 1 && b > 0))
- {
- if (mine[a][b] == '1')
- {
- system("cls");
- printf("很抱歉,您被炸死了。\n");
- Displayboard(mine, ROW, COL);
- Sleep(1000);
- break;
- }
- else
- {
- int count=Getminecount(mine,a,b);
- show[a][b] = count+'0';
- system("cls");
-
- Displayboard(show, ROW, COL);
- win++;
- }
- }
- else
- {
- printf("您输入的坐标有误,请重新输入:\n ");
- }
- }
- if (win == row * col - COUNT)
- {
- printf("恭喜你,排雷成功。\n");
- Displayboard(show, ROW, COL);
-
- }
- }
-
- //统计周围雷的个数
- int Getminecount(char mine[ROWS][COLS], int x, int y)
- {
- return (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] +
- mine[x - 1][y] - 8 * '0');
-
- }
-
- void menu()
- {
- printf(" ---------------------------- \n");
- printf("| 1.play |\n");
- printf("| 0.exit |\n");
- printf(" ---------------------------- \n");
-
- }
- void game()
- {
- char mine[ROWS][COLS];
- char show[ROWS][COLS];
- //初始化数据
- Initboard(mine, ROWS, COLS, '0');
- Initboard(show, ROWS, COLS, '*');
-
- //棋盘打印
- //Displayboard(mine, ROW, COL);
- Displayboard(show, ROW, COL);
-
- //布置雷
- Setmine(mine, ROW, COL);
-
-
- //排查雷
-
- Findmine(mine, show, ROW, COL);
- //Displayboard(show, ROW, COL);
-
- }
- int main()
- {
- srand((unsigned int)time(NULL));
- int input = 0;
- do {
- menu();
- printf("请选择>");
- scanf("%d", &input);
- switch (input)
- {
- case 1:
- printf("游戏开始!\n");
- Sleep(1000);
- system("cls");
- game();
- break;
- case 0:
- printf("\n即将退出游戏!\n");
- break;
- default :
- printf("您的选择有误,请重新输入:\n");
- }
- } while (input);
- return 0;
- }
-
相关阅读:
LabVIEW利用以太网开发智能液位检测仪
【前端】JavaScript
Worthington核糖核酸酶B历史和化学性质说明
基于Springboot+vue的玩具销售商城网站 elementui
.NET Emit 入门教程:第七部分:实战项目1:将 DbDataReader 转实体
提升文件上传性能的 4 种方式,你会吗?
Java工程师的就业前景?薪资水平?
【毕业设计】基于Stm32的人体心率脉搏无线监测系统 - 单片机 物联网
Android12 展锐sl8541平台USB转串口(pl2303、ch343)以及APP访问权限
自己写过比较蠢的代码:从失败中学习的经验
-
原文地址:https://blog.csdn.net/2301_78590609/article/details/139806023