Qt贪吃蛇.docx
《Qt贪吃蛇.docx》由会员分享,可在线阅读,更多相关《Qt贪吃蛇.docx(25页珍藏版)》请在冰豆网上搜索。
Qt贪吃蛇
嵌入式大作业
Ubuntu平台贪吃蛇游戏的设计与实现
作者姓名:
学科、专业:
学号:
指导教师:
完成日期:
大连大学
DalianUniversity
教师批阅页
选题分
内容分
格式分
态度分
总计:
分
简略给出评语或指出文中问题:
评阅人:
完成日期:
摘要
随着计算机的普及,电脑游戏也慢慢融入人们的生活中,成为人们放松心情的一种方式。
贪食蛇作为一款经典且易于操作的游戏,一直受到人们的青睐,在繁忙的工作之余,玩贪食蛇游戏实在是既省钱又有趣味的休闲方式。
本设计遵循C++程序设计的基础原理,制作出一个精美的贪吃蛇小游戏。
本设计采用QtCreater作为主要的开发工具,很好的实现了贪吃蛇游戏的基本功能。
关键词:
C++;贪吃蛇;QtCreator
摘要3
前言1
第一章Qt库的优点2
1.1可移植性2
1.2易用性2
1.3运行速度2
第二章课程设计目的和要求4
2.1主要研究内容4
2.2目标(要求)4
2.3课程设计任务内容4
第三章详细设计5
3.1设计思想5
3.1.1界面设计5
3.1.2数据结构6
3.2函数设计8
3.2.1文件及函数组成8
3.3.流程图9
3.3.1系统流程图9
3.3.2函数流程图11
第四章程序测试20
第五章设计心得与体会25
参考文献26
附录27
前言
QtCreator是跨平台的QtIDE,QtCreator是Qt被Nokia收购后推出的一款新的轻量级集成开发环境(IDE)。
此IDE能够跨平台运行,支持的系统包括Linux(32位及64位)、MacOSX以及Windows。
QtCreator的设计目标是使开发人员能够利用Qt这个应用程序框架更加快速及轻易的完成开发任务。
在功能方面,QtCreator包括项目生成向导、高级的C++代码编辑器、浏览文件及类的工具、集成了QtDesigner、QtAssistant、QtLinguist、图形化的GDB调试前端,集成qmake构建工具等。
QtCreator主要是为了帮助新Qt用户更快速入门并运行项目,还可提高有经验的Qt开发人员的工作效率。
使用强大的C++代码编辑器可快速编写代码语法标识和代码完成功能输入时进行静态代码检验以及提示样式上下文相关的帮助代码折叠括号匹配和括号选择模式高级编辑功能使用浏览工具管理源代码集成了领先的版本控制软件,包括Git、Perforce和Subversion开放式文件,无须知晓确切的名称或位置搜索类和文件跨不同位置或文件沿用符号在头文件和源文件,或在声明和定义之间切换为Qt跨平台开发人员的需求而量身定制集成了特定于Qt的功能,如信号与槽(Signals&Slots)图示调试器,对Qt类结构可一目了然集成了QtDesigner可视化布局和格式构建器只需单击一下就可生成和运行Qt项目。
虽然贪吃蛇游戏在我们的日常生活中是很常见的,但是作为普通的一款小游戏,他却有着极强的生命力,它的简单易行使之广泛的存在于电脑,手机等电子产品载体上,加上变化无穷、引人入胜,使它成为了一款受人喜欢的小游戏。
第一章Qt库的优点
GUI工具包(或GUI库)是构造图形用户界面(程序)所使用的一套按钮、滚动条、菜单和其他对象的集合。
在UNIX系统里,有很多可工使用的GUI库,其中之一就是Qt库,它是一个几乎C++编程语言的工具包。
由于Qt是基于C++而不是C,故他的有点是速度快、易于使用,并具有很好的可移植性。
所以,当需要开发Unix或MSwindows环境下的GUI程序时,Qt是最佳选择。
1.1可移植性
Qt不只是适用于Unix,它同样适用于MSWindows。
Windows平台下用标准库MicrosoftFoudationClasses(MFC,Microsoft基类),它不适用于其他平台。
GTK或Xforms,又不能支持Windows平台。
既适合windows平台又适合Linux平台的GUI工具包,那就是Qt。
1.2易用性
Qt是一个C++工具包,它由几百个C++类构成,在程序中可以使用这些类。
Qt是基于C++构造,所以具有OOP(object_orientedprogramming)的优点。
1.3运行速度
Qt非常容易使用,而且速度也很快。
这两方面通常是不可能同时达到。
GUI工具包,通常速度都不快,而Qt的这一有点归功于Qt开发者的功劳,他们大大优化了Qt的这一产品。
Qt是一个GUI仿真工具包,这意味着它不使用任何本地工具包作调用。
第二章课程设计目的和要求
2.1主要研究内容
论述基于Qt下的贪吃蛇游戏设计。
通过对Qt下的贪吃蛇游戏分析,结合游戏中的逻辑和操作需求,说明Qt下的贪吃蛇游戏设计的开发过程及各种技术细节;结合所要开发的系统的特点,采用QtCreator开发工具。
2.2目标(要求)
对基于Qt下的贪吃蛇游戏设计逻辑级操作分析。
设计一个简单,漂亮的贪吃蛇游戏用以玩耍
2.3课程设计任务内容
程序要求游戏时,分为两种模式,允许穿墙模式和禁止穿墙模式,可以随意选择切换。
禁止穿墙模式:
一条蛇在的围墙内,围墙内会随机出现一个食物通过键盘上的4个方向键控制蛇向上下左右4个方向移动,蛇头接到食物,则表示食物被蛇吃掉,这时蛇的身体加长一节,同时计10分。
接着又出现食物等待被蛇吃掉。
如果蛇在移动过程中,撞到墙壁或身体交叉(蛇头撞到自己的身体),则游戏结束。
分数每增加100分,游戏等级升1级即速度加快1级。
允许穿墙模式:
如果蛇在移动过程中,撞到墙壁会穿过从该墙的对面传出,游戏不会结束,身体交叉(蛇头撞到自己的身体),则游戏结束。
其他记分、等级规则与禁止穿墙模式相同。
第三章详细设计
3.1设计思想
3.1.1界面设计
这个游戏程序的关键是表示蛇的图形以及蛇的移动。
用一个小小方格来表示蛇的一节身体,身体每长一节,增加一个小方格。
移动时必须从蛇头开始,如果不按任何键,蛇自行在当前方向上向前移动,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,首先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇的整个身体,在界面的游戏框中随机出现一个静止静止不动的食物,用户通过键盘来控制蛇的走向,当蛇吃到食物时,分数增加十分,界面开始更新,蛇的身体增加一节,游戏框中又会随机出现一个静止不动的食物
在禁止穿墙模式下,当蛇头碰到游戏框边框的时候或者蛇头碰到自己的身体的时候,游戏自动结束。
在可以穿墙的模式下,蛇头碰到游戏框边框的时候,蛇会从该边框的对面穿出,游戏不会结束,当蛇头碰到自己的身体的时候,游戏结束。
两种模式下,蛇每吃到一个食物,增加10分,分数每累积够百分,游戏等级增加1级,游戏速度加快1级,在游戏界面的上会有同步分数和等级的数码显示。
在游戏中,还增加了游戏暂停功能,当游戏需要暂停时,按下暂停功能键p键,游戏在停,如果按下任意方向键,游戏继续。
3.1.2数据结构
QtSnake.h文件及类的设计如表3-1所示。
表3-1
文件名
成员类型
成员
功能
QtSnake.h
public
Snake(QWidget*=0)
容器选取
private
charSnakeBody[Max][2]
intheader_Index,
Inttail_Index
inteat_X,eat_Y
intlevel
intspeed
intscore,eatNum
intmap_row,map_col
intDir
intstep
inttempx,tempy
boolCanGoThroughWall
boolhasMoved
程序所需变量
QLCDNumber*levelNumber
QLCDNumber*scoreNumber
QLabel*label
QLabel*levelLabel
QLabel*scoreLabel
QLabel*setlabel
Qtimer*timer
QPushButton*button
布局选取
voidiniWidget()
voidiniConnect()
boolisEating()
boolisGameOver()
voidiniGame()
voidchangeScore()
voidchangeLevel()
QColorgetColor()
功能函数
privateslots
voiddoMoveSnake()
voidsetEnableGoThroughWall()
信号槽函数
protected
voidpaintEvent()
voidkeyPressEvent()
受保护函数
类容器设计:
classSnake:
publicQWidget
{
Q_OBJECT
public:
Snake(QWidget*=0);
private:
charSnakeBody[Max][2];//存储蛇的身体坐标信息
intheader_Index,tail_Index;//蛇头、尾在数组的位置
inteat_X,eat_Y;//出现吃的位置
intlevel;//等级
intspeed;//蛇的速度
intscore,eatNum;//得分
intmap_row,map_col;//地图太小
intDir;//当前蛇移动方向
intstep;//步距
inttempx,tempy;//蛇头下一位置临时存放
boolCanGoThroughWall;//是否能穿墙
boolhasMoved;//用于避免两次方向键之间间隔太小造成的错误
QLCDNumber*levelNumber;//等级LED
QLCDNumber*scoreNumber;//分数LED
QLabel*label;//游戏框
QLabel*levelLabel;//等级标签
QLabel*scoreLabel;//分数标签
QLabel*setlabel;//模式标示
Qtimer*timer;//游戏计时器
QPushButton*button;//选择模式按钮
voidiniWidget();//初始化容器状态
voidiniConnect();//信号连接
boolisEating();//蛇要吃食物
boolisGameOver();//判断游戏结束
voidiniGame();//初始化游戏
voidchangeScore();//更新得分
voidchangeLevel();//更新等级
QColorgetColor();//食物变色
privateslots:
voiddoMoveSnake();//蛇移动每一步状态
voidsetEnableGoThroughWall();//设置是否允许穿墙
protected:
voidpaintEvent(QPaintEvent*);//绘画蛇身,食物
voidkeyPressEvent(QKeyEvent*event);//捕获按键信号
};
3.2函数设计
3.2.1文件及函数组成
源文件
函数名称
功能
main.cpp
main
总控函数,增加了编码格式,窗口标题
QtSnake.cpp
Snake:
:
Snake(QWidget*parent)
初始化容器的总体状态
voidSnake:
:
iniWidget()
初始化容器中的各个窗口和标签的位置,字体大小,变量值
voidSnake:
:
iniConnect()
开启模式选择按键,方向键,暂停键的信号捕捉
voidSnake:
:
iniGame()
初始化游戏的速度、级别、食物分数,蛇身坐标,食物坐标,计分器,级别器
voidSnake:
:
doMoveSnake()
每一步做一次游戏结束判断,然后改变蛇的状态,随机出现食物
voidSnake:
:
setEnableGoThroughWall()
判断穿墙变量,为真,设置为模式标示为“可以穿墙”模式为假为“禁止穿墙”模式
voidSnake:
:
changeScore()
蛇吃到食物的分数增加
voidSnake:
:
changeLevel()
改变游戏等级,速度
boolSnake:
:
isEating()
蛇吃食物的状态实现
boolSnake:
:
isGameOver()
首先判断游戏是否处于穿墙模式,穿墙模式下,蛇头碰到自己的身体游戏结束,禁止穿墙模式下,蛇头碰到边框或者身体游戏结束,游戏结束返回ture
VoidSnake:
:
paintEvent()
游戏开始时,在随机坐标画出蛇身和食物,游戏中描绘蛇的运动轨迹,并随机补充食物
voidSnake:
:
keyPressEvent()
捕捉4个方向键和p键(暂停键)的信号
QColorSnake:
:
getColor()
存放了8种颜色用于随机选取
3.3.流程图
3.3.1系统流程图
开始
载入游戏,初始化游戏界面
按任意方向键开始游戏,随机出现一个食物,并用方向键控制蛇的游动方向
游戏模式判断
是否碰到自己的身体
是否碰到自己的身体
允许穿墙禁止穿墙
是否碰到墙壁
YNNY
是否吃到食物
N
Y
蛇身增加1格,分数加10
吃掉食物数*10是否等于分数
YN
保持原状
等级加1,速度增加
宣布死亡
结束
图3.1
3.3.2函数流程图
main函数流程图如图3.2所示
开始
调用游戏主控函数
调用编码函数,选择编码"UTF-8"
设置游戏窗口标题"贪吃蛇"
调用显示窗口函数,开始运行游戏
结束
如图3.2
QColorSnake:
:
getColor()函数流程图如图3.3所示
开始
将8种颜色放入一个8
个元素的数组中
随机选择一种颜色返回
结束
图3.3
Snake:
:
Snake(QWidget*parent)函数流程图如图3.4所示
开始
初始化游戏窗口的位置,大小。
默认游戏模式为禁止穿墙
调用:
容器初始化容器,槽函数初始化信号函数,游戏初始化函数
结束
图3.4
voidSnake:
:
iniWidget()函数流程图如图3.5所示
开始
初始化:
分数标签,分数LED,等级标签,等级LED,模式标示窗口(位置,大小,字体)
初始化模式选择按钮的位置,大小,字体
初始化提示窗口的位置,字体,大小
初始化游戏框的位置,大小,边框宽度
结束
图3.5
voidSnake:
:
iniConnect()函数流程图如图3.6所示
开始
捕捉信号:
游戏控制键(上、下、右、左、暂停),模式改变按钮,其他
调用模式改变槽函数
调用游戏控制槽函数
游戏控制键模式改变按钮
结束
图3.6
voidSnake:
:
iniGame()函数流程图如图3.7所示
开始
初始化游戏:
速度,吃食数,分数,等级
将分数,等级初始值显示在
LED上
定义蛇身数组大小,随机获取蛇头和食物坐标
时间暂时停止,暂时设定方向变量Dir=-1(没有方向,等待方向键信号)
结束
图3.7
voidSnake:
:
doMoveSnake()函数流程图如图3.8所示
开始
游戏开始变量设为ture
(游戏开始)
判断游戏是否为结束状态
蛇是否吃到食物
游戏结束并显示提示信息“gameover”,游戏状态设为最初状态
吃到食物,蛇身加长1
格,分数加10
Y
N
随机出现食物,并获取食物坐标
食物坐标是否与蛇身重合
N
Y
将处理后的状态更新
结束
图3.8
voidSnake:
:
setEnableGoThroughWall()函数流程图如图3.9所示
开始
穿墙判断变量取反
判断变量时ture/false
turefalse
禁止穿墙
允许穿墙
结束
图3.9
voidSnake:
:
changeScore()函数流程图如图3.10所示
开始
蛇是否吃到食物
YN
分数加10,并且在
LED上显示
结束
如图3.10
voidSnake:
:
changeLevel()函数流程图如图3.11所示
开始
吃掉的食物乘以10是否等于分数
YN
不做改变,将原有等级在
LED上显示
等级加1,速度增加,吃食数量加10,并在LED显示
结束
图3.11
boolSnake:
:
isEating()函数流程图如图3.12所示
开始
判断蛇头的当前坐标是否等于食物的坐标
YN
没有吃到返回false
吃到食物返回ture
结束
图3.12
开始
是否能穿墙
boolSnake:
:
isGameOver()函数流程图如图3.13所示
能不能
蛇头是否碰到身体
蛇头是否碰上身体
NN
蛇头是否碰到墙壁
Y
YN
Y
函数返回ture(游戏结束)
结束
函数返回false(游戏继续)
图3.13
voidSnake:
:
paintEvent(QPaintEvent*event)函数流程图如图3.14所示
开始
i=蛇头的映射
画蛇的身体
i!
=蛇尾的映射
画出蛇的一个身体
Y
N
N
游戏处于激活状态
画食物
在坐标范围内随机画出一个食物
结束
图3.14
voidSnake:
:
keyPressEvent(QKeyEvent*event)函数流程图如图3.15所示
开始
捕捉按键信号:
方向键(上、下、右、左),暂停键(p),其他
判断输入的方向
方向键
其他
上下右左
是否与运动垂直
是否与运动垂直
是否与运动垂直
是否与运动垂直
暂停键
暂停游戏
是否是否是否是否
向上运动
向上运动
向上运动
向上运动
向上运动
向上运动
向上运动
向上运动
结束
图3.15
第四章程序测试
运行程序,默认是“禁止穿墙”模式,分数为0,等级为0。
按下任意方向键,游戏开始,游戏窗口出现一个食物。
此时蛇向下运动,分数是30
吃到一个食物后,分数加10
蛇吃掉10个食物,吃食数乘以10,等于分数100,等级加1
“禁止穿墙”模式下蛇碰到墙壁游戏结束,消息框弹出
“禁止穿墙”模式下蛇碰到自己身体游戏结束,消息框弹出
“穿墙模式”下蛇从左边墙壁传入,从右边墙壁传出
“穿墙模式”下蛇从下边墙壁传入,从上边墙壁传出
“禁止穿墙”模式下蛇碰到自己身体游戏结束,消息框弹出
第五章设计心得与体会
贪吃蛇是家喻户晓的益智类小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是一直以来贪吃蛇这个游戏就深深地吸引着我,它的制作方法对于以前的我而言都是很神秘的。
这次编程我通过自己的所学知识把它剖析开来,真真正正的了解它的本质和精髓。
虽然我的编程能力不是很强,但是我有信心,在这次学习中我将从实践和实际的项目中提高自己的编程能力。
这个题目的选定是来源我学习生活的一个例子,从程序的选定到程序的构思,再到程序的编写都花了我很长的时间,几乎每天都熬夜,真得很辛苦,但完成后又有一种很踏实的感觉。
编写程序很辛苦,尤其是基础不好的。
不过三人行,必有我师:
编程比较好的同学、编写其他程序的同学、老师都是我们相互学习的对象。
感谢他们给了我很多意见,帮助了我很多,真正体会到合作的愉快。
通过这次的C++程序课程设计,熟练地掌握C++语言的知识点,熟悉当前常用的软件开发环境,解决实际问题的能力的强化训练,正确理解掌握C++面向对象程序设计的基本特性:
类、对象、继承与派生、多态、虚函数、模板、流类库等。
但因为时间关系,只能把这次作为基点,有待改进,以后编程的话就不会产生恐惧心理,平时编程太少了。
尤其是更熟悉文件的操作了,对C++语言也更熟悉了,也能够自己改程序中的错误,真的让我体会到编程是痛并快乐着。
参考文献
[1](美)BjarneStroustrup著。
裘宗燕译。
C++程序设计语言(特别版)[M].机械工业出版社。
[2]孙鑫余安萍编著,《VC++深入详解》[M].电子工业出版社。
[3]王树伟著,《VisualC++游戏编程基础》[M].北京:
电子工业出版社。
[4]谭浩强,张基温,C语言程序设计教程(第3版)[M].高等教育出版社,1991年08月。
[5]成洁,卢紫毅,Linux窗口设计——Qt4精彩实例设计分析[M],清华大学出版社,2008.11。
[6](加)布兰切特(Blanchette,J)(英)萨默菲尔德(Summerfield,M)著,闫锋欣译,C++GUIQt4编程(第二版)[M].2008年08月。
[7] 谭浩强著.C++程序设计(第二版)[M].北京:
清华大学出版社,2004。
[8] 刘燕君,刘振安,张一叶著.C++程序设计综合课程设计(第二版)[M].北京:
机械工业出版社,2009。