基于Qt的贪吃蛇游戏设计与实现

时间:2022-07-25 09:32:05

基于Qt的贪吃蛇游戏设计与实现

摘 要:本文中描述的系统是基于Qt、C++ 技术在Windows开发环境下开发的一个操作简单、界面简洁、功能有所改进的“贪吃蛇”游戏。本文重点描述了四个模块的实现,尤其是模式管理模块,描述了设置小蛇是否可以穿墙,通过这一设置可以改变游戏的难度,增强游戏的趣味性,这是该设计的一大特点。

【关键词】QT 贪吃蛇 模块 C++

贪吃蛇游戏是家喻户晓的益智类小游戏,本文中的贪吃蛇游戏是采用了一个跨平台的图形用户界面应用程序框架Qt,是在Windows的开发环境下结合Qt和C++技术开发的一款游戏,其中实现了贪吃蛇的移动,食物的随机出现,贪吃蛇的吃到食物后增长的功能,同时也可以计算游戏玩家的分数和等级,来显示玩家的每次的游戏状态。同时,还添加了一个功能,允许玩家自己自由设置是否可以穿墙,因为随着玩家等级的增长,小蛇的移动速度会有所增加。当玩家的等级升到相对高的等级以后,小蛇的移动速度会比开始时候的速度快很多,在相对一定的活动范围内,游戏的难度就增大了。

1 游戏的流程图

系统中设计到的函数及函数之间的调用执行流程,在定义Snake对象时,系统自动调用构造函数初始化系统如图1所示:

系统执行过程中的主要函数及他们之间的执行流程如图2所示:

2 游戏模块的设计与实现

贪吃蛇游戏系统划分为模块:布局管理模块、初始化管理模块、模式管理模块、绘图管理模块、按键管理模块、信号连接管理模块、更新管理模块、判断游戏结束管理模块。在此为读者描述其中四个模块。

2.1模式管理模块

模式管理模块主要由玩家自己自由设置是否可以穿墙,默认设置是禁止穿墙。玩家点击窗口“点击设置是否穿墙的”的按钮可以在允许穿墙和禁止穿墙之间切换模式。因为默认设置是禁止穿墙,因此一开始系统要判断当前模式是允许穿墙还是禁止穿墙,如果当前模式和默认设置不一样,那么系统就会认为当前模式是允许穿墙,那么点击后系统模式就会变为禁止穿墙;如果当前模式和默认设置相投,那么系统就会认为当前模式是禁止穿墙,那么点击后系统模式就会变为允许穿墙。

2.2 绘图管理模块

要想在绘图设备(一般是窗口部件)上绘图,只需创建一个 QPainter,再将指针传到该设备中。注意矩形的大小(宽和高)也许与你通常所用的所有不同。如果左上角和右下角相同,那么这个矩形的宽和高都为1。 通常情况下,width = right - left + 1并且height = bottom - top + 1。这样设计是因为这样就可以使矩形空间可以用在绘制函数中,它的宽高就说明了所要绘制的象素。例如,我们画一个宽和高都为1的矩形为一个单一点象素。默认坐标系统的原点(0,0)在左上角。y轴的正方向向下,并且x轴的正方向从左到右。 QRect::QRect ( int left, int top, int width, int height ) 构造一个上、左、宽、高分别为top、left、width和height的矩形。利用Qrect函数可以在游戏区域里面画一定的背景颜色。

用一个二维数组来存储小蛇的身体,第一维数组表示小蛇的身体长度,第二维数组表示她目前的位置坐标。设置绘图工具的画刷为蓝色和特定的style,利用Qpainter类中drawRect函数来画小蛇的身体,其中void QPainter::drawRect ( int x, int y, int w, int h ) 绘制左上角在(x, y)并且宽为w、高为h的矩形。这样初始的小蛇只占有一个空格的单位。 如果小蛇身体增长可以用Qpainter类中drawLine函数来画增长的身体,其中 void QPainter::drawLine ( int x1, int y1, int x2, int y2 )绘制从(x1, y1)到(x2, y2)的直线并且设置当前画笔位置为(x2, y2)。

2.3 信号连接管理模块

信号连接模块主要通过用户操作而引起的信号改变来操作系统的运行。Qt的窗口部件通过发射信号来表明一个用户动作已经发生了或者一个状态已经改变了。比如:当QTimer类提供了定时器信号和单触发定时器,当一定时间量用完以后或者触发了定时器,就会发射timeout()信号来调用doMoveSnake() 私有槽[5],使得槽可以自动执行。接着当用户单击QpushButton按钮时,该按钮就会发射一个clicked()信号。信号可以与函数(在这里我们把它称为槽slot)相连接,以便在发射信号的时候,槽可以得到执行。

2.4 更新管理模块

更新管理主要是在小蛇吃掉食物后显示玩家的分数和等级会出现变化,小蛇每吃掉一个食物,玩家就会获得十分,然后逐步积累,每满一百分玩家的等级就会加一。

其中玩家等级升高的同时,小蛇的速度就会变快。这个是利用QTime类中的start函数实现的,QTimer类提供了定时器信号和单触发定时器, void QTime::start () 函数设置这个时间为当前时间。这是实际上使用来计时的。start 函数会在一定时间speed 后,调用 timer ,故 speed 的数值越小,贪吃蛇的移动度越快。这也就是为什么程序中speed的数值变小了,但是小蛇的移动速度却变的快了的原因。在getColor()函数中定义了一个static const QRgb colorTable[8]的一维数组,利用随机数来不断变换当前的颜色。

然后用doMoveSnake()函数来控制小蛇移动的情况,函数开始先调用isGameOver()判断游戏是否结束,如果结束了就执行isGameOver函数并同时初始化界面。然后判断小蛇是否吃到食物,如果迟到了就调用changeScore()函数和changeLevel()函数来调整得分框和等级框。接着如果符合小蛇吃到食物的条件,会一直执行while()循环。

3 结语

本文描述了基于Qt、C++ 技术在Windows开发环境下开发的 “贪吃蛇”游戏,首先是对游戏的功能描述,然后给出了系统的流程图,重点是为读者描述了模式管理模块、绘图管理模块、信号连接管理模块和更新管理模块四个模块,尤其是模式管理模块中玩家自己可以自由设置小蛇是否可以穿墙,增强了该游戏的趣味性,相信对大家开发游戏有一定的参考价值。

参考文献

[1]丁林松,黄丽琴.Qt4图形设计与嵌入式开发[M].北京:人民邮电出版社,2009.

[2]谭浩强.C++程序设计[M].北京:清华大学出版社,2004.

[3]张海藩.软件工程导论(第四版)[M].北京:清华大学出版社,2003.

[4]刘艳青,苏桂莲.基于Qt4 的图形用户界面程序的设计与实现[J].现代计算机( 专业版),2009.

[5]蔡志明等.精通Qt4编程[M].北京:电子工业出版社,2008.

作者单位

山西农业大学 信息科学与工程学院 山西省太谷县 030801

上一篇:发挥信息技术优势 下一篇:工信部将加强移动智能终端进网管理