俄罗斯方块的设计报告.doc

上传人:精*** 文档编号:828725 上传时间:2023-09-06 格式:DOC 页数:23 大小:408KB
下载 相关 举报
俄罗斯方块的设计报告.doc_第1页
第1页 / 共23页
俄罗斯方块的设计报告.doc_第2页
第2页 / 共23页
俄罗斯方块的设计报告.doc_第3页
第3页 / 共23页
俄罗斯方块的设计报告.doc_第4页
第4页 / 共23页
俄罗斯方块的设计报告.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

1、 课程设计俄罗斯方块目录一、课程设计的目的与要求31.1课程设计的目的31.2课程设计的要求31.3选题背景3二、游戏的分析与设计42.1需求分析42.1.1 游戏需求42.2.2游戏界面需求:42.2.3游戏形状(方块)需求:42.2算法分析42.2.2概要流程图52.2.2定义方块的数据结构62.2.3 游戏设计分析7三、程序主要功能的实现73.3游戏功能的实现7.3.3.1游戏界面73.3.2生成方块83.3.3方块变形83.3.4方块显示93.3.5消行93.3.6暂停退出10四程序测试10五.总结与体会12六附录一(参考书)12七附录二(程序源代码)12用VC+实现俄罗斯方块的程序设

2、计一、 课程设计的目的与要求 1.1课程设计的目的本课程设计是一个综合性的实践教学环节,其目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、 软件设计技术和设计思想的理解,并能运用所学知识进行开发。希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本流程,提高学生的综合应用能力。1.2课程设计的要求利用Microsoft Visual C+编写一个文本窗口下的俄罗斯方块游戏。要求:要求用设计与实现俄罗斯方块游戏。要求包括系统的需求分析;系统总框图及每个模块的设计分析;算法的设计与实现;游戏的内部实现;游戏区域绘图的实现;系统存在的问题及错误处理;列出所有定义的

3、函数及说明;附上程序源代码。1.3选题背景俄罗斯方块是家喻户晓的益智小游戏,选择这个题目一是为了将自己的所学知识加以运用,二是俄罗斯方块是我第一个接触到的游戏,它的实现方法也吸引着我。我希望通过探索实践去实现它,在这次学习中从实践和实际的项目中提高自己的编程能力。因此我选定了这个题目。二、 游戏的分析与设计2.1需求分析2.1.1 游戏需求 随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,若在游戏中各形状填满了给定区域,为输者。2.2.2游戏界面需求:良好的用户界面,有关游戏的使用说明。让方块在一定的区域内运动和变形,该区域用一

4、种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。2.2.3游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。2.2算法分析根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏、游戏的暂停继续、游戏控制和退出游戏。其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。程序结构如图2-2-1所示。

5、图2-2-1程序结构图2.2.2概要流程图根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。同时可以响应Esc按键,提示是否退出程序。 图2-2-2 流程图 2.2.2定义方块的数据结构对于方块在某一瞬间的位置标识,我们采用一个44的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空

6、间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号 2 。0123(x0,y0)(x1,y1)(x2,y2)(x3,y3)2303(x0,y0)(x1,y1)(x2,y2)(x3,y3) 图2-2-3方块编号+Diamond 00和Diamond 01则是第0号方块的横坐标x和纵坐标y ;Diamond 20和Diamond 21则是第2号方块的横坐标x和纵坐标y。2.2.3 游戏设计分析根据程序的结构,将俄罗斯方块需要实现的功能细化为相应的

7、成员函数,每个成员函数实现一个功能,进而实现程序的运行。void HomePage(HANDLE handle);/首页void Initialize();/初始化界面void PlayMusic();/播放背景音乐WORD CreateColors(WORD newColor1);/产生随机方块颜色int* Setup();/创建void Draw(int Dia,int w,int h,int x,int y,WORD Colors,int cColors);/画方块void TurnOver(int Dia4,int w,int h,int *x,int y);/翻转方块*BOOL Pu

8、tDown(int Dia,int x,int y,int w,int h);/判断能否放下和移动*void ClearIn(int *a,int w,int h,int x,int y);/清除游戏区域内的方块void ClearOut(int *b,int w,int h,int x,int y);/清除游戏外围的方块void DeleteRow(int mwidth,int row,int w,int h);/消除一行*void GAMEOVER();/行数超过界限游戏结束void FlashScreen();/刷屏效果三、程序主要功能的实现3.3游戏功能的实现.3.3.1游戏界面俄罗斯

9、方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制按键来控制方块的移动如图3-3-1所示(游戏的区域)。 图3-3-1游戏的区域3.3.2生成方块本程序中生成的方块有六种形状,如图3-3-2所示。每一种方块以Diamond标记,在程序运行生成方块时,调用Diamond44语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生

10、成方块函数Draw (),将先产生的赋给游戏当前方块,第二个赋给预览图方块。以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块 图3-3-23.3.3方块变形俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。在程序中每当按下C键,程序判断可以变形后,根据当前方块的形状序号Diamond44和变化形状序号TurnOver()调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。3.3.4方块显示以上方块的

11、操作都是数据层面的操作,而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。这就是Draw()函数的作用。把当前运动的方块对应节点存储在一个4*4数组里,变形和生成方块的过程就是更新该数组数据的过程。然后在draw()函数里检测数组的各个值,并控制光标跳到一定位置,画出“”组成方块。具体方块对应数组数值关系如图3-3-4所示。 图3-3-43.3.5消行游戏玩家拼满一行后,程序消去满行,。中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。不是,则判断是否构成消行条件,从下落方块的最低点依次向上检查是否可以消行。如图3-3-5所示 图3-3-53.3.6暂停退出

12、游戏的友好性在于能考虑用户的需要,随时可以暂停/继续游戏,在不愿继续游戏时退出游戏。本程序可以在用户需要的时候响应Esc按键,提示是否退出游戏,如果不做选择即可暂停游戏,等待选择四 程序测试经过调试和修改,程序完全实现设计要求,成功模拟了俄罗斯方块的运行过程和游戏效果,只是界面略微简陋,但已从程序层面上实现了游戏,达到了这次实训的要求和目的。程序正常生成方块,根据速度值每隔一定时间自动下落,如有操作按键按下,根据按键实现位移和变形。当方块满一行后,可以消除该行。游戏运行界面如图4-4-1,图4-4-2. 图4-4-3图4-4-1(初始界面) 图4-4-2.(游戏界面) 图4-4-3(游戏结束界

13、面)五.总结与体会通过这次课程设计,我收获了很多。首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识。由于程序是用文本窗口模拟的图形,界面比较简陋,如果使用MFC用C+来实现,那么界面将会非常好,只是由于所学知识有限,只有下一步去探索了。六附录一(参考书) 1.C+程序设计谭浩强 北京:清华大学出版社 2. 数据结构严蔚敏 北京: 清华大学出版社 3. Visual C+游戏设计钦科技. 北京:科海电子出版社七附录二(程序源代码) 共23页 第23页#include #include #include #include #include colorConsole.h

14、#define left75#define right77#define down80/游戏区域大小#define width 12#define height 20int Lleft44 = 1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0;/左型Lint Lright44 = 0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0;/右型Lint Zleft44 = 1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0;/左型Zigzagint Zright44 = 0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0;/右型Zigzagint T

15、44 = 0,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0;/T型int Stick44 = 1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0;/棒型int Cube44 = 1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0;/正方形int Diamond44;/用于表示不同方块的数组int offset_x = 20;/打印偏移量int offset_y = 5;/打印偏移量int areaheightwidth;/游戏区域的数组void HomePage(HANDLE handle);/首页void Initialize();/初始化界面void

16、PlayMusic();/播放背景音乐WORD CreateColors(WORD newColor1);/产生随机方块颜色int* Setup();/创建void Draw(int Dia,int w,int h,int x,int y,WORD Colors,int cColors);/画方块void TurnOver(int Dia4,int w,int h,int *x,int y);/翻转方块*BOOL PutDown(int Dia,int x,int y,int w,int h);/判断能否放下和移动*void ClearIn(int *a,int w,int h,int x,i

17、nt y);/清除游戏区域内的方块void ClearOut(int *b,int w,int h,int x,int y);/清除游戏外围的方块void DeleteRow(int mwidth,int row,int w,int h);/消除一行*void GAMEOVER();/行数超过界限游戏结束void FlashScreen();/刷屏效果void main()HANDLE handle;handle = initiate();HomePage(handle);/游戏首页Initialize();/进行初始化/创建新的方块int *advance = NULL;advance =

18、Setup();int blank,x,y;bool flag;while(1)/复制已创建的方块for(int i=0;i4;i+) for(int j=0;j4;j+)if(Diamondij=*(advance+i*4+j) blank = i;y=1-blank;x=4;ClearOut(&Diamond00,4,4,13,13);/清除上一个方块advance=Setup();WORD Colors1;Colors0 = FOREGROUND_RED|FOREGROUND_INTENSITY;/游戏区域外围即将出现的下一个方块的颜色Draw(advance,4,4,13,13,Col

19、ors,1);/游戏区域外围即将出现的下一个方块WORD newColor1;Colors0 = CreateColors(newColor);/游戏区域中出现的方块的颜色Draw(&Diamond00,4,4,x,y,Colors,1);/游戏区域中出现方块while(_kbhit()/清除键盘缓冲区_getch();flag = true;while(flag)int putoff = 0,putoff_max = 50; /延迟量while(putoffputoff_max)if(_kbhit() int d=0;int key=_getch();switch (key)case 224

20、:switch(_getch()case down:putoff=putoff_max;break;case left:if(PutDown(&Diamond00,x-1,y,4,4)/能否左移ClearIn(&Diamond00,4,4,x,y);/若能 清除当前方块x-;/左移x值减1d=1;break;case right:if(PutDown(&Diamond00,x+1,y,4,4)/能否右移ClearIn(&Diamond00,4,4,x,y);/若能 清除当前方块x+;/右移x值加1d=1;break;break;case 99:/翻转方块ClearIn(&Diamond00,4

21、,4,x,y);TurnOver(Diamond,4,4,&x,y);d=1;break;if(d)/有按键操作后HANDLE handle;handle=initiate();WORD Colors1=CreateColors(newColor);Draw(&Diamond00,4,4,x,y,Colors,1);d=0;Sleep(10);putoff+;if(PutDown(&Diamond00,x,y+1,4,4) /是否能下移ClearIn(&Diamond00,4,4,x,y);/若能 清除当前方块y+;/下移y值加1HANDLE handle;handle=initiate();

22、WORD Colors1=CreateColors(newColor);Draw(&Diamond00,4,4,x,y,Colors,1);elseflag = !flag;/跳出while(flag)循环,产生新方块if(y=1) GAMEOVER();/结束游戏 for(int i=0;i4;i+)/放下方块for(int j=0;j4;j+)if(Diamondij&(i+y)height-1)&(j+x)width-1) /此条件还没懂/areai+yj+x=Diamondij;int full;for(i=y;imin(y+4,height-1);i+)/如果第i行全是1:某行,第一

23、个元素是1,则括号内为假,不执行full=0,/返回继续for循环,直到若全为1则结束for,full仍为1,则执行消行的函数/同理若有一个元素为0了,则括号内为真,full=0被执行,则不执行消行的函数full=1;for(int j=1;j11;j+)if(!areaij) full=0;if(full)/消掉一行DeleteRow(area,i,width,height);void HomePage(HANDLE handle)handle = initiate();WORD titleColor1 = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND

24、_INTENSITY;textout(handle,10,3,titleColor,1,);textout(handle,10,4,titleColor,1,);textout(handle,10,5,titleColor,1,);textout(handle,10,6,titleColor,1,);textout(handle,10,7,titleColor,1,);textout(handle,10,8,titleColor,1,);while(!_kbhit()textout(handle,29,15,titleColor,1,按任意键开始);Sleep(60);textout(hand

25、le,29,15,titleColor,1, );Sleep(60);int any_key = _getch();srand(any_key);/按任意键system(CLS);void Initialize()HANDLE handle;handle=initiate();for(int i=1;i20;i+)/游戏区域高20areai0=-1;/每行最后一个数组元素areai11=-1;/每行第一个数组元素for(i=1;i12;i+)/游戏区域宽12area19i=-2;/最后一行WORD Colors1=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROU

26、ND_INTENSITY;textout(handle,offset_x+26,offset_y+2,Colors,1,俄罗斯方块);textout(handle,offset_x+26,offset_y+4,Colors,1,任意键开始);textout(handle,offset_x+26,offset_y+6,Colors,1,C键翻转方块,方向键,控制方向);textout(handle,offset_x+26,offset_y+8,Colors,1,ESC:退出);textout(handle,offset_x+26,offset_y+10,Colors,1,下一个方块);texto

27、ut(handle,offset_x+26,offset_y+16,Colors,1,制作人:王鲁恒);textout(handle,offset_x+26,offset_y+18,Colors,1,班级:1020562); textout(handle,offset_x+26,offset_y+20,Colors,1,学号: 28);Colors0=FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY; Draw(&area00,12,20,0,0,Colors,1);/画游戏界面的边框Colors0=FOREGROUND_RED|FOREG

28、ROUND_BLUE;for(int net_y=offset_y+1;net_yoffset_y+height-1;net_y+)textout(handle,offset_x+2,net_y,Colors,1,);int start=_getch();/有按键输入srand(start); /按键是任意的void PlayMusic()sndPlaySound(Theme.wav,SND_LOOP|SND_ASYNC); WORD CreateColors(WORD newColor1)WORD whiColor1,yelColor1,cyaColor1;whiColor0=FOREGRO

29、UND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY;yelColor0=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;cyaColor0=FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_INTENSITY;srand(time(NULL);int seed=rand()%3;switch(seed)case 0:newColor0=whiColor0;break;case 1:newColor0=yelColor0;brea

30、k;case 2:newColor0=cyaColor0;break;return newColor0;int* Setup()int* diamond=NULL;srand(time(NULL);int seed=rand()%7;/七种方块switch(seed)case 0:diamond=&Lleft00;break;case 1:diamond=&Lright00;break;case 2:diamond=&Zleft00;break;case 3:diamond=&Zright00;break;case 4:diamond=&T00;break;case 5:diamond=&St

31、ick00;break;case 6:diamond=&Cube00;break;return diamond;void Draw(int Dia,int w,int h,int x,int y,WORD Colors,int color)HANDLE handle;handle = initiate(); int temp;for(int i=0;ih;i+)for(int j=0;j0)/此条件还没太懂/if(temp=1)textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,color,);else if(temp=-1)/只用于画边框/

32、Dia即边框处元素(考虑是二维数组)textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,color,);else if(temp=-2)/只用于画底框/Dia即边框处元素(考虑是二维数组)textout(handle,2*(x+j)+offset_x-1,y+i+offset_y,Colors,color,);void TurnOver(int Dia4,int w,int h,int *x,int y)int change44=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0;int flag=0,l=0;for(int i=

33、h-1;i=0;i-)for(int j=0;jw;j+)if(Diaij)changejl=Diaij;flag=1;if(flag) l+;flag=0;for(i=0;i4;i+)if(PutDown(&change00,*x-i,y,w,h)*x-=i;for(int k=0;kh;k+)for(int j=0;jw;j+)Diakj=changekj;break;BOOL PutDown(int a,int x,int y,int w,int h)for(int i=max(y,1);iy+h;i+)/max()-windef.hfor(int j=x;jx+w;j+)if(area

34、ij&aw*(i-y)+j-x)return 0;/不能移动return 1;/能移动void ClearIn(int *a,int w,int h,int x,int y)HANDLE handle;handle=initiate();WORD Colors1=FOREGROUND_RED|FOREGROUND_BLUE;for(int i=0;ih;i+)for(int j=0;j0)/和Draw函数的条件一样textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,1,);void ClearOut(int *b,int w,int h,in

35、t x,int y)HANDLE handle;handle=initiate();WORD Colors1=FOREGROUND_RED|FOREGROUND_BLUE;for(int i=0;ih;i+)for(int j=0;j0)textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,1, );void DeleteRow(int mwidth,int row,int w,int h)/消行HANDLE handle;handle=initiate();WORD newColor1;WORD Colors1=CreateColors(newColor);textout(handle,2+offset_x,row+offset_y,Colors,1,);/满行写一行空白 10个Sleep(100);for(int i=row;i1;i-)ClearIn(&mi1,width-2,1,1,i);for(int j=1;jwidth-1;j+)mij=mi-1j;Draw(&mi1,width-2,1,1,i,Colors,1);for(i=1;i0;yy-)for(int xx=0;xx

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 技术资料 > 研究报告

版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,由于未联系到知识产权人或未发现有关知识产权的登记,如有知识产权人并不愿意我们使用,如有侵权请立即联系:2622162128@qq.com ,我们立即下架或删除。

Copyright© 2022-2024 www.wodocx.com ,All Rights Reserved |陕ICP备19002583号-1 

陕公网安备 61072602000132号     违法和不良信息举报:0916-4228922