范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

C语言开发一篇文章带你还原童年,扫雷游戏完整源码分析

  想必屏幕前的你,肯定玩过windows系统自带的那个游戏,扫雷
  回想当年,我根本没看懂这个游戏是怎么玩的
  比起扫雷,三维弹球对我更有吸引力
  跑题了
  本篇博客就让我们一起来试试,如何通过C语言代码,制作出一个"扫雷游戏se" 1.游戏程序主函数
  在编写这类游戏代码时,我们要用到的主函数基本是一致的
  扫雷游戏的主函数和猜数字游戏的主函数相差很小 void menu()//简易目录 {   printf("*************************** ");   printf("**** 1. play   0. exit***** ");   printf("*************************** "); }  int main() {   int input = 0;   do   {     menu();     printf("请选择:>");     scanf("%d", &input);     switch (input)     {     case 1:       game();//实现游戏的函数       break;     case 0:       printf("退出游戏 ");       break;     default:       printf("输入错误 ");       break;     }   } while (input);   return 0; }​2.游戏实现原理
  想写好一串代码,首先我们要知道扫雷游戏需要通过什么方式来实现
  我们需要一个9x9的棋盘,用于生成我们的雷以及玩家的游玩
  在c语言中当然无法直接产生这样的画面
  但我们可以同符号*或者#来代替网格,用1和0来表示有无雷
  如果我们只生成一个棋盘,那1和0会直接显示出来,达不到隐藏的效果
  所以我们需要用二维数组生成两个棋盘,一个用于存放雷,一个用于玩家的游玩 	char mine[ROWS][COLS];//雷区布置 	char show[ROWS][COLS];//玩家看到的界面
  扫雷游戏我们使用头文件+源文件的形式撰写代码
  这样写代码的优点在于后续我们可以直接通过更改.h文件中的数组,从而更改我们的格子大小
  如: 改成12x12的游玩界面,改变雷区布雷个数等等
  所以我们需要在game.h中定义这些符号 #include  #include  #include   #define ROW 9 #define COL 9  #define ROWS ROW+2 #define COLS COL+2
  同时我们要在主函数的最上面引用这个自己写的头文件
  只要把库函数头文件放入game.h文件,在其他源文件中只需引用game.h
  不需要再次引用之类 #include "game.h"棋盘大小为什么需要11x11?
  你可能注意到了,在生成数组的时候,我使用了ROWS,其值为ROW+2
  我们最终展示的只是9x9的游戏界面,但生成的棋盘其实是11x11的
  这是因为我们需要在mine数组中实现扫描雷区的操作
  玩过扫雷游戏的你肯定知道:在你点击一个格子的时候,如果这个格子不是雷
  它会显示一个数字,告诉你它周围的8个格子中有几颗雷
  如图所示:
  在C语言中,我们可以用函数统计周围8个格子中雷’1’的个数
  但是如果你来到边缘,那就出现问题了
  如果我们想统计边缘的格子周边有几颗雷,就会遇到这种溢出数组的情况
  此时代码会报错
  为了避免这个问题,我们可以在原来9x9的基础上在周围加一圈空白的格子
  也就是代码所示的ROW(行)COL(列)都要+2的情况 #define ROW 9 #define COL 9  #define ROWS ROW+2 #define COLS COL+2游戏过程
  这里简单梳理一下我们的游戏过程
  (1)玩家选择开始游戏
  (2)生成两个棋盘,一个放置雷扫描雷,一个向玩家展示游戏界面
  (3)玩家输入坐标,选择排雷位置
  (4)有雷–>玩家被炸死,游戏结束;无雷–>显示周边有几颗雷,游戏继续
  (5)所有雷被排出,游戏胜利
  3.游戏代码实现
  接下来就进入我们的游戏代码部分 3-1.初始化和打印	//初始化扫雷 	InitBoard(mine, ROWS, COLS, "0"); 	InitBoard(show, ROWS, COLS, "*");  	//打印扫雷 	DisplayBoard(mine, ROW, COL); 	DisplayBoard(show, ROW, COL);
  我们需要初始化两个棋盘,其中雷区初始化为0(0代表无雷),展示区初始化为’*’,用✳代替界面
  同时我们打印这两个棋盘,查看初始化效果
  因为这是我们的自定义函数,所以需要在.h文件中定义函数,在另外一个.c文件中包含函数的实现
  //初始化棋盘 void InitBoard(char board[ROWS][COLS], int rows, int cols, char set); //打印 void DisplayBoard(char board[ROWS][COLS], int row, int col);
  初始化函数和打印函数比较简单,使用for语句达成我们的需求 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; 		} 	} }  void DisplayBoard(char board[ROWS][COLS], int row, int col) { 	int i = 0; 	int j = 0; 	printf("------扫雷游戏------ "); 	//打印列号 	for (i = 0; i <= col; i++) 	{ 		printf("%d ", i); 	} 	printf(" "); 	for (i = 1; i <= row; i++)//只打印中心的99方格 	{ 		printf("%d ", i);//打印行号 		for (j = 1; j <= col; j++)//只打印中心的99方格 		{ 			printf("%c ", board[i][j]); 		} 		printf(" "); 	} 	printf("-------------------- "); }
  需要注意的是我们的最后打印棋盘的时候是从i=1开始的,这样就能避开添加的空白边缘区域,只打印中心的99方格
  同时我们添加了列号和行号,这样能让玩家清除的知道自己应该输入什么坐标
  3-2.布置雷区	//布置雷 	SetMine(mine, ROW, COL);
  同样的,我们需要在game.h中定义这个函数 //布置地雷 void SetMine(char mine[ROWS][COLS], int row, int col);
  在game.c中写入自定义函数的实现 //放置雷 void SetMine(char  mine[ROWS][COLS], int row, int col) {   int count = EASY_COUNT;   while (count)   {     int x = rand() % row + 1;     int y = rand() % col + 1;     if (mine[x][y] =="0")     {       mine[x][y] = "1";       count--;     }   } }​
  这里面出现了一个前面没有提到的变量,EASY_COUNT
  本来这个位置只是个10
  但如果我们想更改布雷个数,那每次都需要更改这里的10,后面的代码中也需要更改,非常麻烦
  所以我们改为使用一个自定义变量,在game.h中定义这个变量的值 #define EASY_COUNT 10
  这个值就代表我们布置雷的个数了 3-3.玩家排查雷//在主函数中引用这个函数 	FindMine(mine,show, ROW, COL);//需要把mine数组中排查的雷放入show  //在game.h中定义这个函数 void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS],int row, int col);
  因为我们需要把mine数组中排查出的雷的个数放入show数组中打印出来
  所以这里我们需要把两个数组都传送过去
  1.输入排查的坐标
  2.检查坐标处是不是雷
  ·是雷 -boom!炸死 -游戏结束
  ·不是雷 -统计坐标周围有几个雷-存储排雷的信息到show数组,游戏继续 void FindMine(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("很遗憾,你被炸死了 ");         DisplayBoard(mine, ROW, COL);         break;       }       else       {         //不是雷的情况下,统计坐标周围有几个雷         int count = get_mine_count(mine, x, y);         show[x][y] = count + "0";       }     }     else     {       printf("坐标错误,请重新输入  ");     }   } }
  注意,这里面我们需要添加一个代码来判断坐标合法性
  我们的棋盘是9x9,玩家要是输入一个(99,99)的坐标,那肯定不在数组中的,是无效的
  我们需要提醒玩家他输错了 ‘0’的作用show[x][y] = count + "0";
  你可能会对这行代码感到疑惑
  为什么要在count后面+上一个‘0’?
  这里就和我们ascii码表有关了
  因为我们初始化数组和布置雷的时候,我们给数组传入的都是1和0这两个符号,并不是数字!
  但是在show数组中我们需要给玩家显示一个数字的字符
  这里面我们提供的是1的字符,并不是1它本身
  而我们在计算周边雷的个数的时候,传回来的是一个具体的数字
  观察表格,你会发现数字和对应的字符中间,都差了48
  而48恰好是字符’0’对应的ASCII码值
  所以我们需要用count加上字符’0’,以此在界面中向玩家展示周边8格有几颗雷 3-4. 系统扫描雷
  如何把玩家选择的格子周边的雷扫描出来呢?
  设玩家的选择的坐标为x和y
  我们只需要把这些坐标全部在二维数组中键入,就能逐个扫描出雷的个数 //统计雷的个数 static int get_mine_count(char mine[ROWS][COLS], int x, int y) {   return mine[x - 1][y - 1] +     mine[x - 1][y] +     mine[x - 1][y + 1] +     mine[x][y - 1] +     mine[x][y + 1] +     mine[x + 1][y - 1] +     mine[x + 1][y] +     mine[x + 1][y + 1] - 8 * "0"; }
  这里因为我们扫描出来的也是‘1’的字符,系统中是字符1的ascii码值49
  所以我们需要减去8个字符‘0’,这样就能得到雷的个数的数字
  (然后在之前的那个函数中接受,count+‘0’,在show数组中显示)
  这个函数是在玩家排查雷的函数之前的
  因为在主函数中我们不需要使用这个自定义函数,所以不需要在game.h中定义
  我们想让它只在game.c中生效,所以用static修饰它
  static的作用
  1.修饰局部变量
  2.修饰全局变量
  3.修饰函数
  上面的代码其实还少了一个东西
  我们需要判断玩家什么时候胜利——雷区的0(无雷方块)全部被玩家找出,玩家就胜利了 	int win = 0; 	while (win< row * col - EASY_COUNT)
  这里我们需要更改的是whlie函数
  其中 row * col - EASY_COUNT 指方格总数减去雷的个数,得到的是无雷方块的个数
  玩家每成功排除一个无雷方块,win就会加一个数字 	else 	{ 		//不是雷的情况下,统计坐标周围有几个雷 		int count = get_mine_count(mine, x, y); 		show[x][y] = count + "0"; 		//显示排查出来的信息 		DisplayBoard(show, ROW, COL);         win++; 	}
  当win达到无雷方块个数的时候,whlie循环就会停止
  随后我们判断玩家是否胜利,如果胜利,就打印棋盘,让玩家知道雷的位置 	if (win == row * col - EASY_COUNT) 	{ 		printf("恭喜你,游戏胜利! "); 		DisplayBoard(mine, ROW, COL); 	}
  这里必须要判断,因为你失败了也是会跳出循环的!
  到此,我们的扫雷代码就是完成了 4.查看结果
  这里我作弊,将雷的个数设置为80并打印出布置雷之后的棋盘
  输入最后一个雷的位置,系统提示我们游戏胜利
  输入雷的坐标后,也会提示你被炸死了
  到这里我们可以确认代码是编写成功了!
  对啦对啦! 另外的话 为了帮助大家,轻松,高效学习C语言/C++,我给大家分享我收集的资源,从最零基础开始的教程到C语言项目案例, 帮助大家在学习C语言的道路上披荆斩棘!可以来我粉丝群领取哦~
  编程学习书籍分享:
  编程学习视频分享:
  整理分享(多年学习的源码、项目实战视频、项目笔记,基础入门教程) 最重要的是你可以在群里面交流提问编程问题哦!
  对于C/C++感兴趣可以关注小编在后台私信我:【编程交流】一起来学习哦!可以领取一些C/C++的项目学习视频资料哦!已经设置好了关键词自动回复,自动领取就好了!

本期欣赏龙头股汉王科技的主升段朋友们好,我是看准时机时推仓位的首席韭菜,本期分享龙头股汉王科技,喜欢龙头股的的朋友们欢迎关注点赞转发。春节期间海外公司OPENAI发布chatGPT,短时间内活跃用户高达1亿。直2023年工商银行存款利率出台利息高起存金额自由,5年期更高!根据相关报道的数据统计,得出2022年全国人民币存款增加26万亿元。可见,疫情时代,大家的存钱意识可谓是飞速增长。在疫情好转的今天,大家手里的资金又有什么新的打算呢?今天来给大家分热点个股剖析(18)再论300114中航电测,为何如此疯狂300114中航电测2023年2月9日日K线图300114中航电测,截止今天为止,已经连续6个一字涨停,相当疯狂!300114中航电测,为何如此疯狂?!我们不妨先来看看300114wxPython查找替换对话框FindReplaceDialog实战wxPython系列025在进行文本处理的GUI程序中,常常需要对文本中的一些文字进行查找和(或)替换操作,在这种情况下,就需要一个具有查找替换功能的对话框来交互完成需要的功能摊牌了?切断所有供应成闹剧,美媒压死美企的最后一根稻草众所周知,在过去几年里,华为等中企被美盯上,遭遇了多次特殊照顾。除了5G领域外,老美利用其芯片技术优势,对中企进行了全面封锁。要知道,芯片是科技领域的大脑中枢,无芯可用无异于将中企注册制推行IPO红绿灯,消费投融资何去何从?开年第二篇,聊聊最近的炸街新闻。这两天,金融市场放出了三条消息一是全面实行注册制二是主板IPO行业红绿灯规则三是美联储加息。于是全体投资人的朋友圈开始割裂,人民币基金投资人都在发证十年一觉手机梦大盘回落3亿内,中国市场没王者图片来源视觉中国文财经故事荟,作者卡尔,编辑天南2月5日,苹果iPhone14系列公布降价计划,全系下调700元左右,降价范围几乎覆盖所有授权门店。苹果开年的大幅降价,拉开了202A股明天(2月8日)大盘走势预测分析是长阳突破,还是大跳水在经过三天的调整之后,今天的A股大盘艰难震荡反弹,最后红盘报收,题材股十分活跃,个股上涨家数大幅增加,赚钱效应十分明显,对中小投资者比较友好。市场出现了两种截然不同的观点长阳突破和人保财险一份禁酒令缘何让白酒股大跌?白酒股民太难了,隔三岔五就得被血洗。昨日股市开盘后,白酒股集体走低,五粮液泸州老窖跌幅一度超过4。业内分析,白酒板块股价突然下跌,源于中国人保财险的一份禁酒令。在这份文件当中,工作1000亿基金群!西安意欲何为?文游石大招来了。最近,西安出台方案,提出建立总规模不低于1000亿元的重点产业链基金集群。这是2023年八个方面重点任务分工推进方案(下简称方案)里,第一方面着力壮大支柱产业和新兴初春穿搭,你和潮男的距离,就缺了一件让你一眼惊艳的夹克外套天南地北大拜年春季的到来,也意味着一年之初万物复苏的季节来临,要说春季穿什么,夹克外套一定不能错过!时尚夹克外套经典百搭又耐看,设计简约不失质感,升级你的高级通勤,实穿又帅气!看似
刘艳霞做实实在在的事为居民耕耘幸福今年1月,民政部印发关于表彰全国先进基层群众性自治组织全国优秀城乡社区工作者的决定,本市4个基层群众性自治组织,12名城乡社区工作者获表彰。今天,我们一起走进全国优秀城乡社区工作者安徽女老虎尚军初中文凭却官至副厅,和两个副省长关系混乱腐败不分男女年龄职位。当一个人一旦心存贪婪,就会慢慢踏入腐败的深渊,永不回头这句话让我们想起了安徽省卫生厅副厅长尚军,她在官场上一路快速升迁,但当她身居高位以后,却了个人的私利,贪9年贪污1465万,两面人市长狱中痛哭流涕落马之后的忏悔,对于两面人又有几分真近日廉洁四川发布了四川省巴中市原副市长张尚华的忏悔书节选!张尚华在忏悔书中写道也许在别人看来,一切都来得那么突然,事发偶然。四年前我从广元市旺苍你认为用3000元买一部碎屏的iPhoneX,是否划算?我是科技数码随时答,很高兴能回答这个问题3000元买一部碎屏的iPhoneX,真的划算吗?很多人觉得不值得,又有很多人觉得值得。iPhoneX是苹果去年的产品,目前的价格在6900有些女人为什么喜欢穿高跟鞋?高跟鞋是优雅贵气的代表,女生穿上高跟鞋不仅会显出自己的气质,同时身高的增加也会更加凸显身材,另外,高跟鞋还可以搭配很多衣服,这么好的东西女生又怎能不喜欢呢!高跟鞋可以增加女性的身高女人过了五十岁,没有社保没有存款,以后是不是很凄惨?感谢邀请,更感谢楼主的提问。楼主你好,女人过了50岁没有社保没有存款,以后是不是很凄惨?我们就从社保角度来分析这个问题,女性过了50岁的法定退休年龄了,即便有些女性是55岁退休,但在商丘年收入10万的处在什么水平。有多穷?我给大家普及一下,年收入10万,相当于月薪8333元。在商丘,上班族来说。工作1年以下的新手,每个月撑死3000元,没有五险一金。工作13年的朋友,每个月工资50007000。而且青岛开展旅游品质提升攻坚行动经济日报青岛3月26日讯(记者刘成)近日,山东青岛西海岸新区推出2023悠游季活动,按照绽放4月多彩5月沐风6月等主题策划了百场活动,邀请市民游客前来逛会展迎节庆。为全面提升旅游品发病人数翻倍!这波甲流为何如此凶猛?最近,我国的甲流疫情呈现出爆发式增长的趋势,病例数量大幅度上涨,引起了人们的担忧。为什么这波甲流如此凶猛?首先,甲流病毒的变异是甲流爆发的一个主要原因。甲流病毒可以持续发生变异并产往届获奖得主对2023年全国牡丹赛花会有何期许?大众网海报新闻记者王奉国菏泽报道为展示新的一年牡丹在观赏领域取得的最新成果,进一步提升牡丹盆栽的观赏价值及拓宽牡丹盆栽的应用途径,促进牡丹产业健康与快速发展。4月8日,2023世界我福建姑娘,26岁嫁美国老公,吵架后竟要求一起祷告,不要隔夜仇这是我们讲述的第1790位真人故事我叫刘伊婷瑞儿开开,1989年出生于福建宁德。我是在美国读的研究生,刚毕业十天,我就结婚了。我的老公是地地道道的美国人,但他偏要跟我家的姓,所以叫