ImageVerifierCode 换一换
格式:DOC , 页数:24 ,大小:391.50KB ,
资源ID:1038592      下载积分:10 积分
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 微信支付   
验证码:   换一换

加入VIP,免费下载资源
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【http://www.wodocx.com/d-1038592.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(俄罗斯方块的设计报告.doc)为本站会员(星星)主动上传,沃文网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知沃文网(发送邮件至2622162128@qq.com或直接QQ联系客服),我们立即给予删除!

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

1、 课程设计俄罗斯方块VC+课程设计报告 设计题目: 俄罗斯方块 学 院:太原工业学业 专业班级:1020562学生姓名:王鲁恒学生学号:28指导教师:韩燕丽 目录一、课程设计的目的与要求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

2、消行93.3.6暂停退出10四程序测试10五.总结与体会12六附录一(参考书)12七附录二(程序源代码)12用VC+实现俄罗斯方块的程序设计一、 课程设计的目的与要求 1.1课程设计的目的本课程设计是一个综合性的实践教学环节,其目的在于促进学生复习和巩固计算机软件设计知识,加深对软件设计方法、 软件设计技术和设计思想的理解,并能运用所学知识进行开发。希望通过本课程设计中简单系统的开发,使学生掌握软件设计的基本方法和基本流程,提高学生的综合应用能力。1.2课程设计的要求利用Microsoft Visual C+编写一个文本窗口下的俄罗斯方块游戏。要求:要求用设计与实现俄罗斯方块游戏。要求包括系统

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

4、游戏中各形状填满了给定区域,为输者。2.2.2游戏界面需求:良好的用户界面,有关游戏的使用说明。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。2.2.3游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆 时针变形,一般为逆时针。2.2算法分析根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏、游戏的暂停继续、游戏控制和退出游戏。其中游戏控制最为主要和重要,它控制着整个游戏的画

5、面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。程序结构如图2-2-1所示。 图2-2-1程序结构图2.2.2概要流程图根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。同时可以响应Esc按键,提示是否退出程序。 图2-2-2 流程图 2.2.2定义方块的数据结构对于

6、方块在某一瞬间的位置标识,我们采用一个44的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(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 2

7、0和Diamond 21则是第2号方块的横坐标x和纵坐标y。2.2.3 游戏设计分析根据程序的结构,将俄罗斯方块需要实现的功能细化为相应的成员函数,每个成员函数实现一个功能,进而实现程序的运行。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 cColor

8、s);/画方块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,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();

9、/行数超过界限游戏结束void FlashScreen();/刷屏效果三、程序主要功能的实现3.3游戏功能的实现.3.3.1游戏界面俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制按键来控制方块的移动如图3-3-1所示(游戏的区域)。 图3-3-1游戏的区域3.3.2生成方块本程序中生成的方块有六种形状,如图3-3-2所示。每一种方块以D

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

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

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

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

14、 共23页 第24页#include #include #include #include #include colorConsole.h#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;/

15、左型Zigzagint Zright44 = 0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0;/右型Zigzagint T44 = 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;

16、/游戏区域的数组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 PutDown(int Dia,int x,

17、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();/刷屏效果void main()HANDLE handle;handle = initiate();HomePage(

18、handle);/游戏首页Initialize();/进行初始化/创建新的方块int *advance = NULL;advance = 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_RE

19、D|FOREGROUND_INTENSITY;/游戏区域外围即将出现的下一个方块的颜色Draw(advance,4,4,13,13,Colors,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(putof

20、fputoff_max)if(_kbhit() int d=0;int key=_getch();switch (key)case 224: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);

21、/若能 清除当前方块x+;/右移x值加1d=1;break;break;case 99:/翻转方块ClearIn(&Diamond00,4,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(&Di

22、amond00,4,4,x,y);/若能 清除当前方块y+;/下移y值加1HANDLE handle;handle=initiate();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+

23、yj+x=Diamondij;int full;for(i=y;imin(y+4,height-1);i+)/如果第i行全是1:某行,第一个元素是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 = ini

24、tiate();WORD titleColor1 = FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_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(!_kb

25、hit()textout(handle,29,15,titleColor,1,按任意键开始);Sleep(60);textout(handle,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+)/游戏区域宽12

26、area19i=-2;/最后一行WORD Colors1=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_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

27、,ESC:退出);textout(handle,offset_x+26,offset_y+10,Colors,1,下一个方块);textout(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; D

28、raw(&area00,12,20,0,0,Colors,1);/画游戏界面的边框Colors0=FOREGROUND_RED|FOREGROUND_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 CreateColor

29、s(WORD newColor1)WORD whiColor1,yelColor1,cyaColor1;whiColor0=FOREGROUND_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(

30、seed)case 0:newColor0=whiColor0;break;case 1:newColor0=yelColor0;break;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

31、:diamond=&Zright00;break;case 4:diamond=&T00;break;case 5:diamond=&Stick00;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,

32、2*(x+j)+offset_x,y+i+offset_y,Colors,color,);else if(temp=-1)/只用于画边框/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)i

33、nt 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=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)

34、for(int i=max(y,1);iy+h;i+)/max()-windef.hfor(int j=x;jx+w;j+)if(areaij&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)

35、+offset_x,y+i+offset_y,Colors,1,);void ClearOut(int *b,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)textout(handle,2*(x+j)+offset_x,y+i+offset_y,Colors,1, );void DeleteRow(int mwidth,int row,int w,int h)/消行HANDLE

36、 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;iwidth-1;i+)m1i=0;void GAMEOVER()HANDLE handle;handle=initiate();WORD Colors1=FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY;FlashScreen();while(1)textout(handle,offset_x+9,offset_y+8,Colors,1,U LOST!);Sleep(300);textout(handle,offset_x+9,offset_y+8,Colors,1, );Sleep(300);void FlashScreen()HANDLE han

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

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

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