我们大家一定玩过扫雷游戏,那么,我们应该怎么样用C语言来实现他呢?

首先,我们要知道扫雷的游戏规则

在9*9的棋盘中逐个翻开方块,如果翻到了雷,失败,如果没有翻到,则在此方块显示周围八个坐标雷的个数。这样一个个翻方块,直到所有非雷方块翻完,则获得胜利。

首先,我们在玩游戏前先设置一个玩游戏前的准备模块(菜单,是否玩游戏的选择模块)

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>
void menu()
{printf("***************************\n");printf("*******  1.play   *********\n");printf("*******  0.exit   *********\n");printf("***************************\n");
}
void game()
{}
void test()
{int input = 0;do{printf("请选择:>\n");menu();scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏:\n");break;default:printf("选择错误,请重新选择:\n");break;}} while (input);
}
int main()
{test();system("pause");return 0;
}

之后,我们就应该想想应该如何实现游戏

1.布置9*9的棋盘

2.布置10个雷

输入坐标

是雷    ---------    被炸死,游戏结束

不是雷 --------    显示周围八个坐标有多少雷

直到把所有的非雷的位置全部找出来,游戏结束,扫雷成功

我们用两个数组(mine,show)来存储信息,mine数组储存布置好的雷的信息,show数组储存排查出的雷的信息。

1.创建 char mine[11][11] ;char show[11][11]l两个数组并初始化。(用init_board函数实现)

1.为什么棋盘只需要9*9,但却创建了11*11的两个数组?

因为我们在扫雷时在扫到一些极端位置(左上角这个位置)时,若要统计并显示它周围八个坐标雷的数量,这时就会出现数组越界的情况,为了避免这种情况出现,我们在数组的最外围加上一圈,也就是行列各增加两个。

2.为什么数组是字符类型的呢?

show数组中存储的是排查出的雷的信息,用*表示未排查的,’*‘是字符,而为了使得两个数组完全对应,因此mine数组也用char。

注意:在初始化的时候,我们设置的初始化函数传递的参数。init_board(数组名,行,列,要初始化的字符)

2.打印棋盘

注意:函数传递的参数(数组名,行(9),列(9)),我们让游戏者看到9*9的数组即可,而11*11的数组是我们在统计周围八个坐标雷的数量时防止数组越界而设置的,没有必要让游戏者看到。

void show_board(char arr[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;for (i = 1; i <= row; i++){for (j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}

但是,这样打印出来的结果没有行号和列号,对于玩游戏的人来说是极其不方便的。

显然,我们要升级代码,给打印出来的加上行号和列号。

行标号:行号在双层循环前面用一个循环,打印到第一行。

列标号:列标号在每一行的开始打印

void show_board(char arr[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//列标号for (i = 0; i <= col; i++){printf("%d ", i);}printf("\n");for (i = 1; i <= row; i++){//行标号printf("%d ", arr[i][j]);for (j = 1; j <= col; j++){printf("%c ", arr[i][j]);}printf("\n");}
}

3.布置雷

在棋盘上面随机的布置10个雷,这就要用到rand()函数,而要用rand函数就要用srand函数,且srand函数只能用一次。(注意:使用库函数要引头文件)

void set_mine(char mine[ROWS][COLS], int row, int col)
{int count = EASY_COINT;int x = 0;int y = 0;while (count){x = rand() % row + 1;y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}

4.排查雷(while循环)

玩家在每输入一个坐标后,

先判断是否合法(x<=行数,y<=列数);

一:  合法

1.该坐标下是雷,提示游戏失败,用break结束循环。

2.不是雷,在mine数组中计算该坐标周围八个坐标含有雷的数目(用get_mine_count函数),并且在show数组中相同位置把计算的雷数显示出来。

二:   不合法

提示坐标不合法,请重新输入,继续循环。

void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;while (1){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");show_board(mine, show, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);show[x][y] = count + '0';show_board(show, ROW, COL);}}else{printf("坐标非法,请重新输入坐标:");}}
}

5.计算雷的数目

将mine数组该坐标周围八个坐标存储的字符相加减去8*'0',即可得到雷数。(这也是刚开始我们在mine数组中用字符1表示雷,用字符0表示非雷)

int get_mine_count(char mine[ROWS][COLS], char show[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] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] - 8 * '0';
}

6.在排查雷时,函数中的循环什么时候结束呢?游戏胜利的条件又是什么呢?

显然while循环的终止条件是什么?

(while<row*col-EASY_COUNT)    row*col:棋盘总格数    EASY_COUNT:雷数   row*col-EASY_COUNT:棋盘中不是雷的格子数目

应该设置一个计数器,玩家每排查一次,如果未排到雷的话,计数器加一。

void find_mine(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_COINT){printf("请输入要排查的坐标:>");scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");show_board(mine, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);show[x][y] = count + '0';show_board(show, ROW, COL);win++;}}else{printf("坐标非法,请重新输入坐标:");}}if (win == row*col - EASY_COINT){printf("恭喜你,排雷成功\n");show_board(mine, ROW, COL);}
}

7.测试

到此,我们的扫雷游戏就设计完成了。

现在,我们测试一下,看看代码是否把预期的功能全部实现了,看逻辑是否正确。

将雷数(EASY_COUNT)改为80,并且将show数组打印出来,方便测试。

测试结果

这样,我们的扫雷游戏的基本功能就实现完成了。

看完觉得有收获的话点个赞哦

需要源码的可以私信,我发你

扫雷游戏9*9(详细到具体每一步)相关推荐

  1. 针对“扫雷”游戏,完成详细逆向复现报告

    都是主人的 3.1针对"扫雷"游戏,完成详细逆向复现报告 首先,要在CE中打开扫雷进程 (1)找出"雷数"."笑脸"和"计时器&q ...

  2. 超详细分解c 语言——实现扫雷游戏(详解)

    之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法. 今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路. 目录 前引 游戏规则介绍 一.基本游戏思路(游戏实现方法) ...

  3. 如何用计算机玩扫雷,电脑扫雷技巧详细解析 扫雷游戏怎么玩

    电脑扫雷技巧详细解析 扫雷游戏怎么玩由软吧下载编辑网络收集整理,如果您觉得还不错,请分享推荐给你的朋友! 首先简单说下扫雷的规则把所有非地雷的格子揭开即胜利:踩到地雷格子就算失败. 开局的时候使用鼠标 ...

  4. C语言编写扫雷游戏【W5+字详细教学版,包教包会】

    目录 前言 一.扫雷游戏 二.整体分析 三.游戏的实现 1.实现test文件 2.实现game.h文件 3.实现game.c文件 3.1 初始化棋盘 3.2 打印棋盘 3.3 埋放地雷 3.4 判断行 ...

  5. C/C++技术总监带你打造经典扫雷游戏,从未见过如此详细的开发解析!

    <扫雷>是一款大众类的益智小游戏,于1992年发行.游戏目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输. VC++ 扫雷游戏空壳源代码,代码 ...

  6. 扫雷游戏的实现(C语言详细版)

    目录 前言 实现思路 游戏框架的设计 游戏界面的设计 游戏操作的实现 功能函数 初始化函数 打印棋盘 布置雷 判断游戏是否结束 计算九宫格内雷的个数 扩展式排雷 标记雷 排查雷 源文件 game.h ...

  7. C语言——如何实现扫雷游戏,详细解析

    目录 一.扫雷游戏介绍 二.基本流程设计思路 三.代码实现 1.整体框架 2.菜单选项 3.游戏内部的实现 3.1 雷盘的初始化 3.2 打印雷盘 3.3 布置雷 3.4 扫雷 四.总代码 1.主函数 ...

  8. 扫雷游戏详细介绍及代码

    扫雷游戏的界面与二维数组十分相似,所以此次以二维数组构建扫雷游戏. 分成头文件game.h    源文件game.c    text.c 游戏视图如下: ----------------------- ...

  9. C语言实现扫雷游戏(超详细讲解+全部源码)

    电子信息 工科男 一点一点努力! 文章目录 前言 一.游戏介绍 二.游戏设计思路 二.具体步骤 1.创建test.c和game.c源文件以及 game.h头文件 2.创建菜单 3.创建雷盘 4.初始化 ...

最新文章

  1. 有多个重载参数pow_面试深刨——150分面重载
  2. 2015-01-27
  3. 怎么UI数组惊醒初始化 c语言,C语言教案7-数组.ppt
  4. 深入学习python内存管理
  5. zzuli-1726:迷宫(语文功底题。。。)
  6. 每一次突破都是一种进步
  7. cbrt c语音_isgraph - [ C语言中文开发手册 ] - 在线原生手册 - php中文网
  8. nvme固态硬盘开机慢_为何我使用了固态硬盘开机速度还是需要20-30秒
  9. eclipse run on server 点不了finish_分享点经验 | springboot入门及编码
  10. linux登录主机命令,linux w命令查询已登录主机的用户信息
  11. 数据结构—链表-单链表应用-拆分链表
  12. 使用程序修改域帐户直接领导时遇到的错误
  13. 不是所有学计算机的都是肖奈,为什么《微微一笑很倾城》中贝微微肖奈学习都很拔尖,却都不考研...
  14. RHEL 6.5----haproxy实现负载均衡
  15. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_10 打印流_1_打印流_概述和使用...
  16. 高速PCB基础——电阻,电容,电感(第三讲)
  17. 02_星仔带你学Java之变量、常量、字面量、数据类型
  18. 小程序获取oppenid时返回40125或者40029
  19. 请编写一个个人所税计算器,用户输入应发工资薪金所得、五险一金金额和个税免征额,输出应缴税款和实发工资,结果保留小数点后两位。当输入数字小于0或等于0时,输出“error”。‪
  20. 深度学习基础--分类网络

热门文章

  1. 在 Kubernetes 上部署 Fluent Bit 收集日志发送到 Kafka
  2. 网页段落文字右侧参差不齐对齐方式
  3. Unity脚本(三)
  4. NLP之Common sense常识推理
  5. python做乘法运算定律_四年级乘法运算定律-
  6. winform 窗体无法显示报错“未声明或从未赋值“解决办法
  7. 手游运营需网络文化经营许可证?1000万资本金门槛
  8. 社区发现的3个评估指标:标准化互信息NMI,ARI指标,以及模块度(modularity)...
  9. memory:arm 分区layout以及虚拟内存布局-小结
  10. golang 捕获 C/C++ 错误并做善后处理