好久之前写了个扫雷,趁着今天有时间,将其发布上来,废话不多说,Let's do it!
先看一下初步效果图
1、简介
本项目采用QT编程实现扫雷游戏。项目可分为如下四个模块:界面显示、操作响应、子窗口与菜单栏实现、游戏类的设计。使用Qpixmap类向界面绘制基本的bmp图片,包括标题、表情、红旗数、时间计时、雷区,使用QmouseEvent事件对鼠标操作进行监听,当用户操作时,确定相应的鼠标位置与类型,更改游戏类的属性后再次调用界面绘制函数update,对界面实现更新重绘,然后等待用户下一次操作或结束。本项目实现了扫雷游戏的基本操作,左键挖雷、右键插旗,添加计时器对游戏计时,添加菜单栏,提供不同难度的雷区供用户选择,可让用户自主设置雷区行列,添加了提示框与基于对话框的子窗口与用户进行交互。
流程图如下:
2、游戏类block的实现
2.1、雷区的分析抽象
游戏地图即(雷区)由一个个雷块组成, 因此可将雷区定义为一个block类,用二维雷块数组表示雷区。那么下一步的问题在于如何去描述这个雷块?
对雷块进行需求分析,雷块中必须包含有扫雷所需的信息,如:此雷块是否为炸弹、是否被标上红旗、是否被挖掘、若不是炸弹则需保存周围炸弹的数量。总结后归纳此雷块需包含以下四个方面信息:
1、是否炸弹
2、挖掘状态
3、周围雷数
4、有无红旗
所以将雷块的数据结构定义为一个结构体,包含以上信息?
经过思考后发现这太浪费内存资源,实际上可以用Int类型便可表示以上信息。
0-8 ----- 该块周围雷数(未翻开) X
50-58 ----- 该块有红旗。 X+50
100-108 ----- 该块周围雷数(已翻开) X+100
99