《Vc++俄罗斯方块课程设计报告(共24页).doc》由会员分享,可在线阅读,更多相关《Vc++俄罗斯方块课程设计报告(共24页).doc(24页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
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);/传送需要记录的数据void
8、 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()函数的作用。把当前运动的方块对应节点存储在一个4*4数组
11、里,变形和生成方块的过程就是更新该数组数据的过程。然后在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-9所示。图3-9第四章 程序测
13、试4. 游戏测试经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下,根据按键实现位移和变形。当方块满一行后,可以消除该行,同时记录分数和等级。按下Esc键红色提示信息正常显示,可以响应F1,F2键决定是否退出游戏。总结与体会通过这次课程设计,我收获了很多。首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。在程序设计编写过程中两个类的数据交换是个比较麻烦的过程,这个类的定义过程中要用到另一个类做参数
14、类型,而在后一个类中亦需要第一个类做参数类型,出现了互相调用的情况。编译提示未定义,只好在两个类外定义函数负责两个类函数的数据交换。实践证明达到了预期的目的,积累了经验。由于程序是用文本窗口模拟的图形,界面比较简陋,如果使用MFC用C+来实现,那么界面将会非常好,只是由于所学知识有限,只有下一步去探索了。附录:程序主要模块源代码专心-专注-专业squar:squar()for(int i=0;i4;i+)for(int j=0;j4;j+)shapeij=0;x=22;y=0;shapeindex=1;changeindex=1;speed=1000;moveflag=1;downtoeart
15、h=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();shape01=1;shape11=1;sha
16、pe12=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;i4;i+)for(int j=0;j4;j+)if(shapeij)cursor(x+j*2,y+i);cout;int squar:meet(int direction)/遇见返回1;int xx=x/2,yy=y;switch(direction
17、)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(changeindex)case 1:if(getdata(yy,xx)|getdata(yy+1,xx)|getda
18、ta(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;case 3:/curllswitch(changeindex)case 1:if(getdata(y
19、y,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,xx+2)return 1;elsereturn 0;case 4:/sswitch(changei
20、ndex)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)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx)|getdata
21、(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,xx+2)|getdata(yy+1,xx+2)|getdata(yy+2,xx+2)|getdata(
22、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)|getdata(yy+1,xx+3)|getdata(yy+2,xx+3)return 1;elseretu
23、rn 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;elsereturn 0;case 3:if(getdata(yy,xx+3)|getdata(yy+1
24、,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(yy+1,xx+4)|getdata(yy+2,xx+3)return 1;elsereturn 0;c
25、ase 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;elsereturn 0;case 3:/direc downswitch(shapeindex)case 1
26、:/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(yy+3,xx+2)return 1;elsereturn 0;case 2:if(getdata(y
27、y+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(changeindex)case 1:if(getdata(yy+3,xx+1)|getdata(yy+3,
28、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)return 1;elsereturn 0;case 4:/sswitch(changeindex)
29、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;elsereturn 0;case 2:if(getdata(yy+2,xx+1)|getdata(yy+3,xx
30、+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)return 1;elsereturn 0;case 2:if(getdata(yy+1,xx)|getd
31、ata(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(getdata(yy+1,xx+1)|getdata(yy+1,xx+3)|getdata(yy+2
32、,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;elsereturn 0;case 3:if(getdata(yy+1,xx+2)|getdata(yy
33、+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(yy,xx+1)|getdata(yy+1,xx+1)return 1;elsereturn 0;c
34、ase 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
35、;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:reset();shape01=1;shape02=1;shape12=1;shape22=1;changeindex=3;break;case 3:reset();shape11=1;shape12=1;shape13=1;shape21=1;changeindex=4;break;case 4:reset();shape01=1;shape11=1;shape21=1;shape22=1;changeindex=1;break;else if(shapeindex=3)switch(changeindex)case 1:reset();shape11=1;sh
限制150内