超详细分解c 语言——实现扫雷游戏(详解)
之前利用三子棋程序,介绍探讨了 c语言简单游戏编写主要模块及使用方法。
今天,我们就利用这个经典扫雷游戏,来加强对于程序思路的编写及思路。
目录
前引
游戏规则介绍
一、基本游戏思路(游戏实现方法)
二、各步骤实例代码分析
三、游戏主体流程
四、总结
前引
首先,再次介绍 c 语言编写程序的三个主要程序
测试模块(主要由引用函数构成)
存放游戏菜单,设置游戏的开始、游戏方式逻辑、判断胜利、结束等整套流程的主要模块。
游戏模块(游戏运行函数主题)
存放测试模块中引用的具体游戏函数表达式
游戏调用模块(游戏头文件)
类型为头文件,通过它将游戏模块与测试模块联系起来,在其中申明函数,设置全局可控变量,调用库函数等全局操作。
游戏规则介绍
扫雷游戏的玩法是在一个自定义行列大小的方块矩阵中,随机布置一定量的地雷。
由玩家逐个翻开方块,以找出所有地雷为最终游戏目标,如果玩家翻开的方块有地雷,则游戏结束。
游戏的重点为,每一个方块被翻开时会自动显示出周围八格中含有雷的数量,以帮助玩家胜利。
一、基本游戏思路(游戏实现方法)
1.玩法构思
玩家通过给出的信息,将除去雷块的所有安全坐标找出。
2.游戏菜单打印输出
与玩家人机交互,进入或退出游戏。
3.地图初始化及变量设置
地图设置两个变量大小一致,一个为埋雷地图(mine map),一个为显示给玩家的展示地图(show map)。
4.布置地雷
利用rand函数随机输出坐标,将其中的值改变视为雷。
5.玩家排雷
玩家输入坐标,翻开并判断胜利条件,随后反馈翻开后的地图。
6.显示方块周围雷的数量
分别统计周围八格的地图含雷数,并在显示区中的坐标展示。
7.判断胜利条件
玩家选择到地雷,或所有空白地区全部被玩家翻开。
二、各步骤实例代码分析
1.菜单打印及回馈
这里的菜单与之前的三子棋程序基本一致(观看过的可跳过)
void menu()//菜单表制作
{ printf(" 欢迎来到扫雷游戏 \n");printf("*********》请选择《***********\n");printf("****** 1. 开始游戏 *******\n");printf("****** 0. 退出游戏 *******\n");printf("******************************\n");
}int input = 0;//存放玩家输入数据srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf_s("%d", &input);switch (input){case 1:game();//扫雷游戏主程序break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);
注意
//这里使用do while, 保证菜单的第一次循环执行
2.地图变量设计技巧
由于我们程序的主要执行方式为数出周围雷数,所以当玩家翻动最外圈时,可能出现地图报错。
因此,我们在这可以将地图向外扩展一圈(打印地图时不打印)。
#define ROWS ROW+2
#define COLS COL+2
//地图变量行列定义
3.地图打印及列号标识
地图的打印是游戏实现人机交互的重要步骤,为了方便玩家输入坐标。所以,我们要在打印出地图的同时将行列号也打印出来。
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");}
4.利用rand函数设置雷
int count = MINE;//运用mine全局变量控制雷的数量while (count){//产生随机的下标int x = rand()%row+1;int y = rand()%col+1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
注意
坐标从一开始(符合玩家使用习惯),将普通方块设为‘0’ 雷设置为‘1’(方便日后统计雷数)
5.玩家排雷
int x = 0;int y = 0;int win = 0;while (win<row*col- MINE){printf("请输入要排查的坐标:>");scanf_s("%d%d", &x, &y);//x--(1,9) y--(1,9)//判断坐标的合法性if (x >= 1 && x <= row && y >= 1 && y <= col){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");DisplayBoard(mine map, row, col);break;}else{//不是雷情况下,统计坐标周围有几个雷int count = get_mine_count(mine, x, y);show[x][y] = count+'0'; //显示排查出的信息DisplayBoard(show map, row, col);//打印show map地图win++;//记录成功翻雷的次数。}}else{printf("坐标不合法,请重新输入\n");}}
6. 统计排查雷数
static int get_mine_count(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';//通过,此式算出结果后减去‘0’,就为数字。
}
注意
//static int 强制类型转换为数字
7.判断胜利条件
if (win == row * col - MINE)//通过win的数量判断游戏胜利条件{printf("恭喜你,排雷成功\n");DisplayBoard(mine map, row, col);}
当win的值为(所有各数-雷数=空白格数目)时,判断为游戏胜利。
三、游戏主体流程
游戏game函数的主体(即主体流程)
void game()
{char mine map[ROWS][COLS] = {0};//存放布置好的雷的信息char show map[ROWS][COLS] = {0};//存放排查出的雷的信息//初始化地图 InitBoard(mine, ROWS, COLS, '0');// 初始化转化为'0'InitBoard(show, ROWS, COLS, '*');// 初始化转化为'*'//打印一下地图DisplayBoard(show, ROW, COL);//布置雷SetMine(mine, ROW, COL);//排查雷FindMine(mine, show, ROW, COL);
}
四、总结
通过这个游戏程序的编写,大家应该对程序编写思路有了更深刻的理解。
至于扫雷游戏扩展的功能,包括连锁翻动,数据统计,排名分数,计时,选择游戏难度等附加功能。小编能力有限,还尚未开发。如果大家有想法可以优化游戏代码,欢迎大家共同与小编分享。
以上就是超详细分解c 语言——实现扫雷游戏的全部过程,在visual studio 2019环境下实现
超详细分解c 语言——实现扫雷游戏(详解)相关推荐
- c语言写扫雷新手详解
c语言写扫雷新手详解 一.用到的知识点 1.分支语句 2.循环语句 3.二维数组 4.最好分块,使代码的功能更加独立,思维逻辑更加清楚,此程序我写了:test.c用来存放我的主函数,game.h用来定 ...
- 【C语言扫雷游戏详解及如何实现递归展开】
提示:全文已采用物理深色模式,请放心观看 文章目录 一.整体框架 1.设计思路 2.实现细节 二.主要函数 1.打印棋盘 2.递归展开 三.其他函数 一.整体框架 1.设计思路 基础难度的扫雷游戏含有 ...
- Nginx超详细介绍 nginx入门 nginx配置 nginx详解 nginx优化
# 此文加上部署课程一起 nginx文档 nginx配置基本全了 nginx七种状态(tcp是11种状态) #nginx七种状态 Active connections: 2 server accept ...
- 超详细linux基本命令学习以及hdfs命令详解
前言: 本人刚接触linux不久但是就是这不久的接触使我爱上了linux的脚本 linux脚本就几十个基本命令但是就是这几十个基本命令经过简单的组合后可以创造出实现各种功能的强大命令如:同样是处理数据 ...
- C语言实现扫雷游戏(超详细讲解+全部源码)
电子信息 工科男 一点一点努力! 文章目录 前言 一.游戏介绍 二.游戏设计思路 二.具体步骤 1.创建test.c和game.c源文件以及 game.h头文件 2.创建菜单 3.创建雷盘 4.初始化 ...
- C语言编写扫雷游戏,超简单
C语言编写扫雷游戏,超简单 1.扫雷游戏的流程 2.代码编写 3.总结 通过学习C语言的基础知识,基本上是理解了大部分内容,现在就通过所学的知识,写个简单的扫雷游戏,加深对基础知识的理解,正所谓实践是 ...
- 用c语言编写最大最小值_C语言学习教程,用C语言编写扫雷游戏
本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...
- c++扫雷游戏代码_C语言学习教程,用C语言编写扫雷游戏
本文实例为大家分享了C语言实现扫雷游戏及其优化的具体代码,供大家参考,具体内容如下 关于扫雷优化 1.核心思想:使用两个二维数组进行设计,一个用于显示,一个用于后台雷的布置. 2.使用宏常量,后期可以 ...
- c语言扫雷游戏计时功能_C语言实现扫雷游戏(可以自动展开)
前言 本篇博客主要介绍如何使用C语言实现扫雷游戏. 一.游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷.玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并 ...
最新文章
- 避免单线程单元 (STA) COM 组件
- 黑马程序员——java语言基础——组合,关联,聚合的区别
- R语言-异常数据处理3
- 25. 自定义Git
- 项目实施之预防注入漏洞
- 如何发布google离线地图及二次开发API
- Java中的JUnit单元测试
- 关于Oracle的PARALLEL_MAX_SEVERS参数
- guass白名单的配置命令
- 领扣LintCode问题答案-5. 第k大元素
- 联想计算机如何进bois,联想电脑怎么进入bios 联想进入bios方法【图文】
- python 接入百度地图数据包下载_Python爬虫-利用百度地图API接口爬取数据并保存至MySQL数据库...
- MSP430系列单片机的DMA使用全面认识
- android入门-MMS-短彩信发送/接收流程【图】
- OpenCV学习(二十三) :模板匹配:matchTemplate(),minMaxLoc()
- 新的一年软件测试行业的趋势能够更好?
- 阿里来往转型SNS:聚焦兴趣社交 扎堆可分享至微信
- 对于后台站点的用户活跃度统计 除了记录用户登陆时间进行筛选,还有没有别的方法
- 免费PDF转换为PPT格式的方法
- 方舟服务器金币系统,金币获取汇总与大量获取金币建议
热门文章
- 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。
- “好家园房产中介网后台管理”python项目
- 如何用单片机控制可控硅c语言程序,可控硅的斩波控制的实现--C语言源代码
- flacs 安装教程_002.Nginx安装及启动
- 数据增强——对文件夹中的图片进行读取、数据增强,保存操作
- 三星s4流量显示无服务器,三星s4有什么隐藏功能
- 【数学建模】主成因分析
- 仿微信朋友圈点击评论自动定位到对应位置
- 电脑开机后网络一直转圈,程序也打不开——亲测解决办法
- 自由到底意味着什么(二)叔本华说的第一类自由