游戏开发俄罗斯方块设计说明书.docx
- 文档编号:28697257
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:18
- 大小:189.74KB
游戏开发俄罗斯方块设计说明书.docx
《游戏开发俄罗斯方块设计说明书.docx》由会员分享,可在线阅读,更多相关《游戏开发俄罗斯方块设计说明书.docx(18页珍藏版)》请在冰豆网上搜索。
游戏开发俄罗斯方块设计说明书
游戏开发设计说明书
题目
俄罗斯方块
学号
2011115010812
学生姓名
袁帅
指导教师
谢逸
所在班级
计科1108班
专业名称
计算机科学与技术
一.课程设计主要内容
1.题目
俄罗斯方块
2.需求分析
制作一个俄罗斯方块的小游戏,用户能够通过上下左右键来控制方块,满行消去。
3.设计环境
运行环境:
windowsxp,windows2003windows7
开发环境:
vc6.0
编写语言:
c++
二.详细设计说明
1.系统程序流程图
2.系统概要说明
本程序是在vc6.0环境下编写的Windows应用程序,函数中利用了画图函数绘制基本方块模型,并通过相应键盘相应对应地执行相应的操作。
在产生7中不同类型的方块中,调用了随机函数,随机产生1~7中的任何一个数字,每一个数字都对应了不同的模块,通过这种方式,实现了游戏中其中不同模块的随机产生。
3.功能说明
(1)实现其中形状不同的方块
(2)实现各个方块的上下左右移动和旋转的功能;
(3)实现消行的功能;
4.系统各函数及知识点说明
1.主函数
主函数为一有返回值型的整型函数,主要功能为执行游戏主线及定义边界。
2.DrawCell函数(画方格)
DrawCell类的功能定义了单个方块的构架。
此类中,定义了一内一外两个正方形,使方块看起来更有立体感。
画正方形通过调用四个LineTo()函数,即画出一个张方形。
代码说明:
voidDrawCell(HDChdc,intl,intt,intr,intb)//函数DrawCell:
画【方格】,
//参数:
设备环境句柄和【方格】的四角坐标,每个方格由内外两个【正方形】(DrawCell)画成,使其有立体感
{
MoveToEx(hdc,l+1,t+1,NULL);//内正方形,MoveToEx()函数,设置画笔当前位置的函数
LineTo(hdc,r-1,t+1);//LineTo()函数,从当前位置向指定坐标点画直线的函数,x和y为线段的终点坐标
LineTo(hdc,r-1,b-1);
LineTo(hdc,l+1,b-1);
LineTo(hdc,l+1,t+1);
MoveToEx(hdc,l+3,t+3,NULL);//外正方形
LineTo(hdc,r-3,t+3);
LineTo(hdc,r-3,b-3);
LineTo(hdc,l+3,b-3);
LineTo(hdc,l+3,t+3);
}
3.DrawBlock函数(画方块)
此函数调用绘图函数,首先定义画笔,然后定义一个for循环,依次调用自定义的DrawCell函数,最后画出一个由四个方格组合成的方块
代码说明:
voidDrawBlock(HDChdc,intblock[4][2])//函数DrawBlock:
画【方块】
//参数:
设备环境句柄和【方块】中四个【方格】在游戏区域中的位置
{
inti;
HPENhpen;
hpen=CreatePen(PS_SOLID,1,RGB(255,255,255));//用指定的样式、宽度和颜色创建一个画笔,PS_SOLID—画笔画出的是实线
SelectObject(hdc,hpen);//该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。
//hpen,被选择的对象的句柄,该指定对象必须由如下的函数创建
for(i=0;i<4;i++)DrawCell(hdc,(block[i][0]-1)*CELL,(block[i][1]-1)*CELL,block[i][0]*CELL,block[i][1]*CELL);
DeleteObject(hpen);//释放所有与该对象有关的系统资源,在对象被删除之后,指定的句柄也就失效了。
}
4.Cover函数(消除方块原来位置)
当方块每一次移动时,都需要消除方块原先的位置,这时候就需要自定义一个函数,每次位置变化时,就调用此函数,
因为游戏背景是黑色的,因此每次方块位置发生改变时,只需要把原先的位置的方块变成黑色即可达到消除方块的作用。
首先调用SelectObject函数替换先前的相同类型的对象,同时定义颜色为黑色,然后通过for循环依次调用Rectangle函数,参数与没改变位置之前,调用的DrawCell函数一样,绘制四个黑色的正方形,以达到消除的目的
代码说明:
voidCover(HDChdc,intorg[4][2])//函数Cover:
清除原来位置的【方块】
//参数:
设备环境句柄和待清除的【方块】
//清除【方块】即在该【方块】的每个【方块】处画一个正方形的黑块
{
inti;
SelectObject(hdc,(HBRUSH)GetStockObject(BLACK_BRUSH));
for(i=0;i<4;i++)
Rectangle(hdc,(org[i][0]-1)*CELL,(org[i][1]-1)*CELL,org[i][0]*CELL,org[i][1]*CELL);
}
5.游戏执行函数(窗口函数)
此函数接受玩家发出的键盘响应,针对不得不同的消息调用不同的函数进行消息处理,控制整个游戏的循环以及对各子函数的调用。
各函数具体实现说明:
(1).创建窗口响应函数(caseWM_CREATE)
当用户创建新的窗口时,会产生这个消息,此消息在CreateWindow函数返回之前被送到消息处理函数。
此函数主要控制了随着方块的往底部的堆积情况,控制方块的活动范围。
代码具体实现说明:
caseWM_CREATE:
top=H-1;//top定义了距离顶部的高度
for(i=0;i { cells[0][i]=1; cells[W+1][i]=1; } for(i=0;i cells[i][H-1]=1; for(i=1;i<=W;i++) for(j=0;j cells[i][j]=0; return0; (2).新的模块产生响应函数(caseMS_NEWBLOCK: ) 产生新的方块进行消息处理,该函数首先检查是否有某一行全部被方格都填满,若该行被填满,则将上一行的填充状态复制到该行,依此类推,即从该行开始,所有的方格都下移一行,然后产生随机方块,随机模块的产生如下: 随机方块的产生 首先通过调用rand()%7;函数,获取0~7中7个随机数,在通过switch语句,针对七个数据,绘制相应的方块形状,最后实现随机模块的产生 具体代码说明: sel=rand()%7;//产生随机数0~7,分别代表【方块】的7种形状 switch(sel) { case0: //▓▓ //▓▓ org[0][0]=block[0][0]=10; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=11; org[1][1]=block[1][1]=0; org[2][0]=block[2][0]=10; org[2][1]=block[2][1]=1; org[3][0]=block[3][0]=11; org[3][1]=block[3][1]=1; break; case1: //▓▓▓▓ org[0][0]=block[0][0]=9; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=10; org[1][1]=block[1][1]=0; org[2][0]=block[2][0]=11; org[2][1]=block[2][1]=0; org[3][0]=block[3][0]=12; org[3][1]=block[3][1]=0; break; case2: //▓ //▓▓ //▓ org[0][0]=block[0][0]=10; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=10; org[1][1]=block[1][1]=1; org[2][0]=block[2][0]=11; org[2][1]=block[2][1]=1; org[3][0]=block[3][0]=11; org[3][1]=block[3][1]=2; break; case3: //▓ //▓▓ //▓ org[0][0]=block[0][0]=11; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=11; org[1][1]=block[1][1]=1; org[2][0]=block[2][0]=10; org[2][1]=block[2][1]=1; org[3][0]=block[3][0]=10; org[3][1]=block[3][1]=2; break; case4: //▓ //▓ //▓▓ org[0][0]=block[0][0]=10; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=10; org[1][1]=block[1][1]=1; org[2][0]=block[2][0]=10; org[2][1]=block[2][1]=2; org[3][0]=block[3][0]=11; org[3][1]=block[3][1]=2; break; case5: //▓ //▓▓ //▓ org[0][0]=block[0][0]=10; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=10; org[1][1]=block[1][1]=1; org[2][0]=block[2][0]=10; org[2][1]=block[2][1]=2; org[3][0]=block[3][0]=9; org[3][1]=block[3][1]=2; break; case6: //▓ //▓▓▓ org[0][0]=block[0][0]=10; org[0][1]=block[0][1]=0; org[1][0]=block[1][0]=9; org[1][1]=block[1][1]=1; org[2][0]=block[2][0]=10; org[2][1]=block[2][1]=1; org[3][0]=block[3][0]=11; org[3][1]=block[3][1]=1; break; default: SendMessage(hwnd,MS_NEWBLOCK,0,0); break; } (3).键盘消息响应控制(caseWM_KEYDOWN: ) 此函数分别对键盘消息。 即(上,下,左,右)进行处理 当响应消息为下,左,右,的时候,直接更改方块的再矩阵的位置,以达到方块移动的效果,当相应消息上的时候,就需要改变方块的定位。 首先定义一个整型变量,记录变换的次数,然后通过switch语句,当前方块作为条件,不同的方块,所旋转的消息处理函数也不一样,每一个方块随后所变化的种类也不相同,因此,根据不同的方块,在进行旋转除的余数,对方块中四个方格的位置进行改变,当旋转后新位置时有方格时,则旋转取消 具体代码实现如下: caseWM_KEYDOWN: //响应键盘控制 r=0; switch((int)wParam) { caseVK_LEFT: for(i=0;i<4;i++) block[i][0]--; break; caseVK_RIGHT: for(i=0;i<4;i++) block[i][0]++; break; caseVK_DOWN: for(i=0;i<4;i++) block[i][1]++; break; //按[向上键],【方块】顺时针旋转 //【方块】的旋转不是真正的旋转,而是根据不同的【方块】形状和 //该【方块】旋转过的次数来移动其中的一个或几个【方格】,从而 //达到旋转的效果 caseVK_UP: r=1; flag++;//【方块】旋转加1 switch(sel)//sel代表当前【方块】的形状 { case0: break; case1: flag=flag%2; for(i=0;i<4;i++) { block[i][(flag+1)%2]=org[2][(flag+1)%2]; block[i][flag]=org[2][flag]-2+i; } break; case2: flag=flag%2; if(flag) {block[0][1]+=2;block[3][0]-=2;} else {block[0][1]-=2;block[3][0]+=2;} break; case3: flag=flag%2; if(flag) {block[0][1]+=2;block[3][0]+=2;} else {block[0][1]-=2;block[3][0]-=2;} break; case4: flag=flag%4; switch(flag) { case0: block[2][0]+=2;block[3][0]+=2; block[2][1]+=1;block[3][1]+=1; break; case1: block[2][0]+=1;block[3][0]+=1; block[2][1]-=2;block[3][1]-=2; break; case2: block[2][0]-=2;block[3][0]-=2; block[2][1]-=1;block[3][1]-=1; break; case3: block[2][0]-=1;block[3][0]-=1; block[2][1]+=2;block[3][1]+=2; break; } break; case5: flag=flag%4; switch(flag) { case0: block[2][0]+=1;block[3][0]+=1; block[2][1]+=2;block[3][1]+=2; break; case1: block[2][0]+=2;block[3][0]+=2; block[2][1]-=1;block[3][1]-=1; break; case2: block[2][0]-=1;block[3][0]-=1; block[2][1]-=2;block[3][1]-=2; break; case3: block[2][0]-=2;block[3][0]-=2; block[2][1]+=1;block[3][1]+=1; break; } break; case6: flag=flag%4; switch(flag) { case0: block[0][0]++;block[0][1]--; block[1][0]--;block[1][1]--; block[3][0]++;block[3][1]++; break; case1: block[1][0]++;block[1][1]++;break; case2: block[0][0]--;block[0][1]++;break; case3: block[3][0]--;block[3][1]--;break; } break; } break; } for(i=0;i<4;i++)//判断【方块】旋转后新位置是否有【方格】,若有,则旋转取消 if(cells[block[i][0]][block[i][1]]) { if(r)flag+=3; for(i=0;i<4;i++) for(j=0;j<2;j++) block[i][j]=org[i][j]; return0; } SendMessage(hwnd,MS_DRAW,0,0);; return0; (4).旧方块清除消息处理(caseMS_DRAW: ) 三.游戏运行说明 1.游戏运行流程图 1.游戏开始 当游戏开始时,调用MessageBox函数,弹出消息,提示用户游戏开始 如图: 2.游戏进行 3.游戏结束 当方块最顶行与顶部的距离小于1时,弹出消息,提示用户游戏结束。 四.课程设计总结 通过本次课程设计,让我对游戏开发的知识有了更多的了解,也对c++有了更进一步的掌握
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 游戏 开发 俄罗斯方块 设计 说明书