游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

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

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

广汽三菱欧蓝德2。4l四驱精英版落地要多少钱?这个车怎么样?感谢邀请,欢迎关注《孟子说车》!三菱欧蓝德这款车的定位是一台中型suv,有五座车型和七座车型可选,目前的市场中的优惠大概是在16000元左右。欧蓝德这款车在国内的知名度还……浓眉哥的湖人,还是总冠军的湖人对阵开拓者128分,对阵雄鹿133分,这是两连胜的湖人连续两场常规时间取得的分数。助攻分别为28次,32次,比赛节奏快而流畅,全队各种突破空切扣篮配合,突破分球三分投篮看着赏心……索尼电视2022年K型提升了哪些?值得等吗?还是入今年的J型索尼电视新品来临:终于采用MiniLED面板,XR芯片仍是内核1月5日上午消息,索尼在线上召开了全新电视新品发布会,公布了2022年BRAVIAXR系列电视新品,包括了画……有一些汽车评测文章究竟可以胡说到什么程度?询问五菱荣光和宾利添越到底该怎么选,非常纠结,那么今天我们就来对比一下这两款车,相信大家看完之后一定会有答案。外观五菱荣光的外观方中有圆,非常符合传统文化中的方圆之……汽车里程累计十万公里,对汽车来说意味着什么?跑了10万公里的汽车,意味着什么呢?大家来听听汽车维修师傅们是怎么说!随着人均生活水平的不断提高,汽车已经成为我们出行不可或缺的交通工具了,身边有车的朋友真的是越来越多了……通用9AT现在稳定吗?19年5月提车君威28t,现在刚跑了5万公里,除了低速有点顿挫,其他没觉得有什么,跑高速巨巨巨省油,120巡航的时候转速仅1800左右,高速油耗可以做到5。5,这款变速箱只要不……电动车越来越多,我的燃油车也不想开反而想卖了,想法对吗?燃油车和电动车各有其长处与缺点,燃油车远距离优势明显,但,市区内不方便不实惠;电动车市区内优势明显,但,长距离行驶是最大缺点。应根据自己的需要来选择。燃油汽车想要换电动汽……30万的轿车为什么还不如4到5万的面包车耐用呢?问题描述失实现象值得分析还认为几万元的面包车要比中高端汽车耐用吗?曾经有很多汽车爱好者对这种现象感觉不解,似乎没有看到过面包车频繁出入修理厂,似乎面包车满载一车货物……老股民教你识别庄家多头陷阱,剖析主力,跟庄吃肉而非挨套在市场少有的能赚钱股民中,主要是高手和专业人士。令人清醒的问题是,期货和股市都有一个众所周知的现象:一般交易者对市场的正确判断明显高于高手和专业人士,这也形成了交易悖论。……买手机不当大冤种,真正值得买的3款红米手机,最低仅需1058买手机不当大冤种,真正值得买的3款红米手机,最低仅需1058元第一款:RedmiNote10Pro120Hz六档变速刷新率LCD屏幕,兼顾流畅与续航;67W有线快充,42分钟充……买大众朗逸的人是因为品质好,还是跟风才买的?你怎么看?大众朗逸卖得好,也算是人尽皆知的事实了,朗逸的品质不错、但绝对排不上一顶一,不过消费者就是喜欢买它;可以说有部分朗逸用户是跟风、是随大流,不过买车时、如果没有具体的目标车型,那……开空调动力疲软,主要是马力小还是扭矩小,还是功率小?小排量车型开空调后会感觉到汽车动力下降,这是因为压缩机工作时占用发动机一部分动力造成的。而马力、功率只是单位不同而已,他们之间是可以互相换算的。例如1马力(匹)735w、0。7……
吃饭有这4个习惯的人,难怪你的胃不好,有的赶紧改了懂得保养胃部的人会从饮食入手,通过正确饮食方法坚持可以让消化压力减轻,同时保护胃粘膜。如果持续饮食不恰当,胃黏膜受损,出现炎症或者溃疡,久而久之该器官功能降低,会有食欲减退、反……为什么老司机开车时候都喜欢空挡滑行?在一些人看来空档滑行就像洪水猛兽,你一提空档滑行他就问你还要不要命了。其实经常开手动挡车的老司机是最能体会到空档滑行的好处的。今天咱们就聊聊老司机为什么喜欢空档滑行。1、省油……预算20万到30万,选哪款SUV比较好?2030万预算购买SUV应该是预算比较充足的了,除了豪华品牌的一些SUV以外,合资品牌可以说是随便选了,如果考虑品牌、产品质量的话小编在这里推荐以下这几款车型。上汽大众双……奇瑞说是自主品牌出口第一,上汽也说出口是第一,真相如何?奇瑞是自主品牌出口第一,上汽估计包括大众等合资的车型,所以综合第一!但是上汽出口的只是别人的东西,他如果来算出口量,有点不要脸!支持奇瑞都是民族品牌,说自己第一就第一吧,……攀比让汽车块头越来越大,国家应不应该进行限制?汽车的块头越来越大是因为攀比吗?汽车的尺寸越来越大是否是个不健康的现象,是否应当模仿欧洲或日本推广小微型车?很多环保人士都提过这个问题,其中不乏精欧日的一些公知;但……奥迪A4L和雷克萨斯ES该怎么选?键盘党和喷子们就不要喷了,这两车我都开过,给真正的买家一些中肯的建议:一,动力,这方面A4确实比es好,不要说什么300h,实际驾驶体验也就那样了,雷车的动力的核心就是平……怎么选购牛仔裤说起牛仔裤,相信大家都不陌生,说它是衣橱里永远不能淘汰的单品,一点都不为过,只要选对适合自己身材的牛仔裤,T恤、衬衫、卫衣、针织衫不管你怎么搭配其他单品都不会出错。目前大……老款四缸奇骏将复产,定名奇骏荣耀,这下销量能起来吗?秽土转生的老款奇骏会有怎样的命运?日产汽车最终还是选择了复产老款奇骏,某个日本动画片里的秽土转生技能貌似就是这么玩的,新手战斗力太弱就想着复活老师傅,殊不知复活之后的战斗……老年人冬天关节疼痛怎么办?试试这个方子,让您关节不痛身体好大家好,我是朱大夫。入冬以后,很多人都会感觉自己的关节出现了疼痛的情况。尤其是老人,这种感觉更加明显。下面从中医角度,讲一讲关节发凉是什么原因?关节炎疼痛,中医上叫痹症,……买新车厂家必须送的东西有哪些?给大家普及一下买车的时候那些东西是厂家必须送的,也就是随车必须要带的,轮胎扳手,千斤顶,螺丝刀,反光马甲19年以后买的车都要送反光马甲,保养手册,车辆使用手册,三包手册,有些和……国产车哪些品牌值得买?哈弗还是长安?现在的国产车不能跟早些年同日而语了,什么国产车不能买,全TM扯淡。早些年,您说国产车,技术稍微落后,我们用配置来凑,凑合说的过去,但是现在,天已经变了,国产车的技术是稳上……如果特斯拉没来中国,哪个新能源汽车品牌会成为万亿市值的巨头?国内的新能源汽车市场就像一潭静水,特斯拉就像一条鲶鱼,鲶鱼一来让安稳的鱼活跃起来了。如果特斯拉没来中国,国内的新能源品牌可能不会发展这么快,但是,新能源的趋势是无法改变的,新能……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网