新手必看:用C语言写简易版扫雷

versatile_zpc 2024-08-28 11:05:02 阅读 90

        扫雷是非常经典的一款游戏,曾经风靡全球,但其实它非常简单,简易版的连指针都没用到,所以,对于刚接触C语言的同学来说,也是可以完成的。下面,就跟随我来深入了解扫雷的代码。

        我们写代码之前,特别是比较长且复杂的代码,一定要有一个大致的思路(可以记录在纸上),而且,最好是创建出头文件,函数调用源文件和主源文件。

        主源文件用来写代码的框架,函数调用文件用来存放被调用的函数,头文件用来声明。

       我们要在主源文件中写出代码的框架,任何一款游戏都要先进入游戏,让用户玩完一把游戏后觉得不过瘾能够再来一把,并且不想玩了还可以退出游戏,所以这边我们用到do while 循环来完成游戏的框架,为什么不用while 循环,因为我们要先让玩家进入游戏,也就是说让先代码运行起来

        我们先打印出来一个游戏界面,创建一个变量input,然后输入一个值,输入1就开始游戏,输入0就退出游戏,输入的值不是1或者0就提示输入错误重新输入并且跳出,所以我们这边用到了switch语句,而且主代码就再case 1下面,同时让inpu这个变量成为while的判断条件能够让玩家重复体验游戏,这就是游戏大致的框架。先让代码走起来看看,先保证当前代码没什么问题,避免后续出现错误不知道怎么回事。

        打印界面放在mian函数下会显得有些冗余,所以我们将其分装成一个函数在需要的时候调用就可以了,比如jiemian(),同学们在练习时给自定义函数命名可以是汉语拼音,避免忘记。

        然后开始写游戏主代码,上面说过主代码在case 1下面,当输入1开始游戏的时候自动执行游戏主代码。

        接着下来我们就要创建棋盘,用二维数组来创建,并且要创建两个棋盘,其中一个用来放置我们后台布置好雷的信息,比如说棋盘中在哪几个地方放置了雷,这是不能让玩家看到的,另一个用来放置玩家排查雷的信息,也就是玩家需要看到的。我们写的是一格基础款的扫雷游戏,就让棋盘为基础的9*9格式。然后我们都知道扫雷的游戏玩法是排查一个地方之后如果此地不是雷会显示周围有几个雷,所以我们只需要排查周围有几个雷就行了,比如,

        但是注意,如果在角落里呢,超出棋盘外了,怎么统计 我们总不能在每个不同角落都额外统计一下吧,那太麻烦了,所以我们可不可以把棋盘扩大为11*11的,让棋盘整体大一圈,那不就没有这方面的问题了。

        接下来我们将棋盘进行初始化,创建两个二维数组,将后台布置雷的棋盘全部初始化为'0',注意是字符0而不是数字0,因为在另一个排查雷的棋盘中排查雷之前需要全部用字符 * 号代替,所以为了方便,我们在两个棋盘全用字符来初始化,所以创建的数组也是char类型的。

        然后我们自定义这个初始化函数,我们利用for循环生成数组的下标,然后将初始化的内容赋值给对应的下标,注意,为了方便两个数组都能用这个函数初始化,我们将传入第三个参数,也就是字符0和字符*,记得字符需要用单引号。

        为了验证我们初始化是否正确,我们给它打印出来验证一下,还是用for循环来生成数组下标然后将其打印(注意,打印的是字符,所以用%c),值得注意的是我们只需要打印出来中间9*9的棋盘,因为我们只需要9*9的棋盘,外面那一圈是为了方便统计雷的个数而设计的,所以我们只需要生成下标1-9就可以了,打印完每一行后记得换行。

        为了美观我们可以打印一点界面,并且为了之后的正常玩游戏,我们还需将行列号打印出,依旧使用for循环。打印行是在开始的时候打印,打印列的时候是在每一行开始的时候打印,注意加空格对齐

        其实现在还远没有到打印的时候,刚只是为了测试初始化是否正确。现在我们要做的是在后台布置雷棋盘随机放置10个雷。设置两个变量,用rand函数生成随机值然后再%9加1将随机值控制在1-9.为了防止在同一个地方同时布置雷,我们将在不是1的地方布置雷(雷用1代替),布置一个雷count减一,直到十个雷布置完毕,while循环停止。在使用rand()函数之前,‌通常需要先使用srand()函数来设置随机数种子(时间戳),‌以确保每次运行时生成的随机数序列不同。‌整个程序出现一次就可以了,所以我们放入主函数中。不过这个时间戳需要包含一个头文件(time,h),我们放在头文件中,并且需要进行强制类型转换(unsigned int),这里不多阐述,感兴趣的同学可以去网上查阅资料。rand()函数需要包含头文件<stdlib.h>

 

        现在开始排查雷,排查雷的数据放在排查雷棋盘中,也就是arr2数组中,我们创建一个排查雷的函数,排查雷需要将两个数组都传参过去,统计arr1中数组雷的信息放入arr2数组中,先输入坐标,需要保证坐标在合法范围内,也就是中间9*9的棋盘,为了防止重复排查,需要保证排查的 坐标是‘*’,输入的坐标不在棋盘内要警告重新输入

        给玩家看到的是arr2棋盘,排查雷的信息也放在arr2中,只不过雷的信息是arr1中的,然后收集雷的信息,如果将排查的坐标视为x,y的话,那他周围的八个坐标就是这样的:

                然后我们自定义一个函数来统计坐标周围雷的个数

        

                需要注意的是,我们放入的是字符‘1’,而需要统计的是数字1,所以我们就要减去字符‘0’,字符‘1’的ASCLL码值减去字符‘0’的ASCLL码值就等于数字1,字符‘0’的ASCLL码值相减等于数字0.

        而统计的雷的个数也要加上个字符‘0’将其转换成字符形式放入 char arr2 数组中。

        如果排查雷的过程中被炸死了的话,我们也要将布置雷的信息打印一下,让玩家死的瞑目。

        为了使玩家能够重复排雷,就要用到while循环了,而while循环的循环条件可以设置为win<71次,因为全部排雷之后才能赢,否则就是被炸死然后结束游戏,当win=71时游戏自动结束,这时也要恭喜玩家。

        最后,所自定义的函数记得在头文件中声明,否则是用不了的哦!,然后两个源文件中再包含头文件就可以了哦。

        最后我们来运行一下

        

        也是没有出现什么问题啊,好了,就到此结束啦,博主讲的巨细,只要学过C语言循环和函数的人看过之后都可以学得会,觉得啰嗦的大神们体谅一下新手呗,博主在这里谢谢打大家了!有什么问题可以在评论区留言哦。

        制作不易,请三连!!谢谢大家!

        



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。