高级语言程序设计课程设计俄罗斯方块游戏_第1页
高级语言程序设计课程设计俄罗斯方块游戏_第2页
高级语言程序设计课程设计俄罗斯方块游戏_第3页
高级语言程序设计课程设计俄罗斯方块游戏_第4页
高级语言程序设计课程设计俄罗斯方块游戏_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、课 程 设 计 说 明 书课程名称: 高级语言程序设计 设计题目: 俄罗斯方块游戏 院 部: 计算机科学与信息工程学院 学生姓名: 学 号: 专业班级: 物联网工程 指导教师: 2015年 6月课 程 设 计 任 务 书设计题目 俄罗斯方块学生姓名所在院部计算机科学与信息工程学院专业、班级物联网工程设计要求:设计要求1.用设计与实现俄罗斯方块游戏。2.要求包括系统的需求分析;3.系统总框图及每个模块的设计分析;4.mfc应用程序架构;框架的扩展;5.算法的设计与实现;6.游戏的内部实现;游戏区域绘图的实现;7.列出所有定义的函数及说明;8.附上程序源代码。 学生应完成的工作:1. 学生应认真学

2、习参考程序,理解每个文件、每个函数以及各个变量的作用和意义。在此基础上进一步改进程序,最后正确地运行程序。2. 对程序进行测试,设计详细的测试计划,然后根据测试计划设计测试用例,对程序进行测试。测试时应注意对各种边缘情况进行测试。3. 完成课程设计报告。参考文献:1. 梁旭等 c程序设计课程设计 电子工业出版社 20112. 谭浩强 c程序设计(第四版) 清华大学出版社2010工作计划:1. 小组审题,查阅资料,进行设计前的必要资料准备(3天)。 2. 把程序完整运行出来(4天)。 3. 增加改进程序(3天)。 4. 写课程设计报告(3天)。 5. 提交课程设计报告及答辩(1天)任务下达日期:

3、2015 年 6 月 9 日 任务完成日期:2015 年 6 月 22 日指导教师(签名): 学生(签名):目 录一 前言1二 需求分析1三 概要设计1四 详细设计3五 改进或增加功能模块说明4六 程序测试4七 课程设计总结5八 致 谢5九 参考文献5十 源程序6俄罗斯方块游戏一 前言c+程序设计牵涉到面向对象程序设计的理论、c+语言的语法以及算法等3个方面的内容,其中每一方面都包含十分丰富的内容,都可以分别单独成论。显然在一个程序中深入、详细地介绍以上3个方面的知识是不可能的,必须把它们有机地结合起来,综合应用。不同的书对此采取不同的写法,侧重点有所不同,各有道理,也各有优缺点,适合于不同的

4、读者。需要在教学实践中检验,取长补短,不断完善。作者认为:要进行c+程序设计当然需要了解面向对象程序设计的有关概念,但是本课程毕竟不是一门面向对象程序设计的理论课程,在本书中不是抽象地介绍面向对象程序设计的理论,而是在介绍c+语言的特点和应用过程中自然地引出面向对象程序设计的有关概念,通过c+的编程过程理解面向对象程序设计方法。在介绍程序设计过程中,介绍有关的算法,引导读者思考怎样构造一个算法。编写程序的过程就是设计算法的过程。要用c+编程序,最基本的要求是正确掌握和运用c+。由于c+语法复杂,内容又多,如果对它缺乏系统的了解,将难以真正应用,编出来的程序将会错误百出,编译出错,事倍功半。本书

5、的做法是全面而系统地介绍c+的主要特点和功能,引导读者由简而繁地学会编写c+程序。有了c+编程的初步基础后,再进一步提高,掌握更多更深入的算法。这样的方法可能符合大多数学习者的情况,降低了学习难度。程序设计是一门实践性很强的课程,只靠听课和看书是学不好的。衡量学习好坏的标准不是“懂不懂”,而是“会不会干”。因此必须强调多编程,多上机实践。考虑到不同学校、不同专业、不同读者对学习c+有不同的要求。二 需求分析1 要求(1)用c语言实现程序设计;(2)定义各个函数分别完成不同功能,如背景设计,判断等;(3)画出查询模块的流程图;(4)系统的各个功能用函数调用的形式实现;(5)界面友好(良好的人机互

6、交),程序要有注释。2 任务(1)定义各类头文件,变量及宏定义;(2)图形模块,设计出俄罗斯方块背景界面;(3)设定玩家操作模块和胜负判断模块;(4)画出部分模块的流程图;(5)编写代码;(6)程序分析与调试。3 运行环境(1)windows7/8/2000/xp系统(2)turboc2.0编译环境4 开发工具c+三 概要设计3.1 模块组成图根据分析,俄罗斯方块这个程序一共要实现如下几个功能,开始游戏、游戏的暂停继续、游戏控制和退出游戏。其中游戏控制最为主要和重要,它控制着整个游戏的画面和有关数据的操作,是游戏的核心部分。暂停和退出功能做成一体,在退出的提示下不做任何操作即可实现暂停的功能。

7、程序结构如图3-1所示。 图3-1 功能模块图2 查询函数流程图根据分析后的程序结构图设计出相应的流程图。俄罗斯方块的内容主要包括游戏开始,画背景和边框,显示分数等级和下一个方块的预览图;根据速度没隔一定时间方块自动下落,当有按键操作时,根据相应按键执行动作,每次动作前要判断是否动作可以执行。下落方块满一行时,消去该行,根据消去行数得到相应分数。分数达到一定程度,等级提升,速度加快。如图3-2所示。图3-2 系统流程图四 详细设计在程序的开头部分定义要用到的头文件,以及各种常量如设定棋盘大小,设定游戏模式及如何执行。代码如下。bool rotate(scord *lpscord,int rty

8、pe,int rnumber,bool firstrotate);void getrandom();/初始化方格形状void getnext(scord *targ,const scord* sur);/取出下一个方块void draw();/绘出方格void start();/开始游戏bool downable();/能否下落bool leftable();/能否左移bool rightable();/能否右移bool disrows(hwnd hwnd);/判断能否消行五 改进或增加功能模块说明5.1游戏界面游戏界面采用wndclass函数编写,代码如下。wndclass wndclass

9、;wndclass.style=cs_hredraw|cs_vredraw;/|(ws_minimizebox|ws_maximizebox) ; wndclass.lpfnwndproc=wndproc; wndclass.cbclsextra=0; wndclass.cbwndextra=0; wndclass.hinstance=hinstance; wndclass.hicon = loadicon(null, idi_application); wndclass.hcursor = loadcursor (null, idc_arrow); wndclass.hbrbackgroun

10、d= (hbrush)getstockobject (white_brush);/ createsolidbrush(rgb(195,195,237); wndclass.lpszmenuname= null; wndclass.lpszclassname= szappname; 俄罗斯方块的游戏界面包括游戏区域边框、下落方块绘制、右部计分和预览图显示等。游戏区域边框的绘制比较简单,循环中确定光标的位置输出特定字符,即可完成边框绘制。游戏区方块的绘制,循环从数据数组中依次读出数据,根据读到的数据显示“”,最后组成方块的形状,完成方块的绘制。计分和预览图部分先画出一个矩形区域,然后控制光标在其中

11、显示分数、等级、预览图和提示信息。5.2生成方块本程序中生成的方块有七种形状,在程序运行生成方块时,调k=rand()%kinds+1;语句,确定当前要显示的是哪一个方块形状。而在实际运行中,第一次需要调用两次生成方块函数getrandom(),将先产生的赋给游戏当前方块,第二个赋给预览图方块。以后每次产生一个方块,把预览方块赋给当前方块,把新产生的赋给预览方块。5.3方块变形 俄罗斯方块的特点就在于通过方块的变形拼满整行来消去该行方块从而使游戏可以继续下去,很难想象不能变形的俄罗斯方块是什么样子。而变形的过程就是根据当前方块形状改变方块的相对位置,这样就可以改变方块的形状了。在程序中每当按下

12、up键,程序判断可以变形后,根据当前方块的形状序号和变化形状序号调用相应的方块数值赋给draw()函数,通过刷新重画就可以显示变化后的方块了。5.4方块显示 以上方块的操作都是数据层面的操作,而真正要在游戏窗口中看到数据的变化,还必须把方块不断的绘制出来。这就是draw()函数的作用。把当前运动的方块对应节点存储在一个4*4数组里,变形和生成方块的过程就是更新该数组数据的过程。然后在draw()函数里检测数组的各个值,并控制光标跳到一定位置,画出“”组成方块。5.5障碍判断 障碍判断,就是在方块运动中或者变形中判断周围是否有障碍阻碍下落、移位、变形。当方块下落遇到下面有方块或者到达下边界则应停

13、止下落并记录数据,存入背景数据数组。变形时应判断这个变形是否可以进行,如果有障碍则不能变形。例如当方块达到右边界,而若变形则会越过边界,那么这个变形的命令是不应执行的。所有这些判断都由meet()函数进行,根据是否有障碍返回1或0,再由其他函数接收执行相应操作。5.6消行计分 游戏玩家拼满一行后,程序消去满行,并计分。中当一个方块下落停止后,程序检查方块是否充满了游戏区域,如果是结束游戏。不是,则判断是否构成消行条件,从下落方块的最低点依次向上检查是否可以消行,根据消去行数分数增加。分数达到一定程度,等级提升,速度加快。六 程序测试1 测试游戏能否正确显示期盼界面游戏打开界面,如图3-3所示。

14、图 3-3 打开界面2执行程序后,显示本游戏的界面,进行模式选择 游戏中界面,如图3-4所示。图 3-4 游戏界面七 课程设计总结通过这次课程设计,我收获了很多。首先把所学知识加以利用和巩固,其次在实践中遇到问题去探索和学习,更增加了新知识实践证明达到了预期的目的,积累了经验。由于程序是用文本窗口模拟的图形,界面比较简陋,如果使用mfc用c+来实现,那么界面将会非常好,只是由于所学知识有限,只有下一步去探索了。通过这次的学习设计,我发现我还有许许多多的不足的地方,比如c+的程序设计,源代码的书写等等,刚开始我发现我的问题后,十分紧张,感觉很绝望,没有别人的帮助,自己动手设计曾经自己想都没想过的

15、东西,虽然很兴奋,但想想自己无从下手,后来通过上网查找资料,进图书馆查找书籍等,终于知道了俄罗斯方块游戏的设计概念,终于知道了设计的方法,于是,渐渐地我的游戏设计理念诞生了。通过这次设计,我学会了很多东西,例如通过网络资料来寻求帮助,自己改正错误,加强了我自己的自己动手能力,对今后的学习和生活有很大的帮助,有助于以后的课程设计顺利完成。八 致 谢 经过两个多星期的努力,终于把本游戏程序改写出来,在这期间要感谢各同学对我帮助和支持,同时也感谢程序老师对我的教导。九 参考文献(1)c课程设计黄明梁旭周绍斌编著,电子工业出版社出版(2)c课程设计案例精编黄晓东编著,中国水利水电出版社出版。(3)c程

16、序设计实用教程张永常主编,电子工业出版社出版。 十 源程序/*头文件data.h:*/#ifndef data_h_#define data_h_#includestatic const int kinds=7;/方块种类数量static const int cols=10;/数据列数/* * 7行10列数组 每行对应一种方块类别。 * 每行的前四列为x坐标,中间四列为y坐标 * 第九列为方块类别代码,最后一列为该类型方块有几种变形 * 用一个5*5的矩阵表示 7种类别方块 共19种变形 */每种方块的代号static const int type1=1;static const int ty

17、pe2=2;static const int type3=3;static const int type4=4;static const int type5=5;static const int type6=6;static const int type7=7;/变形的种类static const int rtype1=1;static const int rtype2=2;static const int rtype3=4;static int rtypenext;static int rtypedown;/初始化方块坐标及对应的类别和变形种类static const int indexki

18、ndscols= 0,1,0,1,0,0,-1,-1,type1,rtype1, -1,0,1,2,0,0,0,0,type2,rtype2, 0,0,1,1,1,0,0,-1,type3,rtype2, 0,0,1,1,-1,0,0,1,type4,rtype2, -1,0,0,1,0,0,1,0,type5,rtype3, -1,0,1,1,0,0,0,-1,type6,rtype3, -1,0,1,1,0,0,0,1,type7,rtype3;/定时器idstatic const int timer=1;/初始游戏级别对应的时间间隔static int currentlevel=600;

19、static int level=1;/每种图形所包含的小方块数static const int ctn=4;typedef struct /方块形状定义int x;int y;scord;scord sdownctn,snextctn;/下一个方块的坐标static rect rectnextctn;/正在下落方块的坐标static rect rectdownctn;/显示区域的大小static const int cxsize=25;static const int cysize=35;/方块偏离(0,0)得位置static int offsetx;static int offsety;s

20、tatic int offsetxnext;static int offsetynext;/自定义消息static const int ms_down=10001;/暂停static bool go=true;/开始static bool startgame=false;/结束static bool gameover=false;/得分static int score;rect rt=326,81,425,455;/每个方格包含的像素static const int pelssize=13;/显示区域大小的定义static const point area=0,455,326,455,326,

21、0;/显示区域的表示方法 最后一列最后一行分别对应该行该列所具有的方块总数 0表示没有方块1表示有static int fillareacysize+1cxsize+1;hbrush hbrush1=createsolidbrush(rgb(0,0,255);/方块颜色:蓝色hbrush hbrush2=createsolidbrush(rgb(255,0,128); /分数区域颜色:粉色hpen hpen1=createpen(ps_solid,0,rgb(245,245,245);/背景格颜色:灰色#endif /* data_h_ */这是源文件mainpro.cpp#includeda

22、ta.h#include#includelresult callback wndproc(hwnd, uint, wparam, lparam);/* * 逆时针方向旋转方格 返回能否旋转 * param lpscord 要旋转的方块坐标指针 * param rtype 旋转类型 * param rnumber 旋转次数 * param 是否第一次旋转 */bool rotate(scord *lpscord,int rtype,int rnumber,bool firstrotate);void getrandom();/初始化方格形状void getnext(scord *targ,con

23、st scord* sur);/取出下一个方块void draw();/绘出方格void start();/开始游戏bool downable();/能否下落bool leftable();/能否左移bool rightable();/能否右移bool disrows(hwnd hwnd);/判断能否消行void getrandom() /初始化方格形状 int k=rand()%kinds+1; for(int i=0;ikinds;i+) if(indexicols-2=k) rtypenext=indexicols-1;/获得旋转类型 for(int j=0;jctn;j+) snext

24、j.x=indexij; snextj.y=indexij+4; break; rotate(snext,rtypenext,rand()%rtypenext+1,true); int min_y=0; for (int t = 0; t snextt.y ? snextt.y : min_y; offsetxnext=(int)(cxsize/2)*pelssize+(int)(pelssize/2);/x方向的中间显示 offsetynext=(-min_y)*pelssize+(int)(pelssize/2);/保证置顶显示bool rotate(scord *lpscord,int

25、rtype,int rnumber,bool firstrotate) / 旋转 int tempx; int tempy; int temp; int tx=(offsetx-(int)(pelssize/2)/pelssize; int ty=(offsety-(int)(pelssize/2)/pelssize; bool ra=true; switch(rtype) case rtype1: ra=false; break; case rtype2: if(rnumber%2!=0) for (int j = 0; j y+tx; tempy=lpscord-x+ty; lpscord

26、+; if(!firstrotate&(fillareatempxtempy0|tempx24|tempx0|tempy34) ra=false; lpscord-=4; if(ra) if (rnumber % 2 != 0) for (int k = 0; k x; lpscord-x = lpscord-y; lpscord-y = temp; lpscord+; break; case rtype3: for(int k=0;krnumber;k+) for(int l=0;ly+tx; tempy=(-lpscord-x)+ty; lpscord+; if(!firstrotate&

27、(fillareatempxtempy0|tempx24|tempx0|tempy34) ra = false; lpscord-=4; if(ra) for (int i = 0; i rnumber; i+) for (int j = 0; j x; lpscord-x = lpscord-y; lpscord-y = temp; lpscord+; lpscord=lpscord-4; break; return ra;void getnext(scord *targ,const scord* sur) /取出下一个方块 rtypedown=rtypenext; offsetx=offs

28、etxnext; offsety=offsetynext; for(int i=0;ix=sur-x; targ-y=sur-y; sur+; targ+; getrandom();void draw(hwnd hwnd,const scord* shape,rect *rect,hbrush hbrush,int offsetx,int offsety) /绘出方格 hdc hdc=getdc(hwnd); selectobject(hdc,hbrush); selectobject(hdc,hpen1);for(int i=0;ix-(int)(pelssize/2)+offsetx,pe

29、lssize*shape-y-(int)(pelssize/2)+offsety, pelssize*shape-x+(int)(pelssize/2)+offsetx+2,pelssize*shape-y+(int)(pelssize/2)+offsety+2); shape+; releasedc(hwnd,hdc);void start() /开始游戏 if(!startgame) for (int i = 0; i cysize + 1; i+) for (int j = 0; j cxsize + 1; j+) fillareaij = 0; startgame=true; go=t

30、rue; score=0; bool downable() /能否下落 bool da=true; int x=(offsetx-(int)(pelssize/2)/pelssize; int y=(offsety-(int)(pelssize/2)/pelssize; int xtemp; int ytemp; for(int i=0;i0|ytemp34) da=false; break; if (!da) for (int k = 0; k ctn; k+) xtemp = sdownk.x + x; ytemp = sdownk.y + y; fillareaytempxtemp =

31、1; fillareaytempcxsize+; fillareacysizextemp+; return da;bool leftable() /能否左移 bool la = true; int x = (offsetx - (int) (pelssize / 2) / pelssize; int y = (offsety - (int) (pelssize / 2) / pelssize; int xtemp; int ytemp; for (int i = 0; i 0 | xtemp 0) la = false; break; return la;bool rightable() /能

32、否右移 bool ra = true; int x = (offsetx - (int) (pelssize / 2) / pelssize; int y = (offsety - (int) (pelssize / 2) / pelssize ; int xtemp; int ytemp; for (int i = 0; i 0 | xtemp 24) ra = false; break; return ra;bool disrows(hwnd hwnd) /消行 hdc hdc=getdc(hwnd); bool da=false; int rowctn;/可以消除的行 for (int

33、ii = 0; ii ctn; ii+) rowii = 0; int number = 0;/可连续消的行数 static int levelscore; selectobject(hdc,hpen1); for (int i = 0; i 0)/可以消行 da=true; levelscore+=(number + 1) * number / 2; score += (number + 1) * number / 2; if(levelscore2)/增加游戏级别 levelscore=0; currentlevel=(int)currentlevel*2/3; settimer(hwnd

34、,timer,currentlevel,null); for(int i=0;i=600) level=i+2; break; invalidaterect(hwnd,&rt,true); for (int k = 0; k 0;i-) for(int j=0;jcxsize+1;j+) fillareaij=fillareai-1j; invalidaterect(hwnd,null,true); releasedc(hwnd,hdc); return da;int main() hinstance hinstance=null; static tchar szappname=text(el

35、s); hwnd hwnd; msg msg; wndclass wndclass;wndclass.style=cs_hredraw|cs_vredraw;/|(ws_minimizebox|ws_maximizebox) ; wndclass.lpfnwndproc=wndproc; wndclass.cbclsextra=0; wndclass.cbwndextra=0; wndclass.hinstance=hinstance; wndclass.hicon = loadicon(null, idi_application); wndclass.hcursor = loadcursor

36、 (null, idc_arrow); wndclass.hbrbackground= (hbrush)getstockobject (white_brush);/ createsolidbrush(rgb(195,195,237); wndclass.lpszmenuname= null; wndclass.lpszclassname= szappname;if(!registerclass(&wndclass) messagebox(null,text(register error),szappname,mb_iconerror); return 0; hwnd=createwindow(

37、szappname,text(俄罗斯方块),ws_dlgframe|ws_overlapped|ws_caption|ws_sysmenu|ws_minimizebox,/(ws_overlapped|ws_sysmenu|ws_minimizebox)&ws_border,/ws_sizebox ws_overlappedwindow&ws_maximizebox,ws_caption|/&ws_maximizebox禁用最大化选项 300,100,429,480, null,null,hinstance,null);showwindow(hwnd,sw_shownormal); updat

38、ewindow(hwnd);while(getmessage(&msg,null,0,0) translatemessage(&msg); dispatchmessage(&msg); return msg.wparam;lresult callback wndproc (hwnd hwnd, uint message, wparam wparam, lparam lparam) hdc hdc; paintstruct ps; rect r; static bool down=false; bool issend=false; switch(message) case wm_create:

39、settimer(hwnd,timer,currentlevel,null); /coutlevel1endl; return 0; case wm_size:return 0; case wm_timer: if(startgame&go) if (down) if(!downable()/不能再下落条件 / coutcan not downendl; down=false; disrows(hwnd); if(!issend) sendmessage(hwnd,ms_down,0,0); issend=true; else draw(hwnd, sdown, rectdown,(hbrus

40、h)getstockobject(white_brush), offsetx, offsety); offsety += pelssize; draw(hwnd, sdown, rectdown,hbrush1, offsetx, offsety); return 0; case ms_down: draw(hwnd,snext,rectnext,(hbrush)getstockobject(white_brush),369,44); getnext(sdown,snext); draw(hwnd,snext,rectnext,hbrush1,369,44); draw(hwnd,sdown,

41、rectdown,hbrush1,offsetx,offsety); /判断游戏是否结束 offsety-=pelssize; if(downable() offsety+=pelssize; issend=false; down=true; else / coutgame over!endl; startgame=false; gameover=true; invalidaterect(hwnd,&rt,true); case wm_paint: hdc = beginpaint(hwnd, &ps); getclientrect(hwnd, &r); selectobject(hdc,hp

42、en1); selectobject(hdc,hbrush1); for(int i=1;icxsize+8;i+) movetoex(hdc,i*pelssize,0,null); lineto(hdc,i*pelssize,476); for(int j=1;jcysize;j+) movetoex(hdc,0,j*pelssize,null); lineto(hdc,425,j*pelssize); savedc(hdc); for(int t=0;tcysize;t+) for(int k=0;k0) rectangle(hdc,k*pelssize,t*pelssize,(k+1)*

43、pelssize+1,(t+1)*pelssize+1); if(startgame) draw(hwnd,snext,rectnext,hbrush1,369,44); draw(hwnd,sdown,rectdown,hbrush1,offsetx,offsety); fillrect(hdc,&rt,hbrush2); wchar ss20; wchar ll20; wsprintf(ss,text(score:%d),score); wsprintf(ll,text(level:%d),level); textout(hdc,331,300,ll,lstrlen(ll); textou

44、t(hdc,331,320,ss,lstrlen(ss); if(gameover) textout(hdc,330,200,text(game over!),strlen(game over!); selectobject(hdc, getstockobject(black_pen); polyline(hdc, area, 3);/绘制一个矩形 movetoex(hdc, 325, 80, null); lineto(hdc, 425, 80); endpaint(hwnd, &ps); return 0; case wm_keydown: switch(wparam) case vk_u

45、p: if(go&startgame) down=false; draw(hwnd,sdown,rectdown,(hbrush)getstockobject(white_brush),offsetx,offsety); rotate(sdown,rtypedown,1,false); draw(hwnd,sdown,rectdown,hbrush1,offsetx,offsety); return 0; case vk_down: if(go&startgame) down=false;draw(hwnd,sdown,rectdown,(hbrush)getstockobject(white_brush),offsetx,offsety); int k=(offsety-(int)(pelssize)/2)/pelssize; while(kcysize) if(downable() offsety+=pelssize; else break; draw(hwnd,sd

温馨提示

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

评论

0/150

提交评论