扫雷小游戏——简单易懂
文章目录
- 前言
- 显示与雷区设立
- 初始化显示棋盘和雷区棋盘
- 棋盘显示函数
- 雷区的设立
- 扫雷统计功能
- 防第一次炸死功能
- 平铺函数
- 标记功能
- 判断胜负统计
- 主体函数逻辑
前言
在初期版本扫雷的基础上上添加了展开,标记,防首次炸死功能;
效果展示:
显示与雷区设立
扫雷首先需要两个大小相等的棋盘,一个如图1用来向外界展示,一个如图2用来埋雷。
初始化显示棋盘和雷区棋盘
棋盘有行和列,于是乎用二维数组来进行数据统计
char board[ROW][LINE];memset(board, '*', sizeof(board));//显示的没点开之前为*char mineboard[ROW][LINE];memset(mineboard, '0', sizeof(board));//雷的统计初始化为0Mineset(mineboard);//设置雷区
棋盘显示函数
将显示棋盘进行初始化为 * 后,用显示函数将其显示出来;
static void Showboard(char board[][LINE], int row, int line) //棋盘显示
{printf(" ");for (int i = 0; i <row-2; i++){printf(" %2d |", i+1);}printf("\n------------------------------------------------------\n");for (int i = 1; i < row - 1; i++){printf(" %2d|", i);for (int j = 1; j < line - 1; j++){printf(" %2c |", board[i][j]);}printf("\n------------------------------------------------------\n");}
}
显示效果图如下
雷区的设立
很显然,雷区棋盘需与显示棋盘同等大小,同时在其中分布一定数目的雷,定义一个宏MINE,将其赋值给count,每成功设立一颗雷,count就减一,设定的宏的大小就是雷的数目;
static void Mineset(char mineboard[][LINE])//随机分布雷
{int x = 0;int y = 0;int count = MINE;while (count){x = (rand() % (ROW - 2)) + 1;y = (rand() % (LINE - 2)) + 1;if (mineboard[x][y] == '0'){mineboard[x][y] = '1';count--;}}
}
扫雷统计功能
上面提到两个棋盘,但是是独立分开的,那么是怎么联系在一起的呢?这个统计功能就是将两个棋盘联系在一起,当输入扫雷坐标后,通过雷区棋盘判定是否有雷,再将这个信息赋值给显示棋盘;
static char Detect(char mineboard[][LINE], int x, int y)//进行扫雷时,如果不是雷,则显示周围雷数
{if (mineboard[x][y] == '0'){return mineboard[x][y - 1] + mineboard[x][y + 1] \+ mineboard[x - 1][y - 1] + mineboard[x - 1][y] \+ mineboard[x - 1][y + 1] + mineboard[x + 1][y - 1]\+ mineboard[x + 1][y] + mineboard[x + 1][y + 1]-7*'0';}if (mineboard[x][y] =='1'){return OVER;}
}
防第一次炸死功能
设定一个函数,当我们进行第一次输入坐标的时候,如果判定是雷,就将这颗雷挪走,再随机设置一颗雷;
static void Firstmine(char mineboard[][LINE], int x, int y)//避免第一次被炸死
{if (mineboard[x][y] == '1'){mineboard[x][y] = '0';}while (1){x = (rand() % (ROW - 2)) + 1;y = (rand() % (LINE - 2)) + 1;if (mineboard[x][y] == '0'){mineboard[x][y] = '1';break;}}
}
平铺函数
如下图,黑色是坐标点,该函数统计的是分别以黄色为中心点统计其周围雷的数目;
static void Openmine(char board[][LINE], char mineboard[][LINE], int x, int y)//平铺展开函数
{board[x][y - 1] = Detect(mineboard,x,y-1);board[x][y + 1] = Detect(mineboard, x, y + 1);board[x - 1][y - 1] = Detect(mineboard, x-1, y - 1); board[x - 1][y] = Detect(mineboard, x-1, y ); board[x - 1][y + 1] = Detect(mineboard, x-1, y + 1); board[x + 1][y - 1] = Detect(mineboard, x+1, y - 1); board[x + 1][y] = Detect(mineboard, x+1, y ); board[x + 1][y + 1] = Detect(mineboard, x + 1, y + 1);
}
标记功能
标记功能是每进行一次输入就提示一次是否需要进行标记,标记的地方会显示为‘#’,如图所示
static void Lable(char board[][LINE])//标记坐标
{int x = 0;int y = 0;int quit = 0;int select = 0;while (!quit){printf("请输入是否需要进行标记#1.yes#2.no\n");scanf("%d", &select);switch (select){case 1:printf("请输入你的标记坐标\n");scanf("%d %d", &x, &y);board[x][y] = '#';system("cls");Showboard(board, ROW, LINE);break;case 2:quit = 1;break;default:printf("输入有误,请从新输入\n");}}}
判断胜负统计
通过统计显示棋盘剩余的空白处和标记数与设定的雷区数目进行比较,如果想等则玩家胜利;
static int Blank(char board[][LINE], int row, int line)//判断棋盘剩余的空白处
{int count = 0;for (int i = 1; i < row - 1; i++){for (int j = 1; j < line - 1; j++){if (board[i][j] == '*' || board[i][j] == '#'){count++;}}}return count;
}
主体函数逻辑
将上述函数进行整体连接;
void Game()
{srand((unsigned)time(NULL));char board[ROW][LINE];memset(board, '*', sizeof(board));//显示的没点开之前为*char mineboard[ROW][LINE];memset(mineboard, '0', sizeof(board));//雷的统计初始化为0Mineset(mineboard);//设置雷区int n = 1;//防炸死次数;while (1) //{system("cls");Showboard(board, ROW, LINE);//展示棋盘while (1)//判断是否需要进行标记;{Lable(board);break;}int quit = 0;int x = 0;int y = 0;while (!quit)//循环输入坐标扫雷{printf("请输入你的坐标\n");scanf("%d %d", &x, &y);if (x<0 || x>ROW - 2 || y<0 || y>LINE - 2){printf("输入越界,请从新输入\n");continue;}if (board[x][y] != '*' && board[x][y] != '#'){printf("此处已经排除,请从新输入\n");continue;}quit = 1;}while (n)//排除第一次被炸死{Firstmine(mineboard, x, y);n--;break;}int result = Detect(mineboard, x, y);//判断是否被炸死if (result == OVER)//炸死了{system("cls");board[x][y] = OVER;Showboard(board, ROW, LINE);printf("很遗憾,你被炸死了\n");printf("雷区分布如下\n");Showboard(mineboard, ROW, LINE);break;}else//没炸死{if (result == '0')//如果该扫雷处周围8个都是安全的,就将周围8个的周围8个的雷数显示出来;{Openmine(board, mineboard, x, y);}board[x][y] = result;}int Win = Blank(board, ROW, LINE);if (Win == MINE){printf("恭喜你,你赢了\n");break;}}
}
扫雷小游戏——简单易懂相关推荐
- 【扫雷】小游戏------简单易懂版
1.开始前的思路 首先,为了防止游戏逻辑过于混乱,我们分为三部分写,game.h,用来编写扫雷游戏中的头文件,以及函数声明.test.c,用来概括展现游戏实现的过程.game.c,展开来写实现游戏的具 ...
- C语言简单的键盘玩扫雷小游戏(完结)
1:这次我们会将前面的代码进行整合,和整理,最终使我们的程序可以有效的运行起来. [1]初始化函数. void GameInit() { //随机数种子 srand((unsigned ...
- JAVA简单实现扫雷小游戏
JAVA简单实现扫雷小游戏 这两天学校外面来人教java基础,学习一下,自己试着做了一个扫雷小游戏,记录一下子学习过程.(我觉得自己不是很懂类和对象,基础没怎么看),敲出来的代码结构混乱,希望路过的大 ...
- VB6实现简单的扫雷小游戏
#VB实现简单的扫雷小游戏 扫雷这个小游戏可谓是简单又好玩,百万不腻,不知道有没有小伙伴跟博主一样脑热的曾经扫过一整个屏幕的雷... 源码可以在作者的资源页下载 https://download.cs ...
- 用C语言实现一个简单的扫雷小游戏(附全代码及教程)
本文实例为大家分享了C语言实现扫雷游戏的具体代码,供大家参考,具体内容如下: 首先,创建一个text.c文件: 编写主函数: int main() {test();return 0; } 定义test ...
- 扫雷html5简单初级,纯原生JS用面向对象class方法实现简易扫雷小游戏
Demo介绍 纯原生js 实现 且用ES6语法class写的扫雷小游戏:布局为10*10的网格,随机生成10-20个雷. 左键点击扫雷.右键标记该地方有雷.该demo下载下来复制到html文件中直接可 ...
- 用C语言实现扫雷小游戏(附上思路+项目展示+源代码)
文章目录 前言 一.扫雷小游戏整体思路讲解. 二.game.c各游戏功能函数的讲解 1.InitBoard 初始化数组函数讲解 2.DisplayBoard 打印格子函数讲解 3.Setmine 电脑 ...
- 如何开发一个扫雷小游戏?
如何用C#开发一个扫雷小游戏? 十分自豪的说,计算机编程就是变魔术,每一个coder都是一个魔术师. 初学C#的时候,我相信很多人都和我一样,学会了基本语法,掌握了基本的数据结构,也见过了不少微软提供 ...
- rust游戏亮度怎么调亮点_之前用Rust写的扫雷小游戏
这次来分享一下之前用Rust写的一个扫雷小游戏,目前能在Windows下运行.Github仓库: https://github.com/crlf0710/charlesmine-rsgithub.c ...
- C语言实现扫雷小游戏 纯小白 非黑窗口
C语言实现一个普通的扫雷小游戏 纯小白所编(含代码非黑窗口!) 扫雷 主要功能 1.创建一个图形界面 2.了解扫雷游戏的原理 3.随机生成雷的位置 4.为整个数组加密,并在雷周围的位置加一 5.导入图 ...
最新文章
- 在拓扑图上做标准ACL和扩展ACL(期末考试)
- 小程序~WeUI下载使用
- Socket 异步通信编程
- TF之RNN:TF的RNN中的常用的两种定义scope的方式get_variable和Variable
- Python :给类或者类的对象添加打印内容 def __repr__(self)
- Hi3516A开发--接触
- MySQL Cookbook 学习笔记-02
- sentos7查看网络配置_论各厂商设备之基础常用配置命令集
- bcc挖矿用什么_IPFS挖矿与传统传统挖矿的区别
- hadoop2.9.2安装hadoop_pid_dir_Hadoop3.2 +Spark3.0全分布式安装
- 熊出没之伐木机器人_熊出没:最强大的4大机器人登场,熊大熊二“苦不堪言”...
- 利用canvas绘制表盘
- 计算机的负面影响英语作文,沉迷于电脑游戏的危害
- linux csr蓝牙驱动,佳能 CSR BlueCore Bluetooth 驱动程序下载-更新佳能软件(蓝牙)
- chromecast投屏_谷歌Chromecast与安卓Miracast投屏技术
- POJ1555-Polynomial Showdown
- PS制作黑暗墙面上的漂亮霓虹文字
- linux gprs 拨号上网,linux下用wvdial实现gprs拨号上网
- 【新技研】高通全新骁龙Krait 300/400处理器架构浅析
- BIOS密码清除方法--unlock6的使用.
热门文章
- 网络广告计费方式CPM、CPA、CPS、CPT、CPC及比较分析
- Android 实现远程控制(类似QQ的远程协助)
- QQ远程协助若干问题
- 中心极限定理 - 正态分布
- [含lw+源码等]微信小程序在线考试管理系统+后台管理系统[包运行成功]
- 安卓百度地图,隐藏左下角Logo
- 夜深人静写算法【栈】
- c语言表达ch是大写英文字母,如何用C语言输出26个英文字母和其ascii码的对照表...
- python实现多表合并_python实现excel多表合并的方法
- java调用加密机实例_Enigma Java模拟实现恩尼格玛密码机加密解密过程 Develop 238万源代码下载- www.pudn.com...