




已阅读5页,还剩21页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
QT 俄罗斯方块游戏的 设计与实现 作者姓名作者姓名 指指导导教教师师 所学所学专业专业班班级级 所属院系所属院系 学学习习年限年限 年年月至月至年年月月 二年月 学号:学号: 本 科 毕 业 论 文(设 计) 目目 录录 内容提要 .I 引言 .1 1. 绪论 .1 1.1 游戏的历史 .1 1.1.1 从头谈起.1 1.1.2 图形硬件的革命.2 1.2 游戏的意义与内涵 .2 1.3 游戏的组成要素.2 2. 可行性研究 .3 2.1 设计目的.3 2.2 可行性研究前提.4 2.3 可行性分析.4 2.4 结论意见.4 3. 需求分析 .5 3.1 引言.5 3.2 游戏需求.5 4. 设计基本的游戏功能 .5 4.1 方块类定义函数.6 4.2 程序核心函数.7 5. 程序主要功能设计及按键事件的控制 .7 5.1 建立工程.7 5.2 添加定时器和开始按钮.8 5.3 添加暂停和重新开始按钮,完成基本的控制功能.9 5.4 改变颜色和给方块添加图片.10 5.5 是否显示背景网格和下一个要出现的方块.10 5.6 添加方块移动的声音.11 5.7 添加向下按钮步数设置.12 5.8 添加方块.12 5.9 设置旋转游戏区.12 3 6程序设计思想与流程图 .13 6.1 游戏实现的核心方法.13 6.2 游戏是怎么实现显示现在和已有的图形的。.13 6.3 游戏是怎么判断方块已经重合的.13 6.4 游戏是怎么进行消行的.14 6.5 对于改变图形后越界或和别的图形重合的处理方法.14 6.6 按键事件 .15 致谢 .1 参考文献 .1 ABSTRACT .1 I QT 俄罗斯方块游戏的设计与实现 学生姓名: 指导教师: 内容提要 俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数 组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机定时器控制它在一定的时间不停的 产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作, (用信号和槽函数的关联来实现对 按键事件的控制)。然后程序根据这七种方块堆叠成各种不同的模型。Qt 是诺基亚开发的一个跨平台的 C+图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。 论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。遵循软件工程的知识,从软件问题定义 开始,接着进行可行性研究、需求分析、概要设计、详细设计,整个开发过程贯穿软件工程的知识体系。 此次设计在 Linux 系统下,以 QT+Creator 为开发语言,使用 C+和 QT 库来进行游戏的设计与实现。 关键词 数组 定时器 信号 槽函数 QT 1 引言 在现今电子信息高速发展的时代,电子游戏已经深入人们的日常生活,成为老少皆宜的娱乐方式。 俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可 以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人 Alex Pajitnov 制作的,它看似简 单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时 代。究其历史,俄罗斯方块最早还是出现在 PC 机上,而我国的用户都是通过红白机了解、喜欢上它的。 现在 QQ 等游戏平台又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单, 容易上手,且游戏过程变化无穷,而在游戏平台上的对战模式更增加了它的娱乐性和挑战性,使用户 既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。 俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种类似游戏, 深受广 大玩家喜爱。这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来 训练玩家的反应能力。谈到游戏软件, 大多数人都认为其神妙莫测, 高不可及。而一般游戏软件也确 实具有很高的技术难度, 随着开发工具及软件开发方法学的不断发展, 动手开发游戏也不是十分困难 的。俄罗斯方块游戏是一种古老而又有趣的游戏, 游戏软件不计其数, 网上就有好多关于实现的复杂 算法和设计, 其难度让一般初学者望而却步。本文利用数组作为方块的数据结构,提出一种用 C 语言 和 C+来实现的方法, 对初学者可仿此开发类似游戏, 并了解游戏软件的设计与开发过程。 1. 绪论 1.1 游戏的历史 游戏开发至今已经有 30 多年,在这个短暂的时期里,随着硬件水平的提高,游戏开发新技术层出不 穷,经典游戏比比皆是。 1.1.1 从头谈起 真正的电子游戏机产生于 20 世纪 70 年代。1971 年,麻省理工学院的学生 Nolan Bushnell 设计 了世界上的第一个业务用游戏机(俗名街机) ,叫做电脑空间 。这台游戏机用一台黑白电视机作为 显示屏,用一个控制柄作为操纵器,不过由于市场因素这款游戏以失败告终。但是最后他在电子游戏 2 的发展上取得了非凡的成就。 上面介绍的是专用机游戏的历史,而最早的电脑游戏可以追溯到 1972 年,一个叫 Crowther 的工 程师用当时最流行的主机DEC 公司的 PDP10 编写一段简单的 FORTRAN 程序。在这个程序里, Crowther 设计了一张地图,地图上不规则的分布着陷阱,游戏者必须寻找路径避开陷阱。这个程序被 公认为是最早的电脑游戏程序。 1989 年,BroderBund 公司的设计师乔丹.麦克纳根据阿拉伯民族的古老传说一千零一夜在 Apple 平台上制作了一部动作冒险相结合的电脑游戏波斯王子。这个游戏获得了第一作,它代表 了当时电脑技术的最高水平。 1986 年,任天堂公司发售了一款真正的游戏巨作超级马里奥。 20 世纪 80 年代 IBM PC 兼容机的出现打破了 Apple 公司的垄断地位。 到了 20 世纪 90 年代,游戏业才真正成熟起来,成为了一种产业。 由于 PC 机价格非常低而且硬件速度越来越快,游戏逐渐成为人们生活中不可缺少的一部分。游 戏产业也逐渐发展成熟。 1.1.2 图形硬件的革命 图形硬件的飞速发展是近些年来的事情,部分原因是来自工业方面的压力,例如在军事和医疗方 面对于实时图形的需求很强烈,而交互娱乐产业也极大的推动了图形硬件的发展。技术上的因素同样 也推动着图形硬件的发展,许多图形算法可以很容易地表达为并行方式,这样硬件执行的效率变得很 高。摩乐定律也起了作用,越来越多的晶体管可以集成到一块单独的芯片上。 在所谓的 GPU(图形处理器)概念出现以前,特殊的图形硬件只出现在诸如 SGI 和 E 4在 widget.cpp 的构造函数里添加语句。 Widget:Widget(QWidget *parent) : QWidget(parent), ui(new Ui:Widget) ui-setupUi(this); this-resize(800,500); 8 this-gameArea = new GameArea(this); 这里重新设定了主窗口大小,并在主窗口上新建了一个游戏区域对象。 5.2 添加定时器和开始按钮 1在 widget.h 里的 private 中添加定时器对象和分数变量的声明。 QTimer *timer; int score; 在 public 中添加显示分数函数的声明。 void doScore(int); 添加槽函数的声明。 private slots: void timer_upDate(); 2在 widget.cpp 文件中的构造函数里添加下面的语句: this-timer = new QTimer(this); connect(this-timer,SIGNAL(timeout(),this,SLOT(timer_upDate(); score =0; 定义了定时器并进行了信号和槽函数的关联,初始化分数为 0; 3然后在下面定义两个函数。 void Widget:timer_upDate() /定时器溢出处理 this-gameArea-moveOneStep(); /先移动一步,这时并没有显示出来 if(this-gameArea-isMoveEnd() /如果无法移动,到底了或结束了 if(this-gameArea-isGame_Over() /如果是结束了 this-timer-stop(); /停止计时 QMessageBox:warning(this,tr(warning),tr(Game Over!),QMessageBox:Yes); /弹出对话框 this-score =0; /清空分数 this-gameArea-init_Game(); /重新开始游戏 this-gameArea-gameStart(); this-timer-start(500); else /如果是移动到底了 this-gameArea-nextItem(); /出现下一个图形 int num = this-gameArea-getFullRowNum(); /获得已满的行数 this-doScore(num); /显示分数 this-gameArea-gameStart(); /继续游戏 9 else /如果没有到底 this-gameArea-do_MoveNext(); /显示方块下移一步后的界面 void Widget:doScore(int num) /显示分数 score += num*100; this-ui-label_2-setText(tr(%1).arg(score); 4在设计器中向主窗口上添加两个标签 label 和 label_2,其中 label 写上“你的分数是:” , label_2 写上“0” ;然后再添加一个开始按钮。 5然后右击“开始游戏”按钮,选择其单击事件的槽函数。更改如下。 void Widget:on_pushButton_clicked() /开始按钮 this-gameArea-init_Game(); /第一次进入游戏时进行的初始化 this-gameArea-gameStart(); /开始游戏 this-timer-start(500); /开启定时器 this-gameArea-setFocus(); /让游戏区域获得焦点,这样才能响应键盘 5.3 添加暂停和重新开始按钮,完成基本的控制功能 1在主窗口上添加“暂停游戏”和“重新开始”两个按钮。在“暂停游戏”按钮的属中 将 checkable 选中。 2分别进入两个按钮的单击事件槽函数。 void Widget:on_pushButton_2_clicked() /暂停按钮 if(this-ui-pushButton_2-isChecked() this-timer-stop(); this-ui-pushButton_2-setText(tr(取消暂停); else this-timer-start(500); this-ui-pushButton_2-setText(tr(暂停游戏); this-gameArea-setFocus(); void Widget:on_pushButton_3_clicked() /重新开始 10 this-timer-stop(); this-on_pushButton_clicked(); 3在 main.cpp 中添加语句,让程序中可以使用中文。 添加#include 的头文件包含。 在 main()函数里添加 QTextCodec:setCodecForTr(QTextCodec:codecForLocale();语 句。 5.4 改变颜色和给方块添加图片 1添加“更改颜色”按钮和“方块贴图”按钮。 2更改其单击事件槽函数。如下。 void Widget:on_pushButton_4_clicked() /改变颜色 this-gameArea-setGameAreaColor(QColor(255,255,0,qrand()%255); /更改游戏区域背景颜色 this-gameArea-setBoxBrushColor(QColor(0,255,0,qrand()%255); /更改小方块背景颜色 this-gameArea-setBoxPenColor(QColor(0,0,0,qrand()%255); /更改小方块边框颜色 this-gameArea-draw_gameArea(); /更新游戏区域 this-gameArea-setFocus(); void Widget:on_pushButton_5_clicked() /方块贴图 this-gameArea-set_draw_box_picture(true); /确认使用方块背景图片 this-gameArea-setBoxPicture(box.gif); /添加方块背景图片 this-gameArea-draw_gameArea(); /更新显示区域 this-gameArea-setFocus(); 3运行效果如下。 点击“改变背景”按钮后,游戏区域背景,方块的填充颜色和边框颜色都改变了。 5.5 是否显示背景网格和下一个要出现的方块 1添加“网格显示”按钮和“方块提示”按钮。并将它们属性中的 checkable 选中 2修改它们的单击事件槽函数。 void Widget:on_pushButton_6_clicked() /网格显示 if(this-ui-pushButton_6-isChecked() 11 this-gameArea-setDrawGrid(false); else this-gameArea-setDrawGrid(true); this-gameArea-draw_gameArea(); this-gameArea-setFocus(); void Widget:on_pushButton_7_clicked() /方块提示 if(this-ui-pushButton_7-isChecked() this-gameArea-setDrawNextItem(false); else this-gameArea-setDrawNextItem(true); this-gameArea-draw_gameArea(); this-gameArea-setFocus(); 5.6 添加方块移动的声音 1添加“打开声音”按钮,并将其属性中的 checkable 选中。 2修改其单击事件槽函数。 void Widget:on_pushButton_8_clicked() /声音开关 if(this-ui-pushButton_8-isChecked() this-gameArea-setPlaySound_itemChange(changeItem.wav,true); this-gameArea-setPlaySound_moveDown(moveDown.wav,true); this-gameArea-setPlaySound_moveLeft(moveLeft.wav,true); this-gameArea-setPlaySound_moveRight(moveLeft.wav,true); this-ui-pushButton_8-setText(tr(关闭声音); else this-gameArea-setPlaySound(false); /关闭音乐 this-ui-pushButton_8-setText(tr(打开声音); this-gameArea-setFocus(); 12 3我们把需要的声音文件放到工程文件夹下的 debug 文件夹下。只能是 wav 格式的。 5.7 添加向下按钮步数设置 1添加“是否坠落”按钮,并将其属性中的 checkable 选中。 2更改其单击事件槽函数。 void Widget:on_pushButton_9_clicked() /是否坠落 if(this-ui-pushButton_9-isChecked() this-gameArea-setKey_Down_Move_oneStep(true); /按一下向下方向键,下移一步 else this-gameArea-setKey_Down_Move_oneStep(false); /按一下向下方向键,移动到底 this-gameArea-setFocus(); 5.8 添加方块 1添加“添加方块”按钮。 2修改其单击事件槽函数。 void Widget:on_pushButton_10_clicked() /添加方块 this-gameArea-init_Game(); /清空游戏区域 this-gameArea-setbox(10,4); this-gameArea-setbox(10,5); this-gameArea-setbox(10,6); /在第 10 行第 4,5,6 列添加三个方块 this-gameArea-gameStart(); /重新开始游戏 this-gameArea-draw_gameArea(); this-gameArea-setFocus(); 5.9 设置旋转游戏区 1添加“旋转游戏”按钮。 2修改其单击事件槽函数。 void Widget:on_pushButton_11_clicked() /旋转游戏 this-gameArea-setRotate(true); 13 /开启旋转 this-gameArea-setGameAreaPixOrigin(100,200); /设置游戏区域新的坐标原点 this-gameArea-setGameAreaPix(-100,-200); /设置游戏区域的位置 this-gameArea-setRotateAngle(qrand()%360); /旋转度数 this-gameArea-draw_gameArea(); this-gameArea-setFocus(); 6程序设计思想与流程图 图 6.1 设计实现流程 6.1 游戏实现的核心方法 利用了数组对整个游戏区域进行存储。 6.2 游戏是怎么实现显示现在和已有的图形的。 利用了两个数组,方块每移动一步,都对整个数组进行一次备份。 6.3 游戏是怎么判断方块已经重合的 先尝试让方块移动一步,判断其是否与其他图形重合,如果不重合就移动。如果重合了,则执行其他 操作。代码如下: 14 for(int i=item_endRow;i=0;i-) /是否跟已有的图形重合 for(int j=3;j=0;j-) if(*(copyMap+(itemRow+i)*map_col+itemCol+j) i-) /从下向上扫描整张网格 for(int j=0;j0;row-) /让已满的行及其上面的各行均等于其上一行 for(int col = 0;colitemChange(currentItem); /进行图形变化 if(startX gameArea_width) startX = gameArea_width - 4*step; /右超界,则让其右边靠右 if(isMoveEnd() /如果和别的图形重合,则不让其改变 currentItem = tempItem; 6.6 按键事件 判断按键 判断可否变 形,图形变 化调用函数 判断可否移 动。可以则 移动 判断可否移 动。可以则 移动 判断可否移 动。可以则 默认下移一 步,否则下 到底 如不是这 4 个 按键,则接收 其他按键。 图 4.2 键盘事件功能图 16 致谢 大学四年的学习以今天的毕业论文画了一个句号。感谢大学四年,各位老师对我的教诲,感谢山 西大学商务学院信息工程学院,感谢大家有缘能在生命中重要的四年,出现在彼此的生活中,感谢上 天。 很幸运,在我大学的最后一次作业的完成中,能得到柳欣老师的指导与帮助,有了一次宝贵的机 会跟柳欣老师接触。柳欣老师严谨治学的态度,在我的心里留下深刻的影响,在以后的日子里,我要 学习柳欣老师的求实精神。这里,真诚的向柳欣老师说一句:柳欣老师,感谢您,祝您一切都好。 在此,同时感谢我的父母,对我的支持,没有他们的支持,我走不到今天。感谢与我共同走过大 学的朋友们、同学们,每个在我脆弱、困难的时候,扶过我一把的你,我都记得。感谢上天,感谢命 运,能有机会在彼此的生命中出现,并共同走过一个春天。感谢所有帮助过我的老师、同学、朋友, 感谢你们,希望你们在以后的日子里,开心、快乐,希望你们过得比我好! 17 参考文献 1 谭浩强,张基温,C 语言程序设计教程(第 3 版)M高等教育出版社,1991 年 08 月 2 陈超,C 语言常用函数速查手册M,化学工业出版社,2010 年 06 月 3 韦东山,嵌入式应用开发完全手册M,人民邮电出版社 4 黄丽琴,丁林松,Qt4 图形设计与嵌入式开发M,人民邮电出版社,2009 年 04 月 5 成洁,卢紫毅,Linux 窗口设计Qt4 精彩实例设计分析M,清华大学出版社,2008.11 6(加)布兰切特(Blanchette,J) , (英)萨默菲尔德(Summerfield,M)著,闫锋欣 译, C+GUI Qt4 编程(第二版)M,2008 年 08 月 7 蔡志明,精通 Qt4 编程(第 2 版)M,电子工业出版社,2011 年 2 月 8 (美)伊斯特(EEzust,A.) , (美)伊斯特(Ezust,P.)著,李仁见,战晓明 译,C+设计 模式基于 Qt4 开源跨平台开发框架M,清华大学,2007 年 8 月 9 肖林甫,肖季东,任桥伟,LinuxLinux 那些事儿之我是 USBM,电子工业出版社,2010 年 07 月 10 郑莉,董江周,C+语言程序设计(第 4 版)M,清华大学出版社,2010 年 07 月 18 QT Tetris Game Design and Implementation Abstract: Safe Tetris is a little young and old games, which implements the four square blocks of color composition, and then stored in an array of four elements, the comp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 纳米技术在印刷包装中的应用考核试卷
- 公司礼品系统管理制度
- 嵌入式应用中开发者的常见问题试题及答案
- 小公司经销商管理制度
- 培训信息登记管理制度
- 尿素产品运输管理制度
- 计算机二级MySQL快速入门试题及答案
- 更新知识的行政组织理论试题及答案
- 延期交付订单管理制度
- 医院药品巡查管理制度
- 眼球的结构与功能
- 《社会主义制度在中国的确立》示范课教学设计【高中思想政治人教版必修1中国特色社会主义】
- 立方米卧式浓硫酸储罐设计
- 三乙胺安全标签
- GB/T 4490-2021织物芯输送带宽度和长度
- GB/T 28650-2012公路防撞桶
- GB/T 17793-1999一般用途的加工铜及铜合金板带材外形尺寸及允许偏差
- ICU常见检查项目及课件
- 土地荒漠化的防治(公开课)课件
- MSA量测系统分析RMSA量测系统分析课件
- 中考备考应对中考历史学科的复习策略和解题技巧课件
评论
0/150
提交评论