俄罗斯方块C++课程设计报告_第1页
俄罗斯方块C++课程设计报告_第2页
俄罗斯方块C++课程设计报告_第3页
俄罗斯方块C++课程设计报告_第4页
俄罗斯方块C++课程设计报告_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1、 题目 利用C+编写俄罗斯方块游戏,是俄罗斯游戏能够在Microsoft Visual C+ 6.0上运行该游戏。2、 实验目的一方面通过对程序算法的设计和分析提高我们对问题进行文字论述和文字表达的能力并且培养我们进行知识综合,软件开发和软件的调试技术,开发较大程序的能力。 另一方面培养了我们相互合作的精神并培养了我们的创新意识。 3、 需求分析功能需求 随机给出不同的形状下落填充给定的区域,若填满一条便消掉,记分,设计不同的游戏难度,即方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。方块及各种变换需求 本游戏需要有7种方块,而每种方块还可以进行旋转。每种方块每行每列最多只有4

2、个小方块。可以将它们放在一个n*m的区域内,该区域可以看作是有许多个等面积小方块构成的区域,而这些区域的状态只有两种,被方块占据或空闲。因此,对于整个游戏区域的空间是占据或空闲,可以用一位数来标识。对于7种方块和它们旋转后的形态我们可以用不同的标识进行标记。对于旋转,游戏中所有方块都是按照逆时针旋转的规则进行的,而且在旋转过程中它们不会因为旋转而下降,总会保持在同一高度。任何方块经过一个旋转周期还会变回原型。 操作的需求 向上键 产生方块旋转操作,方块并非任何情况都能旋转,如果旋转后与小方格矩阵显示的方块有冲突或超出边界时,均不能发生旋转。因此首先要判断是否有足够的空间进行旋转。然后选择是否旋

3、转。 向下键 产生方块加速下落操作,如果方块已经到达游戏区域底部或者已经有其他方块遮挡,则方块停止下降。 向左键 产生下落方块左移操作。首先要判断此方块是否能够发生左移,当越界或被其他显示方块阻挡时,则不能左移。 向右键 产生下落方块右移操作。首先要判断此方块是否能够发生右移,当越界或被其他显示方块阻挡时,则不能右移。4、 详细设计主要功能设计 根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏(F8)、游戏的暂停继续(S)和退出游戏(Q)。其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现

4、暂停的功能。程序流程图 根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。同时可以响应Esc按键,提示是否退出程序。 游戏界面 俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。 游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出

5、数据,根据读到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制光标在其中显示分数、等级、预览图和提示信息。 生成方块 本程序中生成的方块有7种形状,每一种方块以shapeindex标记,在程序运行生成方块时,调用shapeindex=rand()%5+1;语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生成方块函数make(),将先产生的赋给游戏当前方块,第二个赋给预览图方块。以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。 方块变形 俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使

6、游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。在程序中每当按下“”键,程序判断可以变形后,根据当前方块的形状序号shapeindex和变化形状序号changeindex调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。方块显示以上方块的操作都是数据层面的操作,而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。这就是draw()函数的作用。把当前运动的方块对应节点存储在一个4*4数组里,变形和生成方块的过程就是更新该数组数据的过程。然后在draw()函数里检测数组

7、的各个值,并控制光标跳到一定位置,画出“”组成方块。 障碍判断障碍判断,就是在方块运动中或者变形中判断周围是否有障碍阻碍下落、移位、变形。当方块下落遇到下面有方块或者到达下边界则应停止下落并记录数据,存入背景数据数组。变形时应判断这个变形是否可以进行,如果有障碍则不能变形。例如当方块达到右边界,而若变形则会越过边界,那么这个变形的命令是不应执行的。所有这些判断都由meet()函数进行,根据是否有障碍返回1或0,再由其他函数接收执行相应操作。消行计分 游戏玩家拼满一行后,程序消去满行,并计分。中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。不是,则判断是否构成消行条件,从

8、下落方块的最低点依次向上检查是否可以消行,根据消去行数分数增加。分数达到一定程度,等级提升,分数暂定为每1000升一级。暂停退出游戏的友好性在于能考虑用户的需要,随时可以暂停/继续游戏,在不愿继续游戏时退出游戏。本程序可以在用户需要的时候响应Esc按键,提示是否退出游戏,如果不做选择即可暂停游戏,等待选择。程序调试经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下,根据按键实现位移和变形。当方块满一行后,可以消除该行,同时记录

9、分数和等级。按下Esc键红色提示信息正常显示,可以响应Y,N键决定是否退出游戏软件使用说明 打开俄罗斯方块游戏后,通过控制方向区域的“”、“”、“”、“”来控制,“”键代表变形转换,“”、“”、“右”均代表方向键,“Q”代表退出游戏键。若想暂停游戏,可通过“S”键,当初来询问框是,可不做选择,则可达到暂停的效果5、 实验结果 6、 经验和教训 通过这次课程设计,我收获了很多。首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。在程序设计编写过程中两个类的数据交换是个比较麻烦的过程,这个类的定义过程中要用到另一个类做参数类型,而在后一个类中亦需要第一个类做参数类型,出

10、现了互相调用的情况。 编译提示未定义,只好在两个类外定义函数负责两个类函数的数据交换。实践证明达到了预期的目的,积累了经验。由于程序是用文本窗口模拟的图形,界面比较简陋,如果使用MFC用C+来实现,那么界面将会非常好,只是由于所学知识有限,只有下一步去探索了。 通过这次的学习设计,我发现我还有许许多多的不足的地方,比如c+的程序设计,源代码的书写等等,刚开始我发现我的问题后,十分紧张,感觉很绝望,没有别人的帮助,自己动手设计曾经自己想都没想过的东西,虽然很兴奋,但想想自己无从下手,原来的兴奋劲一下子都没了,很忙然。但是,通过与王老师的交流,经过老师的耐心讲解,我慢慢感到希望又重生了,于是我通过

11、上网查找资料,进图书馆查找书籍等,终于知道了俄罗斯方块游戏的设计概念,终于知道了设计的方法,于是,渐渐地我的游戏设计理念诞生了。 通过几个礼拜的设计,我的游戏渐渐初见成效了,当我把回车键摁下的一刹那,我十分激动,眼前的既熟悉又陌生的游戏出现在了我的面前,看着自己设计的童年时代经常玩的游戏,我感慨万千。通过这次设计,我学会了很多东西,例如通过网络资料来寻求帮助,自己改正错误,加强了我自己的自己动手能力,对今后的学习和生活有很大的帮助,有助于以后的课程设计顺利完成。7、 工作日志周次月日实验、实习项目、课程设计名称实验、实习、课程设计具体地点时数作业或实验、实习报告17.1确定课题,把题目都看遍机

12、房3无17.1确定课题,把题目都看遍机房3无17.1确定课题,把题目都看遍,最终确定题目机房3初步计划报告17.2查找资料,确定方法机房3需求分析报告17.2查找资料,确定方法机房3程序流程图、代码27.2程序修改、改进机房3程序流程图、代码27.2程序修改、改进机房3程序流程图、代码27.3程序编写、调试机房3程序流程图、代码 2 7.3程序联调 机房测试程序报告 2 7.3答辩,提交报告 机房心得总结八源程序代码(详细的注释)/*游戏规则如下:每次消除后得到的分数为消除的行数的平方,比如:一次消除1行得到1分,两行得4分等级随着消除的行数的增加而增加,比如:原来等级为X,一次性消除Y行,则

13、等级变为X+Y;下落时间随等级(开始等级为1)的升高而变短,具体为1000.0除以等级(时间为double型),比如:等级为2,则停留时间为500ms;*/#include <iostream>#include <sys/stat.h>#include <conio.h>#include <cstdio>#include <iomanip>#include <time.h>#include <windows.h>using namespace std;HANDLE hout = GetStdHandle(STD

14、_OUTPUT_HANDLE); /取标准输出设备对应的句柄void gotoxy(HANDLE hout, const int X, const int Y) COORD coord; coord.X = X; coord.Y = Y; SetConsoleCursorPosition(hout,coord);void setcolor(HANDLE hout, const int bg_color, const int fg_color) SetConsoleTextAttribute(hout, bg_color*16+fg_color);void basic_structure() s

15、etcolor(hout,0,13); cout<<"简单游戏规则:上为翻转,左右移动,下为加速"<<endl; cout<<"每次消去X行,则等级加X,分数加X的平方,下降速度提高" setcolor(hout,0,11); gotoxy(hout,2,10); cout<<"SCORE" gotoxy(hout,2,20); cout<<"LEVEL" gotoxy(hout,50,10); cout<<"NEXT" g

16、otoxy(hout,20,3); cout<<"制作者:王冉" setcolor(hout,0,9); gotoxy(hout,3,11); cout<<"0" gotoxy(hout,3,21); cout<<"1" setcolor(hout,0,10); gotoxy(hout,13,5); cout<<"" int i; for(i=0;i<23;i+) gotoxy(hout,13,6+i); cout<<" " go

17、toxy(hout,13,29); cout<<""<<endl;const int coord2844=1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0, 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0, 0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0

18、, 0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0, 0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0, 1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0, 1,1,0,0

19、,1,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0, 1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,/这一行的三个和第一个形状一样 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0, 0

20、,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0;int xy2313=0,color2313=0,level=1,score=0,shape_num1,shape_num2,color1,color2,square_x,square_y,i,k;char key1,key2;void print_next(int n,int c) for(i=0;i<4;i+) gotoxy(hout,50,12+i); for(k=0;k<4;k+) if

21、(coordnik) setcolor(hout,0,c); cout<<"" else setcolor(hout,0,0); cout<<" " void left(int s,int c) for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) if(square_y+k=0|xysquare_x+isquare_y+k-1) goto L; break; /可以左移 for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysqu

22、are_x+isquare_y+k=0; colorsquare_x+isquare_y+k=0; square_y-=1; for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysquare_x+isquare_y+k=1; colorsquare_x+isquare_y+k=c; L:/不能移动 ;void right(int s,int c) for(i=0;i<4;i+) for(k=3;k>=0;k-) if(coordsik) if(square_y+k=12|xysquare_x+isquare_y+k+1) got

23、o L; break; /可以右移 for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysquare_x+isquare_y+k=0; colorsquare_x+isquare_y+k=0; square_y+=1; for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysquare_x+isquare_y+k=1; colorsquare_x+isquare_y+k=c; L:/不能移动 ;int up(int &s,int c) if(s=1|s=3|s=5|s=7|s=8|

24、s=9|s=11|s=12|s=13|s=15|s=16|s=17|s=22|s=24|s=26) for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik=0&&coords+1ik=1) if(xysquare_x+isquare_y+k) return 0; /可以翻转 for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik=0&&coords+1ik=1) xysquare_x+isquare_y+k=1; colorsquare_x+isquare_y+k=c; el

25、se if(coordsik=1&&coords+1ik=0) xysquare_x+isquare_y+k=0; colorsquare_x+isquare_y+k=0; s+=1; else if(s=2|s=4|s=6|s=23|s=25|s=27) for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik=0&&coords-1ik=1) if(xysquare_x+isquare_y+k) return 0; /可以移动 for(i=0;i<4;i+) for(k=0;k<4;k+) if(coor

26、dsik=0&&coords-1ik=1) xysquare_x+isquare_y+k=1; colorsquare_x+isquare_y+k=c; else if(coordsik=1&&coords-1ik=0) xysquare_x+isquare_y+k=0; colorsquare_x+isquare_y+k=0; s-=1; else if(s=10|s=14|s=18) for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik=0&&coords-3ik=1) if(xysquare_x

27、+isquare_y+k) return 0; /可以移动 for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik=0&&coords-3ik=1) xysquare_x+isquare_y+k=1; colorsquare_x+isquare_y+k=c; else if(coordsik=1&&coords-3ik=0) xysquare_x+isquare_y+k=0; colorsquare_x+isquare_y+k=0; s-=3; return 1;int down(int s,int c) for(k=

28、0;k<4;k+) for(i=3;i>=0;i-) if(coordsik) if(square_x+i=22|xysquare_x+i+1square_y+k)/不可移动 return 0; break; /下移 for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysquare_x+isquare_y+k=0; colorsquare_x+isquare_y+k=0; square_x+=1; for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysquare_x+isqu

29、are_y+k=1; colorsquare_x+isquare_y+k=c; return 1;void Add_score() int h=0,bh; for(i=22;i>=0;i-) for(k=0;k<13;k+) if(xyik=0) break; if(k=13) bh=i; h+; if(h) score+=h*h; level+=h; /把分数,级别的输出更新一下 setcolor(hout,0,2); gotoxy(hout,3,11); cout<<score; gotoxy(hout,3,21); cout<<level; /将可消去

30、的整行的上面的部分全部下移s行 for(i=bh-1;i>=0;i-) for(k=0;k<13;k+) xyi+hk=xyik; colori+hk=colorik; for(i=0;i<h;i+) for(k=0;k<13;k+) xyik=0; colorik=0; int top() int i; for(i=0;i<13;i+) if(xy0i=1) return 1; return 0;void initial(int s,int c) for(i=0;i<4;i+) for(k=0;k<4;k+) if(coordsik) xysquar

31、e_x+isquare_y+k=1; colorsquare_x+isquare_y+k=c; void all_print() for(i=0;i<23;i+) gotoxy(hout,15,6+i); for(k=0;k<13;k+) if(xyik) setcolor(hout,0,colorik); cout<<"" else setcolor(hout,0,0); cout<<" " int main() /确定窗口大小 system("color F0");char cmd200; sprintf(cmd,"mode con cols=%d lines=%d",65,33); system(cmd); basic_structure(); gotoxy

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论