课程论文.docx
《课程论文.docx》由会员分享,可在线阅读,更多相关《课程论文.docx(10页珍藏版)》请在冰点文库上搜索。
课程论文
《图形与游戏程序设计》
游戏:
俄罗斯方块
姓名王志强
学号1320410217
班级计算机2班
分院 信息分院
2015年12月25日
俄罗斯方块
摘要:
本文是一篇关于俄罗斯方块游戏功能模块实现与设计的报告,本文以俄罗斯方块逻辑流程图,功能流程图,主要功能算法为切入点,清晰的表达出俄罗斯方块游戏如何实现,把抽象的函数具体的表达出来。
最终完成了游戏的实现
关键字:
俄罗斯方块逻辑流程图算法函数
1.引言
随着现代科技的高速发展短短几十年,电脑游戏得到迅猛发展。
电脑游戏充分利用多媒体网络优势,拓宽了传统游戏的界限,给人们带来全新的体验。
在这些游戏中,FLASH游戏以其好看的动画,绚丽的声光效果,高度的通畅性,及很强的可玩性,而受到广大青少年的青睐。
本文就俄罗斯方块的FLASH游戏的设计和实现进行分析和阐述。
该游戏主要使用AdobeFlashProfessionalCS5.5软件进行游戏的设计,是一款操作简单、休闲益智的小游戏。
游戏主角是不停下落的方块组合,当一个方块组合落地后另一个方块组合开始下落,当它们在场景中铺满一整行时,会消去那铺满的那一行。
键盘的上下左右键可以控制游戏主角的旋转下落速度移动方向。
当方块落地时的行高度,超出场景设置的行高度时,游戏就会失败,只要消行得分大于前100就能进入排行榜,留下自己的名字和成绩。
2.游戏介绍
游戏规则:
合理的进行方块叠加,一行填充满时进行并获得相应的分数,当方块的高度超过给定的场景高度,则游戏结束。
使用方法:
用键盘进行操作,“↑”键为旋转,“→”为向右移动,“←”为向左移动,“↓”为加速下落。
3.游戏的设计
3.1类的设计
privatevarside:
Number=20;//边长
privatevarnumRows:
int;//行数
privatevarnumCols:
int;//列数
privatevarsceneArr:
Array;//场景(格子的世界)
privatevarbrickArr:
Array;//砖头数组
privatevarbrickX:
int;//砖头的坐标(格子世界数组下标)
privatevarbrickY:
int;
privatevardownSpeed:
int=1;//向下移动速度
privatevarxSpeed:
int=1;
privatevarticker:
Timer;//计时器
privatevarmoveType:
String="down";//移动类型
privatevarcanMove:
Array=newArray();//该方向上可否移动数组索引012分别表示为左右下,。
3.2整体框架
3.3算法设计
砖块数组的里的1更新到场景里的算法
PrivatefunctionupdateToScene():
void
{
for(vari:
int=blankU;i<4-blankD;i++)
{
for(varj:
int=blankL;j<4-blankR;j++)
{
if(brickArr[i][j]==1)
{
sceneArr[brickY+i][brickX+j]=brickArr[i][j];
}
}
}
}
旋转矩阵的算法
privatefunctionroll(oldArr:
Array):
Array
{
varnewArr:
Array=newArray();
for(vari:
int=0;i<4;i++)
{
newArr[i]=newArray(4);
for(varj:
int=0;j<4;j++)
{
newArr[i][j]=oldArr[j][3-i];
}
}
returnnewArr;
}
检测空白行数的算法
privatefunctiongetblankD():
int
{
varblankD:
int=0;
for(vari:
int=3;i>1;i--)
{
for(varj:
int=0;j<4;j++)
{
if(brickArr[i][j]==1)
{
returnblankD;
}
}
blankD++;
}
碰撞检测的算法
publicfunctioncheckHit(moveType:
String):
void
{
canMove=[1,1,1];//先初始化1,全能移动。
哪个方向检测到将碰撞,则该方向为0
for(vari:
int=blankU;i<4-blankD;i++)
{
for(varj:
int=blankL;j<4-blankR;j++)
{
if(brickArr[i][j]==1)
{//检测砖块里1的单元格附近的单元格
switch(moveType)
{
case"left":
varhitL:
Boolean=checkCell(brickY+i,brickX+j-1,"hitL");//左
break;
case"right":
varhitR:
Boolean=checkCell(brickY+i,brickX+j+1,"hitR");//右
break;
case"down":
varhitD:
Boolean=checkCell(brickY+i+1,brickX+j,"hitD");//下
break;
default:
break;
}
if(hitL)
{
canMove[0]=0;
}//左只要砖块中有一个说左不能走,就不能走
if(hitR)
{
canMove[1]=0;
}//右
if(hitD)
{
canMove[2]=0;
}//下
}
}
}
}
消行的算法
privatefunctioncheckLine():
void
{
for(vari:
int=numRows-1;i>=0;i--)
{
varcanClear:
Boolean=true;
for(varj:
int=0;j{
if(sceneArr[i][j]!
=2)
{
canClear=false;//这行只要有个不是2,则不消,全是2才消行
}
}
if(canClear)
{
clearLine(i);
i++;//这个i++很必要,这行被消,上面那行下来,必须重新检测这行
}
}
}
4.游戏的实现
privatefunctioninit()//初始化数据
functionRecords(Points)//得分统计
functiononclick(e:
MouseEvent)//初始化世界
privatefunctioninitScene():
void//刷新场景
privatefunctioncreateBrick():
void
{
brickArr=newArray();
varrandNum:
Number=Math.random();
brickArr=[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]];
}//创建方块
privatefunctionKeyDown(ev:
KeyboardEvent):
void//键盘按下控制方向
privatefunctionmoveBrick(moveType:
String):
void//移动砖块
privatefunctionupdateToScene():
void//方块数组里的1更新到场景里
privatefunctionclearBrick():
void//清楚移动前的方块
privatefunctionroll(oldArr:
Array):
Array//旋转矩阵
privatefunctiongetblankD():
int//检测空白行数
publicfunctioncheckHit(moveType:
String):
void//碰撞检测
privatefunctioncheckLine():
void
{
for(vari:
int=numRows-1;i>=0;i--)
{
varcanClear:
Boolean=true;
for(varj:
int=0;j{
if(sceneArr[i][j]!
=2)
{
canClear=false;//这行只要有个不是2,则不消,全是2才消行
}
}
if(canClear)
{
clearLine(i);
i++;//这个i++很必要,这行被消,上面那行下来,必须重新检测这行
}
}
}//行检测,检测出哪些行要消并进行消行
privatefunctioncheckLose():
void//游戏结束
附:
分工情况表
分工情况表
游戏名称:
俄罗斯方块
姓名
完成部分
王志强
AS3.0代码及相关文档
邱天奇
游戏测试及问题反馈
吴威
游戏界面美化