扫雷游戏C语言数组练习

  • 一、目的
  • 二、步骤和思考
    • 1.进行游戏和退出游戏的选择
    • 2.游戏棋盘的实现
    • 3.游戏棋盘的初始化
    • 4.游戏棋盘的展示
    • 5.mine棋盘上的埋雷
    • 6.在show棋盘上进行游戏
  • 三、代码实现
    • 1.游戏进行和退出操作
    • 2.游戏棋盘的实现
    • 3.游戏棋盘的初始化
    • 4.游戏棋盘的展示
    • 5.mine棋盘上的埋雷
    • 6.在show棋盘上进行游戏
  • 四、实现图片展示
  • 1.运行游戏和退出游戏界面
  • 2.棋盘的布置和雷的部署并展示
  • 3.选择一个坐标开始游戏
  • 4.游戏可能的结果
  • 五、扫雷游戏实现总结

一、目的

使用C语言进行数组学习的练习并完成一个简易的扫雷项目。

二、步骤和思考

1.进行游戏和退出游戏的选择

本部分放在test的源文件中

2.游戏棋盘的实现

本部分对扫雷游戏进行模仿,在一个棋盘上进行操作殊为不易,故使用两个棋盘,一个进行雷的部署和查看,扫雷游戏则在第二个棋盘上进行。同时考虑到扫雷游戏的四周问题,在这我们需要在定义棋盘时对行和列都进行加一操作。

3.游戏棋盘的初始化

这个部分我们对两个棋盘都进行初始化,选择字符’0’表示无雷而字符’1’表示有雷。

4.游戏棋盘的展示

由于vs上实现的扫黑黑白小游戏,对行列可能很难分辨,在原有的二维数组的展示基础上添加行列,便于操作。

5.mine棋盘上的埋雷

首先需要获取需要埋雷的数量,这个由自己定义。
实现随机性选择rand函数。
确保不重复埋雷。

6.在show棋盘上进行游戏

确定游戏获胜条件为棋盘上只剩下雷。
确定输入坐标的合法性。
获得所选坐标周围雷的数量并以字符的数字展示。
考虑到扫雷游戏有单机一个位置实现一大片操作形式,触发条件为所选坐标周围8个格子内无雷,接着对周围的八个格子进行递归操作,但原来检查过的格子不需要再次检查。遇到有雷格子则停止递归。

三、代码实现

1.游戏进行和退出操作

void menu()
{printf("-------1.play-----------\n");printf("-------0.exit-----------\n");}
void test()
{int input = 0;do{menu();printf("请选择:>");scanf("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("输入错误\n");}} while (input);
}

2.游戏棋盘的实现

 char mine[ROWS][COLS] = { 0 };//存放布置的雷的信息char show[ROWS][COLS] = { 0 };//存放排查后的信息

3.游戏棋盘的初始化

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;}}
}

4.游戏棋盘的展示

为了方便操作选择位棋盘加上行列

void DisplayBoard(char board[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 ", i);//行号for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}

5.mine棋盘上的埋雷

使用rand函数获取随机的x,y坐标
确保布置雷的位置无雷

void SetMine(char mine[ROWS][COLS], int row, int col)
{int count = COUNT;//设置雷的数量while (count){int x = rand() % row + 1;//获取1-9的随机数字int y = rand() % col + 1;if (mine[x][y] == '0')//确保防止雷的地方不存在雷,约定0无雷1为有雷{mine[x][y] = '1';count--;}}
}

6.在show棋盘上进行游戏

坐标的合法性需要检查
使用board函数来实现拓展的递归
使用get_mine_count函数来实现对选择坐标周围八个位置的雷数量进行统计
ps:由于使用的数组为char类型 数组内所有数字皆为字符型所以需要通过-'0’或者+'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 - 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{broad(mine, show, x, y);DisplayBoard(show, row, col);}}else{printf("输入坐标非法,无法排雷,请重新输入\n");}}for (int i = 1; i <= row; i++){for (int j = 1; j <= col; j++){if (show[i][j] == '*'){win++;}}}if (win == row * col - COUNT){printf("恭喜你,排雷成功\n");DisplayBoard(mine, row, col);}}
void broad(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{//判断坐标是否越界if (x == 0 || y == 0 || x == ROWS - 1 || y == COLS - 1)return;//判断是否已经被排除if (show[x][y] != '*'){return;}int count = get_mine_count(mine, x, y);if (count > 0){show[x][y] = count + '0';return;}//递归拓展地图else if (count == 0){show[x][y] = '0';broad(mine, show, x - 1, y);broad(mine, show, x - 1, y - 1);broad(mine, show, x, y - 1);broad(mine, show, x + 1, y - 1);broad(mine, show, x + 1, y);broad(mine, show, x + 1, y + 1);broad(mine, show, x, y + 1);broad(mine, show, x - 1, y + 1);}
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)//使用static使该函数只能在当前文件中使用
{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';
}

四、实现图片展示

此处指贴出部分运行展示

1.运行游戏和退出游戏界面

2.棋盘的布置和雷的部署并展示

3.选择一个坐标开始游戏

从一个坐标开始拓展

4.游戏可能的结果

五、扫雷游戏实现总结

扫雷游戏总体上来说逻辑是很清楚的,可能的难点在于需要使用来个棋盘才能更清楚的对游戏进行操作和展示,后面的拓展功能的递归也是需要进行仔细思考的,如果不把原来已经计算过的中心点坐标进行标记,那么后面就会进入到无限的递归。
源码链接

扫雷 黑白版 C语言练习相关推荐

  1. Windows经典小游戏--扫雷精装版

    Windows经典小游戏–扫雷精装版 最开始玩的电脑游戏就是蜘蛛纸牌和扫雷了,那时候觉得很神奇的事情现在自己也可以做了.下面就展示一下C语言扫雷的代码. 首先创建一个"扫雷"的项目 ...

  2. 一步一步实现扫雷游戏(C语言实现)(三)

    使用WIN32API连接窗口 此项目相关博文链接 一步一步实现扫雷游戏(C语言实现)(一) 一步一步实现扫雷游戏(C语言实现)(二) 一步一步实现扫雷游戏(C语言实现)(三) 一步一步实现扫雷游戏(C ...

  3. 简陋版C语言仿真通讯录之动态内存开辟版本

    简陋版C语言仿真通讯录 https://blog.csdn.net/csdn_kou/article/details/80287640 简陋版C语言仿真通讯录之动态内存开辟版本 给Contact结构体 ...

  4. 新颖的c语言题目,新颖版c语言经典习题100例(全面面)

    新颖版c语言经典习题100例(全面面) (66页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 19.90 积分 实用文档C语言习题100例(最新整理版) ...

  5. 何钦铭c语言第三版第3章答案,何钦铭版C语言第3章答案精选.pdf

    何钦铭版C语言第3章答案精选 45 若要改变else 正常的配对规则,一般采用 改变else 和 if 的配对 两种方法: 例3-12 改写下列if 语句,使else 和第1个 if 配对. 采用{} ...

  6. 何钦铭版C语言第3章答案,何钦铭版C语言第3章答案

    何钦铭版C语言第3章答案 45 改变改变else 和和 if 的配对的配对 例例3-12 改写下列改写下列 if 语句,使语句,使 else 和第和第1个个 if 配对.配对. if (x 2) if ...

  7. Mac版R语言入门(一)R语言入门操作

    文章更新于2023年1月29日: 视频教程--微信公众号:R语言数据分析与实践                      bilibili: R语言数据分析与实践 CSDN:ZhenniLi 第一集: ...

  8. DXBBS V8.0 BBS论坛系统 简体中文正式版 [ 开发语言:ASP.NET 2.0 (C#) ]

    DXBBS V8.0 BBS论坛系统 简体中文正式版 [ 开发语言:ASP.NET 2.0 (C#) ] 程序版本:DXBBS V8.0 ACCESS/MSSQL版 开发语言:ASP.NET 2.0 ...

  9. 终极版C语言(七)-尹成-专题视频课程

    终极版C语言(七)-2954人已学习 课程介绍         整个教程以 C++ 语言为核心,完整精彩的演练了数据结构.算法.设计模式.数据库.大数据高并发检索.文件重定向.多线程同步.进程通讯.黑 ...

最新文章

  1. CMake结合Visual Studio中开发Qt应用程序注意事项
  2. 计算机设备的热量,帮我计算机一下这块冰能吸收多少热量?
  3. MapReduce运行机制
  4. Win11正版和盗版有什么区别
  5. python和lisp学哪个好_五位专家跟你讲讲为啥Python更适合做AI/机器学习
  6. DR模式 + keepalived
  7. 大数据Hadoop相关概念及其技术生态圈
  8. STM32固件库最新下载方法 2021/6
  9. 如何把Netflix数据集转换成Movielens格式?
  10. Leecode:数组中的最长山脉
  11. 机器学习FP、TP、FN、TN、sensitivity、specificity及代码实现
  12. 【宝藏分享】自从用了这款PPT插件,小伙伴们都跪着看我
  13. 信息时代的眼睛保护色
  14. python编游戏_python编的著名游戏
  15. 【布局优化】基于人工蜂群算法的无线传感器网(WSN)覆盖优化matlab源码
  16. 约数的和及约数的个数
  17. 鸿蒙、OpenHarmony、HarmonyOS傻傻的分不清楚。。。看这篇就够了
  18. 非常棒的13款3DMax渲染器插件推荐给大家
  19. ros软路由加h3c交换机搭建企业网络环境
  20. 专业术语:UV、PV

热门文章

  1. 如何加减单元格指定数字_不要再复制粘贴!高效合并单元格的方法,都在这里了!...
  2. 基于PHP与Javascript的仓库管理系统开发课程报告
  3. 证件照转数字人只需几秒钟,微软实现首个3D扩散模型高质量生成效果,换装改形象一句话搞定 | CVPR 2023...
  4. JS-过滤敏感词【RegExp】
  5. PS网页设计教程XXX——在PS中创建一个漫画书主题网页布局
  6. 5月20日工作日志(奇异森林完工部分截图)
  7. 平板电脑可以写html吗,平板电脑输入法 在键盘界面,选择需要的输入法
  8. awt--WindowListener ---引出下一节事件适配器
  9. 感官营销-sensory marketing-论文解读
  10. 知识上云第四弹:蚂蚁笔记,同时搞定笔记和博客!