俄罗斯方块编程课程设计报告Word文档格式.docx
《俄罗斯方块编程课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块编程课程设计报告Word文档格式.docx(35页珍藏版)》请在冰豆网上搜索。
方块固定以后如果桌面上已经固定了的方块满一行,则消除一行并将消除行之上的部分向下移动,消除一行得1分。
基本操作如下:
(1)方块落下的过程中可以用左右方向键移动方块的位置。
(2)上方向键用来旋转方块,即所谓的变形。
(3)下方向键用来加速方块下落。
(4)游戏中按下回车键暂停游戏。
再次按回车键继续游戏。
五.总体设计
游戏以Windows窗口的形式运行。
窗口的左边作为游戏的桌面,桌面的大小是10*20个单位。
随机出现一个方块从游戏桌面的上方开始向下移动,并随机生产一个向下方块显示到桌面的右边。
方块的颜色分为7种。
在显示下一个方块的上面显示玩家得分,下面显示游戏帮助。
当方块不能向下移动的时候,将方块固定到桌面上,固定的方法是将方块的每个部分所在的坐标的桌面数值设置为1.固定以后,判断桌面数值的每一行,如果一行的数值全部都是1的话,就将桌面上的这一行数值删除,并将这一行上面所有行向下移动一行。
删除一行的同时,玩家的得分加1。
上述操作完成以后,将下一个方块从桌面的顶部开始下落,重新生成下一个方块。
在固定方块到桌面的时候,还要判断方块的最顶端部分是否超出桌面范围,并以此作为游戏结束的依据。
六.详细设计与程序实现
一.方块设计
游戏的核心和重点在于7种方块的设计,这7种方块的形状分别为Z形、S形、线形、T形、方形、L形和反L形、其数据结构分别用相对坐标表示如下:
{{0,-1},{0,0},{-1,0},{-1,1}}
{{0,-1},{0,0},{1,0},{1,1}}
{{0,-1},{0,0},{0,1},{0,2}}
{{-1,0},{0,0},{1,0},{0,1}}
{{0,0},{1,0},{0,1},{1,1}}
{{-1,-1},{0,-1},{0,0},{0,1}}
{{1,-1},{0,-1},{0,0},{0,1}}
因为屏幕的左上角为原点,向右为*轴增加的方向,向下为y轴增加的方向,将上述坐标对号入座即可得到向对应的方块形状。
二.方块形状
①.Z形方块
Z形方块对号入座如下图所示:
Z形方块坐标图
②.S型方块
S形方块对号入座如下图所示:
S形方块坐标图
③.线形方块
线形方块对号入座如图所示:
线形方块坐标图
④.T型方块
T型方块对号入座如图所示:
{{-1,0},{0,0},{1,0},{0,1}}
T型方块坐标图
⑤.方形方
方形方块对号入座如图所示:
方形方块坐标图
⑥.L形方块
L.L型方块对号入座如图所示:
.L型方块坐标图
⑦.反L形方块
反L形方块对号入座如图所示:
L形方块坐标图
在方块相对坐标基础上加上*和y的偏移量,就可以在屏幕的不同位置得到相应的反面方块。
完成方块的向左,向右及向下移动。
将方块的相对坐标旋转90度得到的新坐标就算变形后的坐标。
顺时针操作的公式是:
*’=-y
y’=*
逆时针旋转操作的公式是:
*’=y
其中,*和y代表旋转前方块的相对坐标,*和y代表旋转后方块的相对坐标。
唯一例外的是方形方块,在旋转处理的时候不做处理。
七.主要处理流程
游戏的主要流程图如下:
八.游戏设计源程序
//zhangdi
#include<
windows.h>
time.h>
stdio.h>
#include"
tetris.h"
#defineAPP_NAME"
TETRIS"
#defineAPP_TITLE"
TetrisGame"
#defineGAMEOVER"
GAMEOVER"
#defineSHAPE_COUNT7
#defineBLOCK_COUNT4
#defineMA*_SPEED5
#defineCOLUMS10
#defineROWS20
#defineREDRGB(255,0,0)
#defineYELLOWRGB(255,255,0)
#defineGRAYRGB(128,128,128)
#defineBLACKRGB(0,0,0)
#defineWHITERGB(255,255,255)
#defineSTONERGB(192,192,192)
#defineCHARS_IN_LINE14
#defineSCORE"
SCORE%4d"
//全局变量定义
charscore_char[CHARS_IN_LINE]={0};
char*press_enter="
PressEnterkey..."
;
//帮助提示信息
char*help[]=
{
"
Pressspaceorupkeytotransformshape."
Pressleftorrightkeytomoveshape."
Pressdownkeytospeedup."
Pressenterkeytopausegame."
Enjoyit.:
-)"
0
};
//枚举游戏的状态
enumgame_state
game_start,
game_run,
game_pause,
game_over
}state=game_start;
//定义方块的颜色
COLORREFshape_color[]=
RGB(255,0,0),
RGB(0,255,0),
RGB(0,0,255),
RGB(255,255,0),
RGB(0,255,255),
RGB(255,0,255),
RGB(255,255,255)
//定义方块的种类型
intshape_coordinate[SHAPE_COUNT][BLOCK_COUNT][2]=
{{0,-1},{0,0},{-1,0},{-1,1}},
{{0,-1},{0,0},{1,0},{1,1}},
{{0,-1},{0,0},{0,1},{0,2}},
{{-1,0},{0,0},{1,0},{0,1}},
{{0,0},{1,0},{0,1},{1,1}},
{{-1,-1},{0,-1},{0,0},{0,1}},
{{1,-1},{0,-1},{0,0},{0,1}}
intscore=0;
//得分
shapene*t=0;
//下一个方块
shapecurrent=0;
//当前方块
intcurrent_coordinate[4][2]={0};
//当前方块的每一部分坐标
inttable[ROWS][COLUMS]={0};
//游戏桌面
intshape*=0;
//当前方块的*坐标
intshapey=0;
//当前方块的y坐标
intspeed=0;
//方块下移速度
clock_tstart=0;
//每一帧开始时间
clock_tfinish=0;
//每一帧结束时间
/*windows绘图用变量*/
HWNDgameWND;
/*window窗口句柄*/
HBITMAPmemBM;
/*内存位图*/
HBITMAPmemBMOld;
/*内存原始位图*/
HDCmemDC;
/*内存DC*/
RECTclientRC;
/*客户端矩形区域*/
HBRUSHblackBrush;
/*黑色画笔*/
HBRUSHstoneBrush;
/*深灰色画笔*/
HBRUSHshapeBrush[SHAPE_COUNT];
/*方块画笔,种方块,每种一个*/
HPENgrayPen;
/*灰色画笔*/
HFONTbigFont;
/*大字体,用来显示游戏名字和GameOver*/
HFONTsmallFont;
/*小字体用来显示帮助信息等*/
/*主要处理函数*/
intma**()/*取最大坐标,函数名称:
ma**;
函数功能:
取得当前方块的最大*坐标*/
inti=0;
/*取最大坐标,函数名称:
int*=current_coordinate[i][0];
intm=*;
for(i=1;
i<
BLOCK_COUNT;
i++)/*取最大坐标,函数名称:
{
*=current_coordinate[i][0];
if(m<
*)/*取最大坐标,函数名称:
{
m=*;
}
returnm;
}
intmin*()/*取最小坐标,函数名称:
min*;
取得当前方块的最小*坐标*/
/*取最小坐标,函数名称:
i++)/*取最小坐标,函数名称:
if(m>
*)/*取最小坐标,函数名称:
/*逆时针旋转方块*/
voidturn_left()/*函数名称:
turn_left;
将当前方块逆时针旋转度*/
{
/*函数名称:
int*,y;
for(i=0;
i<
4;
i++)/*函数名称:
y=current_coordinate[i][1];
current_coordinate[i][0]=y;
current_coordinate[i][1]=-*;
/*顺时针旋转方块*/
voidturn_right()/*函数名称:
turn_right;
将当前方块顺时针旋转度*/
current_coordinate[i][0]=-y;
current_coordinate[i][1]=*;
}
}
/*检查方块是否越界*/
intout_of_table()/*函数名称:
out_of_table;
检查当前方块是否超出桌面范围*/
*=shape*+current_coordinate[i][0];
y=shapey+current_coordinate[i][1];
if(*<
0||*>
(COLUMS-1)||y>
(ROWS-1))/*函数名称:
return1;
if(table[y][*])/*函数名称:
return0;
/*旋转方块*/
voidtransform()/*函数名称:
transform;
函数功能:
旋转当前方块*/
if(current==SquareShape)/*函数名称:
return;
turn_right();
if(out_of_table())/*函数名称:
turn_left();
/*判断方块能否向左移动*/
intleftable()/*函数名称:
leftable;
判断当前方块能否向左移动,能移动返回,否则返回*/
=0||table[y][*-1]==1)/*函数名称:
/*判断方块能否向右移动*/
intrightable()/*函数名称:
rightable;
判断当前方块能否向右移动,能移动返回,否则返回*/
if(*>
=(COLUMS-1)||table[y][*+1]==1)/*函数名称:
/*判断方块能否向下移动*/
intdownable()/*函数名称:
downable;
判断当前方块能否向下移动,能移动返回,否则返回*/
if(y>
=(ROWS-1)||table[y+1][*]==1)/*函数名称:
/*向左移动当前方块*/
voidmove_left()/*函数名称:
move_left;
向左移动当前方块*/
if(leftable())/*函数名称:
shape*--;
/*向右移动当前方块*/
voidmove_right()/*函数名称:
move_right;
向右移动方块*/
if(rightable())/*函数名称:
shape*++;
/*向下移动当前方块*/
voidmove_down()/*函数名称:
move_down;
向下移动当前方块*/
if(downable())/*函数名称:
shapey++;
else
if(add_to_table())/*函数名称:
remove_full();
ne*t_shape();
state=game_over;
/*将当前方块固定到桌面上*/
intadd_to_table()/*函数名称:
add_to_table;
将当前方块固定到桌面上,若返回,表示游戏结束*/
add_t