flash俄罗斯方块项目说明.docx
- 文档编号:25774948
- 上传时间:2023-06-13
- 格式:DOCX
- 页数:24
- 大小:789.17KB
flash俄罗斯方块项目说明.docx
《flash俄罗斯方块项目说明.docx》由会员分享,可在线阅读,更多相关《flash俄罗斯方块项目说明.docx(24页珍藏版)》请在冰豆网上搜索。
flash俄罗斯方块项目说明
数学与计算机学院
课程设计说明书
课程名称:
Flash游戏程序设计
课程代码:
题目:
俄罗斯方块
年级/专业/班:
2012级计科
开始时间:
2015年3月2日
完成时间:
2015年5月4日
课程设计成绩:
学习态度及平时成绩(20)
技术水平与实际能力(20)
完成情况(20)
创新(5)
说明书(计算书、图纸、分析报告)撰写质量(35)
总分(100)
一、系统分析与总体设计
1需求分析
俄罗斯方块是一个比较简单的游戏。
它游戏过程仅需要玩家将不断下落的各种形状的方块移动、翻转,如果某一行被方块充满了,那就将些行消掉;而当窗口中无法再容纳下落的方块时,就宣告游戏的结束。
游戏的需求分析如下:
界面设计需求:
(1)实验功能需求虽需要的按钮
(2)显示积分和等级的文本
(3)下一个方块下落提示界面,需要用不同的颜色表示
(4)游戏运行界面
功能需求:
(1)实现各种方块的生产,包括形状和颜色等信息;
(2)实现各个方块的上下左右移动和旋转的功能(鼠标操作和键盘操作)。
(3)实现消行的功能;
(4)实现得分的统计功能;
(5)实现开始,暂停,结束等功能;
2总体设计
2.1系统总体功能设计
首先需要对俄罗斯方块的设计和功能需求进行详细的了解和分析,一个具有功能完全满足基本需要的系统需要包括以下几个功能模块。
如图1-1所示是俄罗斯方块总体设计功能图。
图1-1俄罗斯方块总体设计功能图
2.2游戏界面设计
游戏界面设计包括:
游戏界面的布局,包括开始界面,游戏显示界面,下一个方块下落是界面,积分和等级记录界面等。
如图1-2所示,游戏界面设计图:
图1-2游戏界面设计图
2.3操作设计
操作设计包括:
①游戏开始结束暂停操作设计:
在游戏开始界面上有开始按钮,用鼠标操作,选择是否要进入游戏。
②方块形状转换操作:
良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
如表1-1所示俄罗斯方块定位点设置表
俄罗斯方块定位点设置,以黑色点为(0,0)坐标
状态类型
1
2
3
4
1
2
3
4
5
6
7
表1-1俄罗斯方块方块形状图
键盘处理事件:
方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。
③消行操作:
当方块落到游戏界面最底部并且铺满最后一行,就能消去所在这一行,积分增加10分,消2行30分,消3行60分,消4行100分,而积分增加到一定数值时,玩家等级增加。
④积分等级记录设计:
随着玩家对游戏的熟悉程度,对游戏的掌握程度,当玩家进行操作所消的行数越多,积分增加得越多,玩家等级也随之增加。
2.4流程图
图2-2程序流程图
二、系统实现与调试
1.方块产生代码
//先建立180个小方块角色备用
for(i=0;i<180;i++){
_root.attachMovie("Block","b"+i,i);
}
//定义方块边长
varblockWidth=16;
//存放各种旋转角度及各种方块形状的数组
varBlockSet=newArray();
//******长条形
TempArray=newArray();
TempArray.push([[-2,0],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-2],[0,-1],[0,0],[0,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[2,0]]);
TempArray.push([[0,-1],[0,0],[0,1],[0,2]]);
//将长条形数据推入BlockSet数组
BlockSet.push(TempArray);
//******田字形
TempArray=newArray();
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
BlockSet.push(TempArray);
//T字形
TempArray=newArray();
TempArray.push([[0,-1],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-1],[0,0],[1,0],[0,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[0,1]]);
TempArray.push([[0,-1],[-1,0],[0,0],[0,1]]);
BlockSet.push(TempArray);
//******反L字形
TempArray=newArray();
TempArray.push([[-1,-1],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-1],[1,-1],[0,0],[0,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[1,1]]);
TempArray.push([[0,-1],[0,0],[-1,1],[0,1]]);
BlockSet.push(TempArray);
//******L字形
TempArray=newArray();
TempArray.push([[1,-1],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-1],[0,0],[0,1],[1,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[-1,1]]);
TempArray.push([[-1,-1],[0,-1],[0,0],[0,1]]);
BlockSet.push(TempArray);
//******Z字形
TempArray=newArray();
TempArray.push([[-1,0],[0,0],[0,1],[1,1]]);
TempArray.push([[0,-1],[-1,0],[0,0],[-1,1]]);
TempArray.push([[-1,-1],[0,-1],[0,0],[1,0]]);
TempArray.push([[1,-1],[0,0],[1,0],[0,1]]);
BlockSet.push(TempArray);
//******反Z字形
TempArray=newArray();
TempArray.push([[0,0],[1,0],[-1,1],[0,1]]);
TempArray.push([[-1,-1],[-1,0],[0,0],[0,1]]);
TempArray.push([[0,-1],[1,-1],[-1,0],[0,0]]);
TempArray.push([[0,-1],[0,0],[1,0],[1,1]]);
BlockSet.push(TempArray);
2.系统运行的结果
(1)游戏开始:
点击游戏界面上的开始按钮,玩家就可以进行游戏的一系列操作。
如图3-1所示
图3-1游戏开始运行界面
(2)方块转换及下一个方块提示:
按键盘上向上或空格键的按钮,都会使当前方块变换形式。
图3-2方块下落视图
(3)消行及积分累加等级变化操作:
当当方块落到游戏界面最底部并且铺满最后一行,就能消去所在这一行,积分增加10分。
图3-3消除后得积分
(4)游戏结束:
当方块累计顶到游戏运行界面上方边缘的时候,就结束游戏。
图3-4游戏结束图
三、程序代码
stop();
//先建立180个小方块角色备用
for(i=0;i<180;i++){
_root.attachMovie("Block","b"+i,i);
}
//定义方块边长
varblockWidth=16;
//存放各种旋转角度及各种方块形状的数组
varBlockSet=newArray();
//******长条形
TempArray=newArray();
TempArray.push([[-2,0],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-2],[0,-1],[0,0],[0,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[2,0]]);
TempArray.push([[0,-1],[0,0],[0,1],[0,2]]);
//将长条形数据推入BlockSet数组
BlockSet.push(TempArray);
//******田字形
TempArray=newArray();
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
TempArray.push([[0,0],[1,0],[0,1],[1,1]]);
BlockSet.push(TempArray);
//T字形
TempArray=newArray();
TempArray.push([[0,-1],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-1],[0,0],[1,0],[0,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[0,1]]);
TempArray.push([[0,-1],[-1,0],[0,0],[0,1]]);
BlockSet.push(TempArray);
//******反L字形
TempArray=newArray();
TempArray.push([[-1,-1],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-1],[1,-1],[0,0],[0,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[1,1]]);
TempArray.push([[0,-1],[0,0],[-1,1],[0,1]]);
BlockSet.push(TempArray);
//******L字形
TempArray=newArray();
TempArray.push([[1,-1],[-1,0],[0,0],[1,0]]);
TempArray.push([[0,-1],[0,0],[0,1],[1,1]]);
TempArray.push([[-1,0],[0,0],[1,0],[-1,1]]);
TempArray.push([[-1,-1],[0,-1],[0,0],[0,1]]);
BlockSet.push(TempArray);
//******Z字形
TempArray=newArray();
TempArray.push([[-1,0],[0,0],[0,1],[1,1]]);
TempArray.push([[0,-1],[-1,0],[0,0],[-1,1]]);
TempArray.push([[-1,-1],[0,-1],[0,0],[1,0]]);
TempArray.push([[1,-1],[0,0],[1,0],[0,1]]);
BlockSet.push(TempArray);
//******反Z字形
TempArray=newArray();
TempArray.push([[0,0],[1,0],[-1,1],[0,1]]);
TempArray.push([[-1,-1],[-1,0],[0,0],[0,1]]);
TempArray.push([[0,-1],[1,-1],[-1,0],[0,0]]);
TempArray.push([[0,-1],[0,0],[1,0],[1,1]]);
BlockSet.push(TempArray);
//建立用来记录方块堆放情形的数组
vartroughMap=newArray();
for(i=0;i<20;i++){
//每行可放十个方块
TempArray=newArray(0,0,0,0,0,0,0,0,0,0);
troughMap.push(TempArray);
}
//使用的方块指示数值
varblockPointer=-4;
//起始分数
varscore=0;
//第一关
varlevel=1;
//下一个方块组
varnextBlock=random(BlockSet.length);
//******建立键盘侦听者
myKeyListener=newObject();
myKeyListener.onKeyDown=function(){
//取得按下的键码
kd=Key.getCode();
//若按下的是“向右”
if(kd==Key.RIGHT){
barrier=false;
for(i=0;i<4;i++){
x=fallingSet[orientSet][i][0]+xCenter;
y=fallingSet[orientSet][i][1]+yCenter;
if(x<9&&troughMap[y][x+1]!
=0){
barrier=true;
}
if(x==9){
barrier=true;
}
}
if(barrier==false){
xCenter++;
}
}elseif(kd==Key.LEFT){
//若按下的是“向左”
barrier=false;
for(i=0;i<4;i++){
x=fallingSet[orientSet][i][0]+xCenter;
y=fallingSet[orientSet][i][1]+yCenter;
if(x>0&&troughMap[y][x-1]!
=0){
barrier=true;
}
if(x==0){
barrier=true;
}
}
if(barrier==false){
xCenter--;
}
}elseif(kd==Key.UP){
//若按下的是“向上”
barrier=false;
ori=(orientSet+1)%4;
for(i=0;i<4;i++){
x=fallingSet[ori][i][0]+xCenter;
y=fallingSet[ori][i][1]+yCenter;
if(x<0||x>9||y>19||troughMap[y][x]!
=0){
barrier=true;
}
}
if(barrier==false){
orientSet=ori;
}
}elseif(kd==Key.SPACE){
//若按下的是“空格键”
barrier=false;
ori=(orientSet+3)%4;
for(i=0;i<4;i++){
x=fallingSet[ori][i][0]+xCenter;
y=fallingSet[ori][i][1]+yCenter;
if(x<0||x>9||y>19||troughMap[y][x]!
=0){
barrier=true;
}
}
if(barrier==false){
orientSet=ori;
}
}elseif(kd==Key.DOWN){
//若按下的是“向下”
barrier=false;
for(i=0;i<4;i++){
x=fallingSet[orientSet][i][0]+xCenter;
y=fallingSet[orientSet][i][1]+yCenter;
if(x<19&&troughMap[y+1][x]!
=0){
barrier=true;
}
if(y==19){
barrier=true;
}
}
if(barrier==false){
yCenter++;
}
}
//更新方块组的位置
for(i=0;i<4;i++){
j=fallingSet[orientSet][i][0];
k=fallingSet[orientSet][i][1];
with(eval("b"+(i+blockPointer))){
_x=blockAreaX+(j+xCenter)*blockWidth;
_y=blockAreaY+(k+yCenter)*blockWidth;
gotoAndStop(blockStyle+2);
}
}
};
//将侦听者注册成侦听键盘
Key.addListener(myKeyListener);
//先设定方块组尚未叠在某个方块上
barrier=false;
for(i=0;i<4;i++){
j=fallingSet[orientSet][i][0]+xCenter;
k=fallingSet[orientSet][i][1]+yCenter+1;
//若方块落到底
if(k>=20){
barrier=true;
}
//若方块叠在某个方块上
if(troughMap[k][j]!
=0){
barrier=true;
}
}
//******若方块组还可以往下掉一格
if(barrier==false){
//往下掉一格
yCenter++;
//移动方块组
for(i=0;i<4;i++){
j=fallingSet[orientSet][i][0];
k=fallingSet[orientSet][i][1];
with(eval("b"+(i+blockPointer))){
_x=blockAreaX+(j+xCenter)*blockWidth;
_y=blockAreaY+(k+yCenter)*blockWidth;
gotoAndStop(blockStyle+2);
}
}
}elseif(yCenter==0){
//******若方块组不能再往下移,且方块区已满
gotoAndStop("gameOver");
}else{
//******若方块组不能再往下移,但未满
//将方块位置记录下来
for(i=0;i<4;i++){
j=fallingSet[orientSet][i][0]+xCenter;
k=fallingSet[orientSet][i][1]+yCenter;
troughMap[k][j]=blockStyle+2;
}
//预设填满的列数为0
fullNum=0;
for(i=0;i<20;i++){
//预设该列为填满
full=true;
for(nameintroughMap[i]){
if(troughMap[i][name]==0){
//若有一格为空,表示未填满
full=false;
}
}
//若某行填满
if(full==true){
//删除该行
troughMap.splice(i,1);
TempArray=newArray(0,0,0,0,0,0,0,0,0,0);
//由上方补上新行
troughMap.unshift(TempArray);
//计算填满的行数
fullNum++;
}
}
//若有填满任何行
if(fullNum!
=0){
for(i=1;i<=fullNum;i++){
//加分
score+=10*i;
}
//满一千分进入下一关
level=int(score/1000)+1;
if(level>3){
//最大关数为3
level=3;
}
//将方块区中有记录的地方填入方块
k=0;
for(i=0;i<20;i++){
for(j=0;j<10;j++){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- flash 俄罗斯方块 项目 说明