版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上设计题目:模拟俄罗斯方块学生姓名:系 别: 专 业: 班 级: 学 号: 指导教师: 课 程 设 计 任 务 书题目 模拟俄罗斯方块 程序在文本窗口下输出特定字符模拟游戏俄罗斯方块的运行。在游戏过程中,每次能随机产生一种方块并自动下落,根据按键控制进行相应的平移、变形和加速下落。消去满行后,根据行数累计分数。分数达到一定值后,等级提升,下落速度加快。游戏区域积满后,游戏结束。同时能响应退出按键,提示是否退出游戏。完 成 期 限: 指导教师签名: 课程负责人签名: 俄罗斯方块的设计与实现第一章 引言1.1. 关于题目1.1.1. 题目要求利用Microsoft Visu
2、al C+编写一个文本窗口下的俄罗斯方块游戏。要求:(1) 利用类和多文件编写。(2) 能够记录游戏得分和等级。(3) 可暂停/继续游戏,使玩家在不愿游戏时退出。(4) 信息提示时显示颜色变化。1.1.2. 选题背景俄罗斯方块是家喻户晓的益智小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是俄罗斯方块是我第一个接触到的游戏,它的实现方法也吸引着我。我希望通过探索实践去实现它,在这次学习中从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。1.2. 关于编译软件本程序采用Microsoft Visual C+6.0的英文版本进行编译。VisualC+6.0是Microsoft公
3、司推出的基于Windows操作系统的可视化C+编程工具,尽管Microsoft公司推出了.NET平台的集成开发环境,但由于其良好的界面和可操作性,加上支持标准C/C+规范,但仍有相当多的编程人员使用VisualC+6.0进行应用系统的开发。1.3. 关于稳定性经测试,本程序可以在windows操作系统中稳定运行,较为稳定。第二章 程序设计2. 主要功能设计根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏、游戏的暂停继续、游戏控制和退出游戏。其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现
4、暂停的功能。程序结构如图2-1所示。图2-1 程序结构图2.1. 程序流程根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。同时可以响应Esc按键,提示是否退出程序。图2-2 流程图第三章 程序实现3. 类设计声明根据程序的结构,将俄罗斯方块需要实现的功能细化为相应的类成员函数。程序有两个类,一个view类,用于背景相关操作。
5、一个squar类,用于方块相关操作。3.1. view类class viewpublic:view();/类的缺省构造函数int getbgdata(int,int);/取得数组x,y点的数据值void scoreadd(int);/得分增加,根据消去行数void scorereset();/得分清零,用于升级后void levelup();/等级提升,当分数达到规定值后执行int gameover();/游戏结束void rowdelete();/消除满行void previewset(int (*p)4);/设置预览方块的形状数据void previewreset();/预览方块数据清零v
6、oid setdata(int (*)2);/设置主游戏区数据值void datareset();/主游戏区数据清零void drawpreview();/显示预览方块private:int data2526;/主游戏区数组int preview44;/预览方块数组int rowsdelete;/每次消除行数变量int score;/得分变量int scorelevel;/升级规定值变量int level;/等级变量bool overflag;/结束标记变量void scorelevelup();/升级规定值提升;3.2. squar类class view;/先向引用声明class squar
7、public:squar();/类的缺省构造函数squar(squar &);/拷贝构造函数friend void cursor(int,int);/友元函数 控制光标位置void getcursor(int &,int &);/取得位置记录坐标void make();/随机产生一个方块void getmake(int (*p)4);/取得方块数据值void draw();/显示主方块void drop(view &);/方块下落void change();/方块变形int meet(int);/判断方块周围是否有障碍void torecord(int (*)2
8、);/传送需要记录的数据void reset();/方块数组清零int moveflag;/方块运动标记变量private:void move();/方块运动int shape44;/方块形状数据int x,y;/坐标int shapeindex;/方块形状序号int changeindex;/变形序号变量int speed;/下落速度变量;3.3. 主要功能的实现3.3.1. 游戏界面俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读
9、到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制光标在其中显示分数、等级、预览图和提示信息。具体界面如图3-1所示。图3-13.3.2. 生成方块本程序中生成的方块有六种形状,如图3-2所示。每一种方块以shapeindex标记,在程序运行生成方块时,调用shapeindex=rand()%5+1;语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生成方块函数make(),将先产生的赋给游戏当前方块,第二个赋给预览图方块。以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。图3-23.3.3. 方块变形
10、俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。在程序中每当按下Up键,程序判断可以变形后,根据当前方块的形状序号shapeindex和变化形状序号changeindex调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。具体形状变化如图3-3所示。图3-33.3.4. 方块显示以上方块的操作都是数据层面的操作,而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。这就是draw()函数的作用。把当前运动的
11、方块对应节点存储在一个4*4数组里,变形和生成方块的过程就是更新该数组数据的过程。然后在draw()函数里检测数组的各个值,并控制光标跳到一定位置,画出“”组成方块。具体方块对应数组数值关系如图3-4所示。图3-43.3.5. 障碍判断障碍判断,就是在方块运动中或者变形中判断周围是否有障碍阻碍下落、移位、变形。当方块下落遇到下面有方块或者到达下边界则应停止下落并记录数据,存入背景数据数组。变形时应判断这个变形是否可以进行,如果有障碍则不能变形。例如当方块达到右边界,而若变形则会越过边界,那么这个变形的命令是不应执行的。所有这些判断都由meet()函数进行,根据是否有障碍返回1或0,再由其他函数
12、接收执行相应操作。具体一些障碍情况如图3-5所示。图3-53.3.6. 消行计分游戏玩家拼满一行后,程序消去满行,并计分。中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。不是,则判断是否构成消行条件,从下落方块的最低点依次向上检查是否可以消行,根据消去行数分数增加。分数达到一定程度,等级提升,速度加快。如图3-6,图3-7,图3-8所示。图3-6图3-7图3-83.3.7. 暂停退出游戏的友好性在于能考虑用户的需要,随时可以暂停/继续游戏,在不愿继续游戏时退出游戏。本程序可以在用户需要的时候响应Esc按键,提示是否退出游戏,如果不做选择即可暂停游戏,等待选择。界面如图3
13、-9所示。图3-9第四章 程序测试4. 游戏测试经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下,根据按键实现位移和变形。当方块满一行后,可以消除该行,同时记录分数和等级。按下Esc键红色提示信息正常显示,可以响应F1,F2键决定是否退出游戏。总结与体会通过这次课程设计,我收获了很多。首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。在程序设计编写过程中两个类的数据交换是个比较麻烦的过程,这个类
14、的定义过程中要用到另一个类做参数类型,而在后一个类中亦需要第一个类做参数类型,出现了互相调用的情况。编译提示未定义,只好在两个类外定义函数负责两个类函数的数据交换。实践证明达到了预期的目的,积累了经验。由于程序是用文本窗口模拟的图形,界面比较简陋,如果使用MFC用C+来实现,那么界面将会非常好,只是由于所学知识有限,只有下一步去探索了。附录:程序主要模块源代码专心-专注-专业squar:squar()for(int i=0;i<4;i+)for(int j=0;j<4;j+)shapeij=0;x=22;y=0;shapeindex=1;changeindex=1;speed=10
15、00;moveflag=1;downtoearth=0;void squar:make()srand(int)time(0);shapeindex=rand()%6+1;switch(shapeindex)case 1:reset();shape10=1;shape11=1;shape12=1;shape13=1;break;case 2:reset();shape01=1;shape11=1;shape21=1;shape22=1;break;case 3:reset();shape02=1;shape12=1;shape21=1;shape22=1;break;case 4:reset()
16、;shape01=1;shape11=1;shape12=1;shape22=1;break;case 5:reset();shape02=1;shape11=1;shape12=1;shape21=1;break;case 6:reset();shape11=1;shape12=1;shape21=1;shape22=1;break;void squar:draw()for(int i=0;i<4;i+)for(int j=0;j<4;j+)if(shapeij)cursor(x+j*2,y+i);cout<<""int squar:meet(in
17、t direction)/遇见返回1;int xx=x/2,yy=y;switch(direction)case 1:/direc leftyy+=1;switch(shapeindex)case 1:/lineswitch(changeindex)case 1:if(getdata(yy+1,xx-1)return 1;elsereturn 0;case 2:if(getdata(yy,xx)|getdata(yy+1,xx)|getdata(yy+2,xx)|getdata(yy+3,xx)return 1;elsereturn 0;case 2:/curlrswitch(changein
18、dex)case 1:if(getdata(yy,xx)|getdata(yy+1,xx)|getdata(yy+2,xx)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx+2)|getdata(yy+2,xx)return 1;elsereturn 0;case 3:if(getdata(yy,xx)|getdata(yy+1,xx+1)|getdata(yy+2,xx+1)return 1;elsereturn 0;case 4:if(getdata(yy+1,xx)|getdata(yy+2,xx)return 1;elsereturn 0;
19、case 3:/curllswitch(changeindex)case 1:if(getdata(yy,xx+1)|getdata(yy+1,xx+1)|getdata(yy+2,xx)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx)|getdata(yy+2,xx)return 1;elsereturn 0;case 3:if(getdata(yy,xx)|getdata(yy+1,xx)|getdata(yy+2,xx)return 1;elsereturn 0;case 4:if(getdata(yy+1,xx)|getdata(yy+2
20、,xx+2)return 1;elsereturn 0;case 4:/sswitch(changeindex)case 1:if(getdata(yy,xx)|getdata(yy+1,xx)|getdata(yy+2,xx+1)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx+1)|getdata(yy+2,xx)return 1;elsereturn 0;case 5:/disswitch(changeindex)case 1:if(getdata(yy,xx+1)|getdata(yy+1,xx)|getdata(yy+2,xx)retur
21、n 1;elsereturn 0;case 2:if(getdata(yy+1,xx)|getdata(yy+2,xx+1)return 1;elsereturn 0;case 6:/discif(getdata(yy+1,xx)|getdata(yy+2,xx)return 1;elsereturn 0;case 2:/direc rightyy+=1;switch(shapeindex)case 1:/lineswitch(changeindex)case 1:if(getdata(yy+1,xx+4)return 1;elsereturn 0;case 2:if(getdata(yy,x
22、x+2)|getdata(yy+1,xx+2)|getdata(yy+2,xx+2)|getdata(yy+3,xx+2)return 1;elsereturn 0;case 2:/curlrswitch(changeindex)case 1:if(getdata(yy,xx+2)|getdata(yy+1,xx+2)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx+4)|getdata(yy+2,xx+4)return 1;elsereturn 0;case 3:if(getdata(yy,xx+3)|get
23、data(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 4:if(getdata(yy+1,xx+4)|getdata(yy+2,xx+2)return 1;elsereturn 0;case 3:/curllswitch(changeindex)case 1:if(getdata(yy,xx+3)|getdata(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx+2)|getdata(yy+2,xx+4)return 1;e
24、lsereturn 0;case 3:if(getdata(yy,xx+3)|getdata(yy+1,xx+2)|getdata(yy+2,xx+2)return 1;elsereturn 0;case 4:if(getdata(yy+1,xx+4)|getdata(yy+2,xx+4)return 1;elsereturn 0;case 4:/sswitch(changeindex)case 1:if(getdata(yy,xx+2)|getdata(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(y
25、y+1,xx+4)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 5:/disswitch(changeindex)case 1:if(getdata(yy,xx+3)|getdata(yy+1,xx+3)|getdata(yy+2,xx+2)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx+3)|getdata(yy+2,xx+4)return 1;elsereturn 0;case 6:/discif(getdata(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;else
26、return 0;case 3:/direc downswitch(shapeindex)case 1:/lineswitch(changeindex)case 1:if(getdata(yy+2,xx)|getdata(yy+2,xx+1)|getdata(yy+2,xx+2)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(yy+4,xx+1)return 1;elsereturn 0;case 2:/curlrswitch(changeindex)case 1:if(getdata(yy+3,xx+1)|getdata(
27、yy+3,xx+2)return 1;elsereturn 0;case 2:if(getdata(yy+3,xx+1)|getdata(yy+3,xx+2)|getdata(yy+3,xx+3)return 1;elsereturn 0;case 3:if(getdata(yy+1,xx+1)|getdata(yy+3,xx+2)return 1;elsereturn 0;case 4:if(getdata(yy+2,xx+2)|getdata(yy+2,xx+3)|getdata(yy+3,xx+1)return 1;elsereturn 0;case 3:/curllswitch(cha
28、ngeindex)case 1:if(getdata(yy+3,xx+1)|getdata(yy+3,xx+2)return 1;elsereturn 0;case 2:if(getdata(yy+3,xx+1)|getdata(yy+3,xx+2)|getdata(yy+3,xx+3)return 1;elsereturn 0;case 3:if(getdata(yy+1,xx+2)|getdata(yy+3,xx+1)return 1;elsereturn 0;case 4:if(getdata(yy+2,xx+1)|getdata(yy+2,xx+2)|getdata(yy+3,xx+3
29、)return 1;elsereturn 0;case 4:/sswitch(changeindex)case 1:if(getdata(yy+2,xx+1)|getdata(yy+3,xx+2)return 1;elsereturn 0;case 2:if(getdata(yy+3,xx+1)|getdata(yy+3,xx+2)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 5:/disswitch(changeindex)case 1:if(getdata(yy+2,xx+2)|getdata(yy+3,xx+1)return 1;elsere
30、turn 0;case 2:if(getdata(yy+2,xx+1)|getdata(yy+3,xx+2)|getdata(yy+3,xx+3)return 1;elsereturn 0;case 6:/discif(getdata(yy+3,xx+1)|getdata(yy+3,xx+2)return 1;elsereturn 0;case 4:/direc upswitch(shapeindex)case 1:/lineswitch(changeindex)case 1:if(getdata(yy+1,xx)|getdata(yy+1,xx+2)|getdata(yy+1,xx+3)re
31、turn 1;elsereturn 0;case 2:if(getdata(yy+1,xx)|getdata(yy+1,xx+2)|getdata(yy+1,xx+3)return 1;elsereturn 0;case 2:/curlrswitch(changeindex)case 1:if(getdata(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(yy,xx+1)|getdata(yy,xx+2)|getdata(yy+1,xx+2)return 1;elsereturn 0;case 3:if
32、(getdata(yy+1,xx+1)|getdata(yy+1,xx+3)|getdata(yy+2,xx+1)return 1;elsereturn 0;case 4:if(getdata(yy,xx+1)|getdata(yy+2,xx+2)return 1;elsereturn 0;case 3:/curllswitch(changeindex)case 1:if(getdata(yy+1,xx+1)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(yy,xx+1)|getdata(yy,xx+2)return 1;e
33、lsereturn 0;case 3:if(getdata(yy+1,xx+2)|getdata(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 4:if(getdata(yy,xx+2)|getdata(yy+2,xx+1)|getdata(yy+2,xx+2)return 1;elsereturn 0;case 4:/sswitch(changeindex)case 1:if(getdata(yy+1,xx+3)|getdata(yy+2,xx+1)return 1;elsereturn 0;case 2:if(getdata
34、(yy,xx+1)|getdata(yy+1,xx+1)return 1;elsereturn 0;case 5:/disswitch(changeindex)case 1:if(getdata(yy+2,xx+2)|getdata(yy+2,xx+3)return 1;elsereturn 0;case 2:if(getdata(yy,xx+2)|getdata(yy+2,xx+1)return 1;elsereturn 0;/case 6:/discvoid squar:change()if(shapeindex=1)switch(changeindex)case 1:reset();shape01=1;shape11=1;shape21=1;shape31=1;changeindex=2;break;case 2:reset();shape10=1;shape11=1;shape12=1;shape13=1;changeindex=1;break;else if(shapeindex=2)switch(changeindex)case 1:reset();shape13=1;shape21=1;shape22=1;shape23=1;changeindex=2;break;case 2:re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 托儿所服务的亲子关怀考核试卷
- 煤炭行业的全球化竞争与合作方式考核试卷
- 衡阳课件效果教学课件
- DB11T 934-2012 儿童福利机构婴幼儿早期发展干预技术规范
- DB11∕T 1812-2020 既有玻璃幕墙安全性检测与鉴定技术规程
- 孔雀妆课件教学课件
- 服装店铺新员工培训计划方案
- 走进丽江课件教学课件
- 淮阴工学院《建筑工程概预算》2022-2023学年第一学期期末试卷
- 淮阴工学院《机械设计基础》2022-2023学年第一学期期末试卷
- 内分泌科利用PDCA循环提高全院胰岛素存放的合格率品管圈QCC成果汇报
- 犹太律法613条具体条款
- 《HSK标准教程3》第10课
- 体育教育与中小学生身心健康的关系研究
- 商场电缆施工方案
- 2023中国职业教育行业发展趋势报告-多鲸教育研究院
- 《中国老年骨质疏松症诊疗指南(2023)》解读-
- “双减”背景下小学英语课后作业设计实践探究 论文
- 广东省佛山市顺德区部分学校2023-2024学年四年级上学期期中语文试卷
- 南方航空空乘招聘报名表
- 灭火器充装检修方案范本
评论
0/150
提交评论