使用c语言数组与函数知识实现简易的控制台扫雷游戏。
功能描述
扫雷游戏的预期功能:
(1)游戏整体在控制台实现,通过菜单选择继续玩或者退出游戏
(2)游戏为9*9棋盘,默认布置10个雷
(3)排雷时,如果位置是雷游戏结束,如果不是显示周围雷的个数,全部找出则排雷成功
思路分析
程序逻辑大致如下:
(1)先打印菜单,通过菜单选择玩游戏或退出游戏
(2)选择玩游戏后,初始化棋盘,此时棋盘默认置*
(3)初始化之后,在控制台上打印棋盘
(4)开始布置雷
(5)排雷,游戏结束
游戏分析与设计
从程序逻辑可以看出,代码的实现需要多个函数,我们把函数的声明放在game.h中,函数的实现放在game.c,菜单等主函数框架放在test.c中。结合程序逻辑,我们来逐步分析游戏设计。
打印菜单
运行程序,控制台首先出现的应该是菜单页面,通过输入1或0选择是否开始扫雷,这里我们用switch循环实现判断,menu函数实现菜单的打印。代码实现如下:
初始化棋盘
通过菜单进入游戏后,程序逻辑来到棋盘设置。要打印棋盘,首先想到的是用9*9数组来实现。
思考:应如何设置棋盘,设置几个数组来放置?
(1)棋盘初始化时,在棋盘的随机位置放置10个雷,有雷置1,无雷置0
(2)后续扫雷排查坐标信息时,有雷爆炸,无雷显示周围雷数,因此要用到两个数组
(3)排查雷时,无雷情况下若排查的坐标在边界处,不能完全访问周围8个坐标,会造成越界访问。
(4)初始化放雷和排查格子时周围雷为1时都会显示1,可读性变差,
为方便打印,放雷的棋盘用字符0 和1显示,排查信息的棋盘初始化置*。
因此:需要用到两个11*11的数组,数组内容均用字符显示!
两个数组初始化应如下图:
对棋盘初始化用到InitBoard函数,函数声明后,对函数传参,实现初始化功能
打印棋盘
初始化之后,我们想看一下初始化的实现,因此要用DisplayBoard函数来实现打印,为方便后续排雷操作,我们把行列号一并打印,代码如下:
注意:两个数组打印只需打印排查的数组即可!因为开始游戏后玩家无法看到第一个数组放置雷的信息!
打印效果如下:
随机放雷
布置雷我们用SetMine 函数,利用rand函数限制横纵坐标范围都是1到9,rand的使用需要用到srand实现真正的随机,这里头文件要包含time.h和stdlib.h。随机放置10个雷。每放一个count–。
排查雷的坐标
排查雷我们用FindMine函数,排查逻辑为:输入要排查的坐标,判断坐标是否非法,合法情况下若有雷,即对应数组内存的是字符1。打印你被炸死了,游戏结束。如果没有雷,则显示周围8个格子的雷信息。这里要用到GetMineCount 函数,函数返回值为排查坐标周围8个格子的雷数总和。
注意:
(1)排查不能无限制进行,因此循环条件为排查次数小于剩下的空格子数71
(2)若所有雷都被排查出,即71个空格全被找出,打印“恭喜你排雷成功”。
控制台模拟实现
游戏改进
我们利用数组与函数实现了简易的扫雷游戏,但该游戏还存在一定的缺陷:
(1)扫雷是在控制台实现,玩家游戏体验不足
(2)不能实现插旗操作
(3)排查坐标一次只能进行一个,周围没雷无法展开周围
以上是c语言扫雷的简易实现,欢迎交流!