《毕业设计(论文)基于VC的俄罗斯方块.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)基于VC的俄罗斯方块.doc(30页珍藏版)》请在三一办公上搜索。
1、编 号: 090619 审定成绩: 先锋软件学院2012届毕业设计(论文)题目: 基于VC的俄罗斯方块 分 院: 软 件 分 院 学生姓名: 专 业: 电 脑 游 戏 班 级: 学 号: 指导教师: 填表时间:2012年 03月学生毕业设计(论文)工作自查表(2011年11月- 2012年4月检查)学生姓名专业电脑游戏学号200900008920导师姓名职称讲师导师每周指导次数5次每次: 1小时题目名称基于VC的俄罗斯方块作息时间上午8:3012:00下午2:004:30晚间7:008:30个人精力实际投入日均工作小时7小时周均工作小时35小时缺席天数无出勤率%100%毕业设计(论文)工作进度
2、已完成主要内容100%待完成主要内容0%完成 封面摘要引言第一章 绪论第二章 可行性研究第三章 需求分析第四章 设计基本的游戏功能第五章 程序主要功能设计及按键事件的控制第六章 程序设计思想与流程图致谢参考文献本毕业设计基本完成。存在问题工作措施存在问题:在开发设计中存在诸多问题工作措施:在网上进行了查阅以及学习以及询问导师指导教师(签字): 日期: 年 月 日 先锋软件学院毕业论文(设计)评阅表(指导教师、评阅人用)论文(设计)名称学生姓名学号指导教师或评阅人)姓名序号评审项目指标满分评分1论文(设计)完成量论文(设计)内容完成量,难易程度符合教学基本要求202调查与综合根据论文(设计)任务
3、,能独立查阅文献资料和从事其它有关调研。有收集、综合和正确利用各种信息的能力。203论文(设计)质量文章切合选题,材料丰富、内容充实,观点明确、论据充分、论证严格,构思完整、层次分明、段落、论题间的衔接自然、舒展。文笔流畅、语言通顺、使用专业术语准确,图表清楚,符合要求。504创新有独特的见解,或有一定应用价值10总分评语:(明确指出论文(设计)的调研论证材料收集是否适合论点要求、创新点、论文(设计)论证能力、写作水平,同时要明确指出论文(设计)的不足之处及改进方向。) 评阅人: 年 月 摘 要俄罗斯方块是有史以来最伟大的游戏之一。它是永恒的娱乐经典,但它实际上又和那些传统的经典娱乐方式不同,
4、因为它的本质是电子化的,所以它的确属于现代产物。俄罗斯方块举世闻名的游戏性,在该游戏新鲜出炉时就显得非常直观。某些与坠落的玩具碎片和它们的形状有关的东西,使得哪怕新手也会很自然地企图把它们排列起来,并加以适当组合,就好似俄罗斯方块触动了我们某些内在的感官,使得哪怕是我们当中最杂乱无章的人也要把事情整理妥当。俄罗斯方块是一款风靡全球的掌上游戏机和PC机游戏,它造成的轰动与创造的经济价值可以说是游戏史上的一件大事。它由俄罗斯人阿列克谢 帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。它看似简单却变化无穷,俄罗斯方块上手
5、极其简单,但是要熟练地掌握其中的操作与摆放技巧,难度却不低。作为家喻户晓老少皆宜的大众游戏,其普及程度可以说是史上任何一款游戏都无法相比的。相信大多数人都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。俄罗斯方块是个老幼皆宜的小游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机定时器控制它在一定的时间不停的产生,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,(用信号和槽函数的关联来实现对按键事件的控制)。然后程序根据这七种方块堆叠成各种不同的模型。Qt是诺基亚开发的一个跨平台的C+图形用户界面应用程序框架。它提供给应用程
6、序开发者建立艺术级的图形用户界面所需的所用功能。论文描述了游戏的历史,开发此游戏的环境,游戏开发的意义。遵循软件工程的知识,从软件问题定义开始,接着进行可行性研究、需求分析、概要设计、详细设计,整个开发过程贯穿软件工程的知识体系。此次设计在Linux系统下,以QT+Creator为开发语言,使用C+和QT库来进行游戏的设计与实现。关键词:游戏设计;算法;数组;事件目 录摘 要1目 录.2引 言31绪 论 41.1电子游戏及其分类31.2电子游戏发展现状41.2.1 电子游戏在国外的发展现状42.可行性研究.52.1设计目的62.2 软件问题定义 62.3 可行性分析 63.概要设计.73.1游
7、戏设计方案的确定73.2系统流程结构设计83.3各个功能模块图设计83.3.1模型层功能模块图设计.83 3 2试图层功能模块图设计 93.3.3 控制层功能模块设计 94.详细设计代码.10总 结 25致 谢 26参 考 文 献 27引 言游戏是人们活动中一项非常重要的内容,有人认为如果哪一天人类对所有的游戏都失去兴趣,恐怕世界的末日就要到了。电脑对游戏的贡献有目共睹,现在摸过电脑的人很少有没玩过电脑游戏的,喜欢游戏的人也很少有不玩电脑的。俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾经造成的轰动与造成的经济价值可以说是游戏史上的一件大事。这款游戏最初是由苏联的游戏制作人Alex
8、 Pajitnov制作的,它看似简单但却变化无穷,令人上瘾。相信大多数用户都还记得为它痴迷得茶不思饭不想的那个俄罗斯方块时代。究其历史,俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。对一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,而在联众俄罗斯方块中,更有一些联众网络游戏所独有的魅力有单机作战与两人在线对战两种模式,用户可任选一种进行游戏。网络模式还增加了积分制,使用户既能感受到游戏中的乐趣,也给用户提供了一个展现自己高超技艺的场所。俄罗斯方块游戏可以说是随计算机的发展而发展,并不断推陈出新演变出各种
9、类似游戏, 深受广大玩家喜爱。这个游戏有的简单, 有的复杂, 但其根本原理是一样的都是对运动的方块进行组合, 来训练玩家的反应能力。谈到游戏软件, 大多数人都认为其神妙莫测, 高不可及。而一般游戏软件也确实具有很高的技术难度, 随着开发工具及软件开发方法学的不断发展, 动手开发游戏也不是十分困难的。俄罗斯方块游戏是一种古老而又有趣的游戏, 游戏软件不计其数, 网上就有好多关于实现的复杂算法和设计, 其难度让一般初学者望而却步。本文利用数组作为方块的数据结构,提出一种用pascal语言实现的简易方法, 对初学者可仿此开发类似游戏, 并了解游戏软件的设计与开发过程。 1. 绪 论1.1电子游戏及其
10、分类电子游戏,也就是运行在家用电脑、家用电子游戏机或是掌中宝游戏机及街机上的电子游戏程序。电子游戏是一种结合剧情故事、美术、音乐、动画、程序等技术于一身的互动型娱乐软件,涉及到多个行业。 从电子游戏的分类来看,有着多种分类方式。传统的游戏分类是按照游戏类型,将其分为即时战略游戏、第一人称射击游戏、角色扮演游戏、策略型游戏等类别。根据游戏运行平台的不同,可将电子游戏分为游戏机游戏、单机版PC 游戏、互动电视游戏、在线游戏和手机游戏。此外,韩国政府将电子游戏业分为家用游戏机游戏、单机版PC 游戏、网络游戏和街机游戏四大类。考虑到中韩游戏业比较接近,论文采用韩国的分类标准。“网络游戏”也就是人们一般
11、所指的“在线游戏”,是指通过互联网进行的电脑游戏,通过人与人之间的互动达到交流、娱乐和休闲的目的。在互联网(局域网)技术出现之前,电子游戏都可以归于单机版游戏,即“人机对战”游戏,或最多是双人对战游戏。而随着互联网技术的出现,通过连接游戏服务器,上百、上千、乃至上万的游戏玩家同时连线娱乐成为了现实,这就大大增加了游戏的互动性、真实性,丰富了电子游戏的内涵。从网络游戏的分类来看,目前业界还没有一个比较统一规范的分类。随着计算机设备和网络技术的发展,电子游戏在全球得到了迅猛的发展,取得了巨大的成功,已成为当今世界上不可缺少的精神粮食。1.2 电子游戏发展现状1.2.1 电子游戏在国外的发展现状电子
12、游戏是最初产生于美国,1971年,一个还在MIT就读的学生设计了世界上第一个业务用游戏机,这个街机游戏的名字叫电脑空间。可以说时至今日,电子游戏仍然是外国的天下。美国至今仍是世界第一大游戏市场,它遵循的是以发行商为主的产业开发链模式,根据美国市场调查公司NPD Group调查统计,美国2004年游戏总销售金额(包括家用、掌上型主机及软件)为99亿美元,占了全球游戏市场的45%。其中游戏软件销售的具体数字是:视频游戏软件的销售额达52亿美元(1.6亿套),PC游戏软件销售额达11亿美元(4500万套),掌机游戏销售额达10亿美元(4230万套)。2004年一共大约有2.48亿套游戏售出。据估计,
13、美国每个家庭平均购买过2部游戏3。日本近20年来疯狂赚电子游戏的钱。从上世纪60年代初的街机,到六七十年代之间的家用游戏机,再到八九十年代的掌上游戏机,日本经过30多年的耕耘,终于把电子游戏这棵“摇钱树”,培育成第一时尚娱乐产业,垄断全球业界长达10余年。对于日本来说,电玩业已是国家经济的重要支柱之一,在GDP中占有1/5的举足轻重地位。日本游戏业在最辉煌的1998年,曾经占领全球电子游戏市场硬件90%以上,软件50以上。韩国号称世界上网络游戏产业最发达国家之一。迄今为止,国内网络游戏市场有超过60%的产品来自韩国游戏软件开发商,韩国网络游戏使国内很多游戏运营公司在游戏营销市场或股票资本市场上
14、获得了巨大的成功。 韩国游戏市场的发展不是偶然,韩国政府不仅给游戏产业以正确的定位和引导,更是将其和本国经济发展紧密地联系到一起,做了很多市场培育方面的工作。韩国政府认识到,靠重型工业来支撑全国经济的做法是片面的,于是将、娱乐产业视为新的经济增长点,开始大力扶持。从那时起,科技含量极高而能源消耗极低的游戏制作及相关产业担负起了“富国兴邦”的重担。由文化观光部出面组建韩国游戏支援中心,向韩国游戏产业提供从资金到技术上的多方面支援;成立游戏投资联盟,政府每年向游戏产业投入的资金多达亿韩元,并为游戏企业提供长期的低息贷款;设立信息化基金和文化产业基金,为游戏产业服务;对指定的风险企业实行各种税制优惠
15、政策,减少甚至免除游戏企业的税务负担;建设游戏产业基地以扶持中小游戏企业的发展;对从事游戏产业的高科技人才免除两年的兵役。 在韩国,从制作到运营,一个网络游戏公司起步门槛较低,主要得益于政府实行的援助计划。此外,在有利的政策形势下,韩国出现了众多的游戏院校,一些原本不涉足此领域的大学也开设了游戏相关专业课程,以大力培养游戏专业人才,从而为游戏生产提供了基础保障。2可行性研究2.1 设计目的通过本游戏的设计,综合自己在校期间所学的理论知识,设计开发俄罗斯方块游戏,使自己熟悉应用系统的开发过程,培养独立思考能力,检验学习效果和动手能力,初步掌握软件工程的系统理论,初步掌握MVC这种设计模式,进一步
16、巩固和加强自身对j2se基础知识的理解,提高自己的编程水平,从而达到理论与实践相结合的目的。2.2 软件问题定义基本要求:本游戏开发的总体任务是实现游戏的可操作性,以及界面的美观性。整个开发过程遵循软件工程规范,采用PASCAL编程来实现界面以及事件的控制,用户根据键盘的四个方向键控制翻转、向左、向右和向下操作,通过菜单栏中的相应菜单选项实现游戏的开始、结束、变换方块、积分以及等级的功能。目标:通过本游戏的开发,主要实现游戏的可操作性以及美观性,同时使自己对PASCAL语言的了解更进一层,为将来的实际工作打下坚实的基础。条件、假定和限制:由于知识以及能力的限制,本游戏所实现的功能不够强大,可对
17、本游戏进行改善,从而增强游戏的功能。可行性研究的方法:通过研究分析俄罗斯方块所具备的能力及实现的方法、确定主体结构。利用现阶段我所能达到的能力,以最简洁、最容易的办法,边开发边测试边修改,实现一个初级游戏软件。评价尺度:由于本软件是一个初级产品,对其要求不是太苛刻,所以能够达到俄罗斯游戏的一般功能即可。2.3 可行性分析 技术可行性:开发本游戏的编程语言有多种,考虑到自身对语言的掌握程度,选择PASCAL语言进行游戏的开发,采用PASCAL编程来实现界面以及事件的控制。 经济可行性:本游戏的开发旨在完成毕业设计,不注重直接的经济效益和其后的发展方向,只在注重自身水平和能力的提高,对自身的经济要
18、求也不高,只要有一台能运行相应JAVA程序的手机便可,所以不用考虑到经济问题。社会可行性:本游戏的开发主要为了完成毕业设计,开发的主体是个人,不存在法律上的侵权行为,也不会为社会造成影响,这方面是完全可行的。 3 概要设计31 游戏设计方案的确定 本游戏的设计采用MVC模式(Model -View -Controller),即把本游戏的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样本游戏的设计被分成三个层模型层、视图层、控制层。MVC模型图如下所示:32 系统流程结构设计触发按键事件图形工厂类图形类障碍物类中央控制器处理按键事件处理逻辑显示面板显示生产3
19、3 各个功能模块图设计3.3.1 模型层(Model)功能模块图设计图形工厂图形障碍物生产图形下落产生障碍物3.3.2 视图层(View)功能模块设计游戏面板GamePanel方块的显示障碍物的显示3.3.3 控制层(Controller)功能模块设计 中央控制器Controller类图形工厂生产图形显示面板显示图形和障碍物处理按键和鼠标事件4 详细设计代码Tetris - a MIDletPascal implementation of a classic game.You are allowed to use this code free, change it on yourown wil
20、l, use it, distribute it etc., as long as you make no profit outof it.program Tetris;const fieldWidth = 10;fieldHeight = 15;vargameField: array1.fieldWidth, 1.fieldHeight of integer;block: array1.4, 1.4 of integer;blockX, blockY: integer;blockSize: integer;screenWidth, screenHeight: integer;screenX,
21、 screenY: integer;score: integer;time: integer;gameRunning: boolean;gameSpeedDelay: integer;pauseCommand, quitCommand, clickedCommand: command;gamePaused: boolean;procedure rotateRight; forward;function blockPositionValid: boolean; forward;welcomeScreen - display the wellcome screenprocedure welcome
22、Screen;var textToDisplay : string; textXPos : integer; textYPos : integer; keyCode : integer;beginsetColor(255, 0, 255); fillRect(0, 0, screenWidth, screenHeight); setColor(0, 0, 255); setFont(FONT_FACE_PROPORTIONAL, FONT_STYLE_BOLD, FONT_SIZE_LARGE); textToDisplay := Tetris; textXPos := (screenWidt
23、h - getStringWidth(textToDisplay) div 2; textYPos := (screenHeight - getStringHeight(textToDisplay) / 2; drawText(textToDisplay, textXPos, textYPos); textYPos := textYPos + getStringHeight(textToDisplay); setColor(0, 0, 0); setFont(FONT_FACE_PROPORTIONAL, FONT_STYLE_PLAIN, FONT_SIZE_SMALL); textToDi
24、splay := Created with MIDletPascal; textXPos := (screenWidth - getStringWidth(textToDisplay) div 2; drawText(textToDisplay, textXPos, textYPos); textYPos := textYPos + getStringHeight(textToDisplay); textToDisplay := Press any key; textXPos := (screenWidth - getStringWidth(textToDisplay) div 2; draw
25、Text(textToDisplay, textXPos, textYPos); repaint; wait until user presses any key repeat keyCode := getKeyClicked; until keyCode 0;end; gameOver - displays the game over screenfunction gameOver: boolean;var textToDisplay : string; textXPos : integer; textYPos : integer; keyCode : integer;newGame : c
26、ommand; quit : command; clickedCommand: command;begin setColor(255, 255, 255); fillRect(0, 0, screenWidth, screenHeight); setColor(255, 0, 0); setFont(FONT_FACE_PROPORTIONAL, FONT_STYLE_BOLD, FONT_SIZE_LARGE); textToDisplay := Game over!; textXPos := (screenWidth - getStringWidth(textToDisplay) div
27、2; textYPos := (screenHeight - getStringHeight(textToDisplay) / 2; drawText(textToDisplay, textXPos, textYPos); textYPos := textYPos + getStringHeight(textToDisplay); repaint; newGame := createCommand(Play, CM_SCREEN, 1);quit := createCommand(Quit, CM_EXIT, 1);addCommand(newGame);addCommand(quit); w
28、ait until user presses any key repeat delay(100); clickedCommand := getClickedCommand; until (clickedCommand emptyCommand); if clickedCommand = quit thengameOver := true;elsegameOver := false;removeCommand(newGame);removeCommand(quit);end;setSizes - calculates the size of a single blockand the posit
29、ion of the game fieldprocedure setSizes;var blockWidth, blockHeight: integer;beginscreenWidth := getWidth;screenHeight := getHeight;blockWidth := screenWidth / fieldWidth;blockHeight := screenHeight / fieldHeight;if blockHeight blockWidth then blockSize := blockWidth;elseblockSize := blockHeight;scr
30、eenX := (screenWidth - blockSize*fieldWidth) / 2;screenY := (screenHeight - blockSize*fieldHeight) / 2;end;initializeGameField - makes the game field emptyprocedure initializeGameField;var i, j:integer;beginfor i:=1 to fieldWidth dofor j:=1 to fieldHeight dogameFieldi, j := 0;end;drawScore - writes
31、the score on the screen in blackprocedure drawScore;var stringWidth, stringHeight: integer;outputText: string;beginoutputText := Lines: + score;stringWidth := getStringWidth(outputText);stringHeight := getStringHeight(outputText);setFont(FONT_FACE_PROPORTIONAL, FONT_STYLE_PLAIN, FONT_SIZE_SMALL);set
32、Color(0, 0, 0);drawText(outputText, (screenWidth - stringWidth) / 2, (screenHeight - stringHeight) / 2);end;drawBlock - draws a single game blockprocedure drawBlock(col, row, color: integer);var red, green, blue: integer;begin set the color if color = 1 then red := 255;if color = 2 then green := 255
33、;if color = 3 then blue := 255;if color = 4 then begin red := 255; green := 255; end;if color = 5 then begin red := 255; blue := 255; end;if color = 6 then begin green := 255; blue := 255; end;if (color 0) and (row 0) and (row 0) and (col = fieldWidth) thenbeginrow := row;col := col - 1; draw the li
34、ght block fill setColor(red, green, blue);fillRect(screenX + col*blockSize, screenHeight - screenY - row*blockSize, blockSize, blockSize); draw the dark border around the block setColor(red/2, green/2, blue/2);drawRect(screenX + col*blockSize, screenHeight - screenY - row*blockSize, blockSize, block
35、Size);end;end;redrawGameScreen - redraws the screen with all the blocks procedure redrawGameScreen;var i, j: integer;beginsetColor(0, 0, 0);fillRect(0, 0, screenWidth, screenHeight);setColor(255, 255, 255);fillRect(screenX, screenY, fieldWidth * blockSize + 1, fieldHeight * blockSize + 1); draw the
36、blocks that are down for i:=1 to fieldWidth dofor j:=1 to fieldHeight dodrawBlock(i, j, gameFieldi, j); draw the blocks that are falling for i:=1 to 4 dofor j:=1 to 4 dodrawBlock(i + blockX, j + blockY, blocki, j); draw the score text drawScore;repaint;end;createNewBlock - creates the new falling bl
37、ock. If you wantto change the falling shapes, do it here.procedure createNewBlock;var x, shape: integer;beginshape := random(7);x := random(6) + 1;if shape = 0 thenbeginblock1, 4 := 0; block2, 4 := x; block3, 4 := x; block 4, 4 := 0;block1, 3 := 0; block2, 3 := x; block3, 3 := x; block 4, 3 := 0;blo
38、ck1, 2 := 0; block2, 2 := 0; block3, 2 := 0; block 4, 2 := 0;block1, 1 := 0; block2, 1 := 0; block3, 1 := 0; block 4, 1 := 0;end;if shape = 1 thenbeginblock1, 4 := 0; block2, 4 := x; block3, 4 := 0; block 4, 4 := 0;block1, 3 := 0; block2, 3 := x; block3, 3 := 0; block 4, 3 := 0;block1, 2 := 0; block
39、2, 2 := x; block3, 2 := 0; block 4, 2 := 0;block1, 1 := 0; block2, 1 := x; block3, 1 := 0; block 4, 1 := 0;end;if shape = 2 thenbeginblock1, 4 := 0; block2, 4 := x; block3, 4 := 0; block 4, 4 := 0;block1, 3 := 0; block2, 3 := x; block3, 3 := x; block 4, 3 := 0;block1, 2 := 0; block2, 2 := 0; block3,
40、 2 := x; block 4, 2 := 0;block1, 1 := 0; block2, 1 := 0; block3, 1 := 0; block 4, 1 := 0;end;if shape = 3 thenbeginblock1, 4 := 0; block2, 4 := 0; block3, 4 := x; block 4, 4 := 0;block1, 3 := 0; block2, 3 := x; block3, 3 := x; block 4, 3 := 0;block1, 2 := 0; block2, 2 := x; block3, 2 := 0; block 4, 2 := 0;block1, 1 := 0; block2, 1 := 0; block3, 1 := 0; block 4, 1 := 0;end;if shape = 4 thenbeginblock1, 4 := 0; block2, 4 := x; block3, 4 := 0; block 4, 4 := 0;block1, 3 := 0; block2, 3 := x; block3