基于Qt的贪吃蛇游戏设计与实现
qt贪吃蛇课程设计总结

qt贪吃蛇课程设计总结一、教学目标本课程的教学目标是使学生掌握Qt贪吃蛇游戏的基本开发方法和技巧,培养学生运用编程思维解决实际问题的能力。
具体目标如下:1.知识目标:–了解Qt框架的基本概念和原理;–掌握Qt Creator的使用方法和编程环境;–掌握贪吃蛇游戏的基本算法和数据结构;–熟悉Qt Widget编程和事件处理。
2.技能目标:–能够独立设置Qt开发环境,编写简单的Qt程序;–能够运用贪吃蛇游戏的基本算法,实现游戏的基本功能;–能够使用Qt Creator进行调试和优化程序;–能够根据需要,查阅相关资料和文档,解决问题。
3.情感态度价值观目标:–培养学生对编程和软件开发的兴趣和热情;–培养学生独立思考、自主学习和团队协作的能力;–培养学生勇于探索、创新和解决问题的精神;–培养学生具有良好的职业道德和责任意识。
二、教学内容根据课程目标,教学内容主要包括以下几个方面:1.Qt框架的基本概念和原理:Qt概述、Qt模块、信号与槽机制、Qt类体系结构等;2.Qt Creator的使用方法和编程环境:安装与配置、界面布局、编写代码、调试与运行等;3.贪吃蛇游戏的基本算法和数据结构:游戏流程、坐标系、蛇身模型、食物模型、方向控制、碰撞检测等;4.Qt Widget编程和事件处理:窗口布局、控件使用、事件处理机制、键盘和鼠标事件等。
三、教学方法本课程采用多种教学方法,以激发学生的学习兴趣和主动性:1.讲授法:讲解Qt框架的基本概念和原理,贪吃蛇游戏的基本算法和数据结构;2.案例分析法:分析典型代码和案例,引导学生理解和掌握相关知识;3.实验法:让学生动手编写和调试Qt程序,培养实际编程能力;4.小组讨论法:分组进行讨论和实践,培养团队协作和解决问题能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将提供以下教学资源:1.教材:《Qt编程入门》、《Qt Creator入门与实践》等;2.参考书:《Qt 5开发实战》、《Qt 5核心编程》等;3.多媒体资料:教学PPT、视频教程、在线文档等;4.实验设备:计算机、网络环境、编程软件等。
qt贪吃蛇源课程设计

qt贪吃蛇源课程设计一、教学目标本课程旨在通过学习Qt贪吃蛇游戏的设计与实现,让学生掌握C++编程基础、Qt框架应用、面向对象编程等技能,培养学生的实际编程能力、问题解决能力和创新思维能力。
1.理解C++的基本语法和数据结构。
2.熟悉Qt框架的基本组件和事件处理机制。
3.掌握面向对象编程的思想和方法。
4.能够运用C++编写简单的Qt应用程序。
5.能够独立设计并实现一个贪吃蛇游戏。
6.能够对程序进行调试和优化。
情感态度价值观目标:1.培养学生对编程的兴趣和热情,提高学生的自信心和自我成就感。
2.培养学生团队合作精神和良好的编程习惯。
3.培养学生关注社会问题,用技术改变世界的意识。
二、教学内容本课程的教学内容主要包括C++基本语法、Qt框架应用、面向对象编程和贪吃蛇游戏设计四个部分。
1.C++基本语法:介绍C++的数据类型、控制结构、函数、指针等基本概念和用法。
2.Qt框架应用:讲解Qt框架的基本组件、事件处理机制、信号与槽机制等,让学生能够运用Qt进行基本的窗口应用程序开发。
3.面向对象编程:讲解面向对象编程的基本概念和方法,如类、对象、继承、多态等,让学生能够运用面向对象的思想进行程序设计。
4.贪吃蛇游戏设计:通过设计并实现一个贪吃蛇游戏,让学生综合运用所学的C++语法、Qt框架和面向对象编程技能,培养学生的实际编程能力和问题解决能力。
三、教学方法本课程采用讲授法、案例分析法、实验法等多种教学方法,以激发学生的学习兴趣和主动性。
1.讲授法:通过讲解C++基本语法、Qt框架和面向对象编程的概念和方法,让学生掌握相关知识。
2.案例分析法:通过分析典型的贪吃蛇游戏案例,让学生了解游戏设计的思路和方法。
3.实验法:让学生动手编写和调试代码,培养学生的实际编程能力和问题解决能力。
四、教学资源本课程所需的教学资源包括教材、参考书、多媒体资料和实验设备。
1.教材:选用《C++ Primer》作为主要教材,系统地讲解C++编程基础。
QT实现贪吃蛇游戏代码详解

QT实现贪吃蛇游戏代码详解⽬录⼀、新建⼀个Qt项⽬⼆、添加要⽤到的头⽂件三、写类声明信息四、对类函数的实现构造函数界⾯刷新随机奖励的⽣成移动绘图按键事件判断蛇⾝是否相撞五、结束⼀、新建⼀个Qt项⽬新建Qt Widgets Application,项⽬名称为HappySnake,基类选择QWidget,类名默认⼆、添加要⽤到的头⽂件#include <QKeyEvent>#include <QRectF>#include <QPainter>#include <QPen>#include <QBrush>#include <QDebug>#include <QTimer>#include <QTime>三、写类声明信息贪吃蛇的本体使⽤⼩⽅框来代替使⽤QList类来保存贪吃蛇的本体使⽤定时器来设定刷新的时间使⽤随机函数⽣成奖励的节点使⽤paintEvent来进⾏绘图keyPressEvent来监测按键的按下,控制贪吃蛇的移动class Widget : public QWidget{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();protected:void paintEvent(QPaintEvent *);void keyPressEvent(QKeyEvent *);private:void addTopRectF();void addDownRectF();void addLeftRectF();void addRightRectF();void deleteLastRectF();bool snakeStrike();enum Move{Left,Right,Up,Down};protected slots:void timeOut();void rewardTimeOut();private:Ui::Widget *ui;QList<QRectF> snake;//贪吃蛇本体int snakeNodeWidth = 10;int snakeNodeHeight = 10;QTimer *timer;QTimer *rewardTimer;int time = 100;int moveFlage = Up;bool gameOver = false;bool gameStart = false;QList<QRectF> rewardNode;//奖励节点};四、对类函数的实现构造函数Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);resize(480,500);//设置窗体背景⾊为⿊⾊setStyleSheet("QWidget{background:black}");setWindowOpacity(0.8);//设置窗⼝的透明度snake.append(QRectF(200,500,snakeNodeWidth,snakeNodeHeight));addTopRectF();addTopRectF();//⾸先⽣成⼀个奖励节点rewardNode.append(QRectF(100,100,snakeNodeWidth,snakeNodeWidth));timer = new QTimer;connect(timer, SIGNAL(timeout()),this,SLOT(timeOut()));//timer->start(time);rewardTimer = new QTimer;connect(rewardTimer,SIGNAL(timeout()),this,SLOT(rewardTimeOut()));//rewardTimer->start(time*30);}Widget::~Widget(){delete ui;}界⾯刷新void Widget::timeOut(){int flage = 1;for(int i=0; i<rewardNode.length(); i++){if(rewardNode.at(i).contains(snake.at(0).topLeft()+QPointF(snakeNodeWidth/2,snakeNodeHeight/2))){//if(snake.at(0).contains(rewardNode.at(i).x()+rewardNode.at(i).width()/2,rewardNode.at(i).y()+rewardNode.at(i).height()/2)){ if(rewardNode.at(i).width()>snakeNodeWidth){//额外奖励flage += 2;}flage++;//正常奖励rewardNode.removeAt(i);break;}}while(flage--){switch (moveFlage) {case Up:addTopRectF();break;case Down:addDownRectF();break;case Right:addRightRectF();break;case Left:addLeftRectF();break;default:break;}}deleteLastRectF();update();}随机奖励的⽣成//随机奖励void Widget::rewardTimeOut(){qsrand(QTime(0,0,0).secsTo(QTime::currentTime()));if(rewardNode.length() > 5){rewardNode.removeAt(qrand()%5);}rewardNode.append(QRectF(qrand()%(this->width()/20)*20,qrand()%(this->height()/20)*20,snakeNodeWidth,snakeNodeWidth));if(qrand()%5 == 3){rewardNode.append(QRectF(qrand()%(this->width()/20)*20-5,qrand()%(this->height()/20)*20-5,snakeNodeWidth*2,snakeNodeWidth*2)); }}移动//向上移动void Widget::addTopRectF(){if(snake.at(0).y()-snakeNodeHeight < 0){snake.insert(0,QRectF(QPointF(snake.at(0).x(),this->height()-snakeNodeHeight),QPointF(snake.at(0).x()+snakeNodeWidth,this->height())));}else{snake.insert(0,QRectF(snake.at(0).topLeft()+QPointF(0,-snakeNodeHeight),snake.at(0).topRight()));}}//向下移动void Widget::addDownRectF(){if(snake.at(0).y()+snakeNodeHeight*2 > this->height()){snake.insert(0,QRectF(QPointF(snake.at(0).x(),snakeNodeHeight),QPointF(snake.at(0).x()+snakeNodeWidth,0)));}else{snake.insert(0,QRectF(snake.at(0).bottomLeft(),snake.at(0).bottomRight()+QPointF(0,snakeNodeHeight)));}}//向左移动void Widget::addLeftRectF(){if(snake.at(0).x()-snakeNodeWidth < 0){snake.insert(0,QRectF(QPointF(this->width()-snakeNodeWidth,snake.at(0).y()),QPointF(this->width(),snake.at(0).y()+snakeNodeHeight)));}else{snake.insert(0,QRectF(snake.at(0).topLeft()+QPointF(-snakeNodeWidth,0),snake.at(0).bottomLeft()));}}//向右移动void Widget::addRightRectF(){if(snake.at(0).x()+snakeNodeWidth*2 > this->width()){snake.insert(0,QRectF(QPointF(0,snake.at(0).y()),QPointF(snakeNodeWidth,snake.at(0).y()+snakeNodeHeight)));}else{snake.insert(0,QRectF(snake.at(0).topRight(),snake.at(0).bottomRight()+QPointF(snakeNodeWidth,0)));}}//删除结尾数据void Widget::deleteLastRectF(){snake.removeLast();}绘图//绘图void Widget::paintEvent(QPaintEvent *event){QPainter painter(this);QPen pen;QBrush brush;QFont font("⽅正舒体",12,QFont::ExtraLight,false);//反锯齿painter.setRenderHint(QPainter::Antialiasing);pen.setColor(Qt::black);brush.setColor(Qt::green);brush.setStyle(Qt::SolidPattern);painter.setPen(pen);painter.setBrush(brush);for(int i=0; i<snake.length(); i++){painter.drawRect(snake.at(i));}brush.setColor(Qt::red);painter.setBrush(brush);for(int i=0; i<rewardNode.length(); i++){painter.drawEllipse(rewardNode.at(i));}pen.setColor(Qt::white);painter.setPen(pen);painter.setFont(font);painter.drawText(20,20,QString("当前得分:")+QString("%1").arg(snake.length()));if(snakeStrike()){QFont font("⽅正舒体",30,QFont::ExtraLight,false);painter.setFont(font);painter.drawText((this->width()-300)/2,(this->height()-30)/2,QString("GAME OVER!")); timer->stop();rewardTimer->stop();gameOver = true;}QWidget::paintEvent(event);}按键事件void Widget::keyPressEvent(QKeyEvent *event){switch(event->key()){case Qt::Key_Up:if(moveFlage != Down){moveFlage = Up;}break;case Qt::Key_Down:if(moveFlage != Up){moveFlage = Down;}break;case Qt::Key_Right:if(moveFlage != Left){moveFlage = Right;}break;case Qt::Key_Left:if(moveFlage != Right){moveFlage = Left;}break;case Qt::Key_Enter:case Qt::Key_Return:if(gameOver){snake.clear();rewardNode.clear();moveFlage = Up;snake.append(QRectF(200,500,snakeNodeWidth,snakeNodeHeight));addTopRectF();addTopRectF();//⾸先⽣成⼀个奖励节点rewardNode.append(QRectF(100,100,snakeNodeWidth,snakeNodeWidth));timer->start(time);rewardTimer->start(time*30);gameOver = false;}break;case Qt::Key_Space:if(gameStart && !gameOver){timer->start(time);rewardTimer->start(time*30);gameStart = false;}else if(!gameStart && !gameOver){timer->stop();rewardTimer->stop();gameStart = true;}break;default:break;}}判断蛇⾝是否相撞//判断蛇头是否和蛇⾝相撞bool Widget::snakeStrike(){for(int i=0; i<snake.length(); i++){for(int j=i+1; j<snake.length(); j++){if(snake.at(i) == snake.at(j)){return true;}}}return false;}五、结束实现的效果:总结:只是简单的使⽤了paintevent进⾏绘图,基本都是简单的对Qt的⼀些常⽤类的使⽤,对⾯向对象的编程应⽤的不是很好,更偏向于⾯向过程,所以完全可以改成C语⾔在Linux下实现,思路都是相同的。
Qt课程设计--贪吃蛇游戏设计

Qt课程设计--贪吃蛇游戏设计Qt课程设计说明书题目: 贪吃蛇游戏设计目录功能需求 (3)界面要求 (3)其他要求 (4)设计分析 (4)操作方法及运行结果 (4)设计体会 (6)参考文献 (6)功能需求利用Qt creator制作一个贪吃蛇的小游戏,要求:(1)在窗口上显示菜单栏,帮助栏和工具栏(2)游戏含有正常模式、死亡模式、情侣模式三种(3)能够记录游戏时间,游戏成绩,游戏排行(4)能够显示英雄榜(5)能够显示帮助提示界面要求贪吃蛇游戏的游戏界面包括背景图片、工具栏图片、蛇移动范围的绘制等等。
其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。
因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。
导入位图以及菜单工具条后,游戏未开始前(win7系统下)的界面显示如图2-1所示其他要求能够注意各种异常处理,注重提高程序运行效率设计分析根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面正常模式、死亡模式以及情侣模式,游戏帮助提示与英雄榜的显示等等。
具体的程序结构如下操作方法及运行结果根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。
贪吃蛇的内容主要包括:普通模式用上下左右控制方向,随机出现食物,但是如果碰到边框,障碍物和自己都会挂掉;死亡模式用上下左右控制方向,小蛇获得了穿越边框的能力,但是得了恶性长胖病,可以通过吃减肥药来偏强控制,但是不要碰到自己排除的废物;情侣模式玩家1用上下左右控制方向,用P、O、I(或者是1、2、0)来发射子弹,可以后退,不能穿越边框玩家2用W,A,S,D来控制方向,空格键释放陷阱子弹和陷阱都需要food才能补充;英雄榜能够记录正常模式和死亡模式游戏时间,游戏成绩,游戏排行,玩家姓名;按下帮助键可获得游戏帮助说明。
设计体会我学会了用Qt编写贪吃蛇游戏,能熟练地掌握Qt语言,通过每章每节的学习让我知道了Qt的重要性,学习Qt能让我们深刻的知道在以后的工作中能用到,还有让我知道学习的重要意义,通过对Qt的学习能让我们解决很多的实际东西,QT能让我们锻炼自己的编程能力,还能处理许多别的语言处理不了的东西,我知道了学习Qt不仅能提高自己的认识,还巩固了对原来学过的其他语言的学习。
QT贪食蛇的设计

某某学院信息工程系——××届××专业毕业论文姓名:班级:计算机应用技术设计课题:QT贪食蛇的设计指导教师:2012年11月25日目录第一章嵌入式系统 (2)1.1简介 (2)1.2 组成 (2)1.2.1硬件层 (3)1.2.2 中间层 (5)1.3 特点 (5)1.3.1 可裁剪性 (5)1.3.2 强实时性 (5)1.3.3 统一的接口 (5)1.3.4 方便 (5)1.3.5 强稳定性,弱交互性 (6)1.3.6 固化代码 (6)1.3.7 适应性 (6)第二章需求分析 (7)2.1 游戏开发的可行性 (7)2.1.1 操作可行性 (7)2.1.2 技术可行性 (7)2.1.3 经济可行性 (7)2.2 游戏的功能性需求 (7)2.3 游戏的目的 (8)2.4 要解决的问题 (8)2.5 提出的要求 (8)2.6 可以实现的要求 (8)2.7 应该有的对象及其他们之间的关系 (9)2.8 关键点 (9)第三章贪食蛇分析 (10)3.1 关于贪食蛇 (10)3.2 贪食蛇要求 (10)3.3 贪食蛇功能 (10)3.4 贪食蛇设计思想 (11)3.5 贪食蛇游戏功能 (11)第四章贪食蛇设计 (12)4.1 系统的输入输出 (12)4.1.1 输入 (12)4.1.2 输出 (12)4.1.3 蛇的移动 (12)4.1.4 蛇吃食物 (12)4.2 游戏主要功能实现 (12)4.2.1 游戏结构 (12)4.2.2 游戏流程 (13)第五章软件实现 (15)5.1 变量函数及资源的声明 (15)5.1.1 头文件 (15)5.1.2 源文件 (17)5.2 主要功能的实现 (21)5.2.1 游戏界面 (21)5.2.2 游戏技巧 (22)5.2.3 游戏心理 (22)5.2.4 开始游戏 (22)第六章系统测试与总结 (27)6.1 系统测试 (27)6.2 总结 (27)致谢 (28)引言内容提要:随着计算机的普及,电脑游戏也慢慢融入人们的生活中,成为人们放松心情的一种方式。
Qt课程设计--贪吃蛇游戏设计

Qt课程设计说明书题目: 贪吃蛇游戏设计目录功能需求 (3)界面要求 (3)其他要求 (4)设计分析 (4)操作方法及运行结果 (4)设计体会 (6)参考文献 (6)功能需求利用Qt creator制作一个贪吃蛇的小游戏,要求:(1)在窗口上显示菜单栏,帮助栏和工具栏(2)游戏含有正常模式、死亡模式、情侣模式三种(3)能够记录游戏时间,游戏成绩,游戏排行(4)能够显示英雄榜(5)能够显示帮助提示界面要求贪吃蛇游戏的游戏界面包括背景图片、工具栏图片、蛇移动范围的绘制等等。
其中贪吃蛇的身体用什么方法绘制,才可以使得其在游戏过程中可以实现“吃”的功能是很重要的。
因此在游戏界面的初始绘制时就必须考虑到游戏时可能遇到的问题。
导入位图以及菜单工具条后,游戏未开始前(win7系统下)的界面显示如图2-1所示其他要求能够注意各种异常处理,注重提高程序运行效率设计分析根据分析,贪吃蛇这个程序一共要实现如下几个功能,包括游戏方面正常模式、死亡模式以及情侣模式,游戏帮助提示与英雄榜的显示等等。
具体的程序结构如下操作方法及运行结果根据分析后的贪吃蛇结构设计出相应的贪吃蛇流程。
贪吃蛇的内容主要包括:普通模式用上下左右控制方向,随机出现食物,但是如果碰到边框,障碍物和自己都会挂掉;死亡模式用上下左右控制方向,小蛇获得了穿越边框的能力,但是得了恶性长胖病,可以通过吃减肥药来偏强控制,但是不要碰到自己排除的废物;情侣模式玩家1用上下左右控制方向,用P、O、I(或者是1、2、0)来发射子弹,可以后退,不能穿越边框玩家2用W,A,S,D来控制方向,空格键释放陷阱子弹和陷阱都需要food才能补充;英雄榜能够记录正常模式和死亡模式游戏时间,游戏成绩,游戏排行,玩家姓名;按下帮助键可获得游戏帮助说明。
设计体会我学会了用Qt编写贪吃蛇游戏,能熟练地掌握Qt语言,通过每章每节的学习让我知道了Qt的重要性,学习Qt能让我们深刻的知道在以后的工作中能用到,还有让我知道学习的重要意义,通过对Qt的学习能让我们解决很多的实际东西,QT能让我们锻炼自己的编程能力,还能处理许多别的语言处理不了的东西,我知道了学习Qt不仅能提高自己的认识,还巩固了对原来学过的其他语言的学习。
用QT写的贪吃蛇游戏__[日期:

用QT写的贪吃蛇游戏[日期:2011-04-09] 来源:Linux社区作者:fuzhuo233好久不用C++,怕忘了,于是拿起Qt来写写以前把俄罗斯方块写了,这会写个贪吃蛇也没看过别的算法…,希望这个效率还好吧关键的蛇体移动算法,是将头的前面一个置1,然后删除尾点,再将蛇体除头外全部+1,得到新蛇void snake::gotoXY(int x,int y)//移动函数,每次只一步!!{MAP[x][y]=1;head.x=x;head.y=y;//新建头点MAP[trail.x][trail.y]=NOTHING;//清除尾点bool flag_trail=false;for(int i=1;i<=HEIGHT;i++)for(int j=1;j<=WIDTH;j++){if(MAP[i][j]==length-1 && flag_trail==false)//得到尾{trail.x=i;trail.y=j;flag_trail=true;}if( MAP[i][j]>0 && !(i==x && j==y) ){MAP[i][j]+=1;//除了新的头点所有点编号加1}}}主要构架class snakeWidget : public QWidget{Q_OBJECTpublic:snakeWidget(QWidget *parent);~snakeWidget();virtual void keyPressEvent(QKeyEvent *e);//从覆盖写QWidget的键盘事件private:QLabel *lab;//用以显示游戏图片的部件QPixmap pix;//游戏图片的暂存QTimer *timer;//定时器,产生固定帧速snake *mysnake;//蛇1实例#if SNAKE_2snake *mysnake2;//蛇2实例#endifint width_map;//游戏点阵长int height_map;//游戏点阵宽private:void initial();//初始化void freshScreen();//刷新屏幕void calcFood(int flag);//将两条蛇的食物变成同一个public slots:void updateFrame(int num=0);//取得下一帧图形};struct coordinate{int x;int y;};struct Body{coordinate cord;struct Body *next;};class snake{public:snake(int x,int y);~snake();void createBody(int x,int y);//产生蛇体void getFood();//蛇听得到食物时动作bool setFood(int x,int y);//强制设定食物位置void clearFood();//清楚食物(只是在画图上)bool createFood();//产生食物void resetFood();//重置食物public:int MAP[HEIGHT+2][WIDTH+2];//地图及蛇体数据:-2为空 -1为墙 0为food 1及以后为Body各段编号四周加了一圈虚拟的墙public:enum director{UP,DOWN,LEFT,RIGHT}direct;//蛇的移动方向int length,ori_x,ori_y;//蛇的长度,及蛇头的默认坐标int width_map,height_map;//点阵的长宽数int score;//游戏得分coordinate head,trail;//头、尾的坐标值coordinate snakeFood;//食物的坐标值bool gameOver;//游戏结束标志public:void moveStep();//产生下一帧数据 void gameReset();//游戏复位int moveUp();//移动函数int moveDown();int moveLeft();int moveRight();void gotoXY(int x,int y); };。
Qt贪吃蛇

嵌入式大作业Ubuntu平台贪吃蛇游戏的设计与实现作者姓名:学科、专业:学号:指导教师:完成日期:大连大学Dalian University教师批阅页选题分内容分格式分态度分总计:分简略给出评语或指出文中问题:评阅人:完成日期:摘要随着计算机的普及,电脑游戏也慢慢融入人们的生活中,成为人们放松心情的一种方式。
贪食蛇作为一款经典且易于操作的游戏,一直受到人们的青睐,在繁忙的工作之余,玩贪食蛇游戏实在是既省钱又有趣味的休闲方式。
本设计遵循C++程序设计的基础原理,制作出一个精美的贪吃蛇小游戏。
本设计采用Qt Creater作为主要的开发工具,很好的实现了贪吃蛇游戏的基本功能。
关键词:C++;贪吃蛇;Qt Creator摘要 (3)前言 (1)第一章Qt库的优点 (2)1.1可移植性 (3)1.2易用性 (3)1.3运行速度 (3)第二章课程设计目的和要求 (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)前言Qt Creator是跨平台的 Qt IDE, Qt Creator 是 Qt 被 Nokia 收购后推出的一款新的轻量级集成开发环境(IDE)。
此 IDE 能够跨平台运行,支持的系统包括 Linux(32 位及 64 位)、Mac OS X 以及 Windows。
Qt Creator 的设计目标是使开发人员能够利用 Qt 这个应用程序框架更加快速及轻易的完成开发任务。
在功能方面,Qt Creator 包括项目生成向导、高级的 C++ 代码编辑器、浏览文件及类的工具、集成了Qt Designer、Qt Assistant、Qt Linguist、图形化的 GDB 调试前端,集成 qmake 构建工具等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Qt的贪吃蛇游戏设计与实现
作者:成丽君张宇波
来源:《电子技术与软件工程》2013年第23期
摘要:本文中描述的系统是基于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。