首页 > 其他分享 >如何用C语言做一个扫雷游戏(包含展开优化)

如何用C语言做一个扫雷游戏(包含展开优化)

时间:2023-06-03 21:31:52浏览次数:38  
标签:游戏 创建 打印 C语言 排查 扫雷 坐标 棋盘 我们

老一套做一个简易的游戏菜单,并且完善他的功能,选一开始游戏,选0退出游戏,超出就重选。

如何用C语言做一个扫雷游戏(包含展开优化)_随机数

如何用C语言做一个扫雷游戏(包含展开优化)_数据_02

目录做完开始实现游戏内容,先做一个棋盘来放我们的雷和我们排查雷的情况,但是在一个棋盘上既要放雷,又要来存放我们排查的雷,完成起来就很乱,那么我们是不是就可以做两个棋盘,一个来专门放雷,一个专门来放我们排查的雷,这样写起来即简单又方便观察,创建两个字符数组,mine就是专门放布置的雷,show就专门来放排查的雷,我们把mine里头全放‘0’在show里头全放‘*’,

如何用C语言做一个扫雷游戏(包含展开优化)_头文件_03

虽然我们要创建的棋盘是9*9的棋盘,但是扫雷游戏规则是:根据一个坐标的周围八个坐标来判断雷,那么问题来了,如果这个坐标从最边缘展开,你就只有5个坐标了,剩下的三个坐标就是非法的,就会越界,所以我们要避免越界,那我们多创建一行一列不就好了。(这里我是在头文件里定义的,不建议在一个文件里写这个游戏,多用多文件写代码,短的就不需要了)

如何用C语言做一个扫雷游戏(包含展开优化)_随机数_04

初始化棋盘的函数创建好了,下一步实现这个函数。i 就是行 j 就是列这个棋盘就是 i 行 j 列大又因为我们创建的是两个棋盘,那么为什么不让程序自己去根据‘0’和‘*’,来创建棋盘呢?我们只需要把‘0’和‘*’传给他就行了,让他用形参set来判断

如何用C语言做一个扫雷游戏(包含展开优化)_数据_05

棋盘创建好了,下一步让我们把棋盘打出来看看效果。用DisplayBoard来打印棋盘。给它传mine,就是雷棋盘,传show就是排查雷棋盘。创建好了,看完记得把雷的棋盘注释了哦,这个是不能给玩家看的。

如何用C语言做一个扫雷游戏(包含展开优化)_数据_06

下一步实现打印棋盘,创建变量 i 和 j 分别代表行和列,虽然我们创建的是1010的棋盘,但是玩的时候只是在99的棋盘上,所以创建的是1~9行,1~9列。虽然这样棋盘是打印好了,但是玩起来太困难,你没办法一眼看出来这是几行几列的坐标,所以我们在打印行的时候在最前面打印一下是第几行,同理在棋盘的上面去打印他的列,记得换行和加分割线,不然达不到预期效果。

如何用C语言做一个扫雷游戏(包含展开优化)_头文件_07

棋盘打印好了该布置雷了,创建一个雷的函数来实现布置雷,同理可用打印出来看看有没有布置上雷,看完注释,不然就作弊了

如何用C语言做一个扫雷游戏(包含展开优化)_随机数_08

布置雷首先两个要求,一、你想布置几个可以控制,二、这个雷得是随机布置的,所以我们创建一个循环,假设我们有十个雷,我们布置一个减一个,直到布置完了,雷变成了0,    0为假循环就停止了,我们用rand()函数生成随机数,%上一个row就是0~8的范围但是我们需要的是1~9,所以+1就能把范围控制在1~9.

如何用C语言做一个扫雷游戏(包含展开优化)_数据_09

如何用C语言做一个扫雷游戏(包含展开优化)_随机数_10

雷布置好了,该去排查雷了。一样先创建一个排查雷的函数下面去实现它,排查的时候我们要用到雷的位置信息,所以雷的数据也要传给它哦。

如何用C语言做一个扫雷游戏(包含展开优化)_数据_11

排查雷的第一步,你要提示一下玩家可以输入坐标了,然后创建变量x,y表示横坐标和纵坐标并存储,创建完了我们要判断一下,这个坐标是不是在棋盘内的,如果不是就说明你输入的坐标越界了,提醒他坐标越界,重新输入因为需要重新输入那肯定是循环。如果坐标在棋盘内先判断你踩到雷没,毕竟这是游戏开始的第一步,你都凉凉了后面的东西也就没用了,如果我们的输入坐标里头是我们随机生成的雷,那么恭喜你开启下一把,输了也得输得明白不是,输了把雷棋盘打印出来给他看一下,那要是没凉凉,就得告诉一下人家周围有没有雷,有几个雷,这里我们创建一个GetMineCount函数来实现,现在我又觉得一次只能排查一个坐标太累了,那么我们可不可以优化一下,如果我们选的坐标周围八个坐标都没有雷,是不是可以都给我消除了,又可以省下很多时间,这里我们创建unfold函数来实现,你输入好坐标了得看的到吧,所以要把排查棋盘打印一下,最后你玩了这么久得有个获胜标准吧,我们这里用win来判断你有没有获胜,如果win小于棋盘的坐标数量减雷的个数,那么说明还有空位需要继续游戏,如果win等于棋盘的坐标数量减去雷的个数,就说明除了雷没有空位了,那么就是雷排完了,恭喜你获胜。

如何用C语言做一个扫雷游戏(包含展开优化)_数据_12

下面就是该实现一下显示雷的个数这个函数了。假设x,y就是你选择的坐标,那么他周围的八个坐标就是如图所示,那么判断周围有几个雷就很简单了,前面我们将雷设置为‘1’不是雷为‘0’,那么我们就先不管他是个字符,我们把他想象成数字1和数字0,那不就是普通的加法了嘛,因为每个字符都得减个字符零才能转换成数字,所以我们把周围的八个字符一加,减去8*‘0’就得出了雷的数量。

如何用C语言做一个扫雷游戏(包含展开优化)_随机数_13

如何用C语言做一个扫雷游戏(包含展开优化)_头文件_14

最后还剩个展开函数没有实现,这里我们用递归来完成,为了简便我们把GetMineCount函数传给input,用input来接收它的数据取地址win然后win++,如果input的值等于0,说明周围没有雷,我们给0赋值为空格(看着好看),向周围的八个坐标展开,这八个坐标要大于0小于我们的行和列。如果周围有雷,input不等于0,我们就把雷的数量转换成字符显示在show数组上。

如何用C语言做一个扫雷游戏(包含展开优化)_头文件_15

最后附上完整代码分别是游戏框架,游戏内容,头文件(小白出没,大佬见谅)

如何用C语言做一个扫雷游戏(包含展开优化)_随机数_16

如何用C语言做一个扫雷游戏(包含展开优化)_数据_17

如何用C语言做一个扫雷游戏(包含展开优化)_随机数_18

标签:游戏,创建,打印,C语言,排查,扫雷,坐标,棋盘,我们
From: https://blog.51cto.com/u_16103543/6408795

相关文章

  • P1277 拼字游戏(未完)
    一道毒瘤题首先是最朴素的dfs,没有任何优化#include<bits/stdc++.h>usingnamespacestd;inta[5],b[5],c1,c2;intp[5][5];boolvis;voiddfs(intx,inty){ if(vis)return; if(y==1&&a[x-1]!=0)return; if(x==4&&b[y-1]!=0)return; if(x==4&&am......
  • c语言的几个陷阱和代码例子
    数组越界:intarr[3]={1,2,3};arr[3]=4;//数组越界for(inti=0;i<=3;i++){printf("%d\n",arr[i]);//数组越界}在上述代码中,由于数组下标从0开始,arr[3]越界访问了数组最后一个元素的位置,此时程序可能会崩溃或者产生其他不确定的结果;另外在循环中因......
  • P1000 超级玛丽游戏
    超级玛丽游戏题目背景本题是洛谷的试机题目,可以帮助了解洛谷的使用。建议完成本题目后继续尝试P1001、P1008。另外强烈推荐新用户必读贴题目描述超级玛丽是一个非常经典的游戏。请你用字符画的形式输出超级玛丽中的一个场景。***********......
  • 三日一练-C语言百题(009)
    常见的页面置换算法其他的参考:页面置换算法——C/C++实现https://www.jianshu.com/p/18285ecffbfbhttps://www.cnblogs.com/lustar/p/7875705.html#include<stdio.h>#include<stdlib.h>#definePN12//页面访问列长度#defineFN3//分配给进程的内存块数in......
  • pygame-03游戏界面等环境配置
    1-示例代码importmath,randomimportpygamefrompygameimportmixer#游戏初始化pygame.init()#窗口设置screen=pygame.display.set_mode((800,600))#背景设置background=pygame.image.load('background.png')#背景音乐,-1表示循环播放mixer.music.load(......
  • C语言-运算符
    算术运算符 算术运算符专门用于算术运算,主要有下面几种。+:正值运算符(一元运算符)-:负值运算符(一元运算符)+:加法运算符(二元运算符)-:减法运算符(二元运算符)*:乘法运算符/:除法运算符%:余值运算符(1)+,-+和-既可以作为一元运算符,也可以作为二元运算符。所谓“一元运算符”,指的是只需要一个运算数......
  • 《Just For Fun》:学习即游戏
    《JustForFun》:学习即游戏最近读完了Linus的自传《JustForFun》,一直想写点东西,但始终苦于工作繁忙,无暇思考该从何写起。技术上自然不用废话,Linux的存在对于业界的贡献天下皆知,写什么都是画蛇添足。仔细回想读这本书的过程,我始终在意的是作者的思想,他对于技术生活的想法,我......
  • Unreal5 第三人称射击游戏 角色基础制作2
    接上一篇Unreal5第三人称射击游戏角色基础制作1角色蹲伏效果上面是需要的操作映射,蹲伏实现,首先要开启相应功能,你需要在角色移动组件上面开启可蹲伏蹲伏还有一些其它设置,比如蹲下角色高度,蹲下以后行走的速度中英文截图这里我设置的移动速度,蹲伏时可以走出平台,就为了防止在物体......
  • 链式二叉树的实现(c语言)
    本篇博客主要写了如何完成二叉树的前,中,后序遍历,查找特定值的节点,计算最大深度等。都是对二叉树的一些基本操作。二叉树基本操作头文件typedefcharBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinaryTreeNode*left; structBinaryTreeNode*right;......
  • C语言-变量
    变量的作用域作用域(scope)指的是变量生效的范围。C语言的变量作用域主要有两种:文件作用域(filescope)和块作用域(blockscope)。文件作用域(filescope)指的是,在源码文件顶层声明的变量,从声明的位置到文件结束都有效。intx=1;intmain(void){printf("%i\n",x);}上面示例中,变......