俄罗斯方块C++课程设计报告样本.docx
- 文档编号:24935621
- 上传时间:2023-06-03
- 格式:DOCX
- 页数:25
- 大小:61.39KB
俄罗斯方块C++课程设计报告样本.docx
《俄罗斯方块C++课程设计报告样本.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块C++课程设计报告样本.docx(25页珍藏版)》请在冰豆网上搜索。
俄罗斯方块C++课程设计报告样本
课程设计报告
题目:
基于C++俄罗斯方块
学院:
专业:
学号:
姓名:
二○一三年十二月
典型小游戏设计-俄罗斯方块
一、需求分析。
1.1、游戏需求
随机给出不同形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定区域,若填满一条便消掉,若在游戏中各形状填满了给定区域,为输者,弹出相应提示。
1.2、游戏界面需求
良好顾客界面,关于信息显示(如操作办法、级别等)。
让方块在一定区域内运动和变形,该区域用一种颜色表白,即用一种颜色作为背景,本游戏背景设为黑色。
还需用另一种颜色把黑色围起来,宽度适中,要实现美感。
而不同方块用不同着色表达,使游戏界面更加清晰、有条理。
消层时采用一定期间延迟,增长视觉消行感官效果。
1.3、游戏方块需求
良好方块形状设计,绘制七种常用基本图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字型)以及此外本程序此外加入点形方块,各个方块要能实现它变形,可设为顺时针或逆时针变形,普通为逆时针。
为体现游戏趣味性和扩展性,本游戏象征性增长了点形方块,其她更多形状方块可用类似办法增长。
1.4、游戏控制需求
游戏控分为各种方面,涉及画面绘制,控制命令获取,控制命令分派、控制命令解决,方块绘制,方块移动,方块旋转,方块下落和消层以及计分等。
对各个命令合理解决和综合控制十分重要,一旦出错也许导致整个程序崩溃,因而需要小心设计。
二、系统设计。
2.1、程序流程图:
2.2、游戏设计概述
从整体上而言,在该游戏可设计一种方块类,其中涉及对方块信息描述(如:
ID)、方块操作(如:
旋转、下沉)。
再设计一种控制类,实现各种控制(如:
获取控制信号,分发控制信号)。
另定义一种游戏区类,用以解决游戏区绘制等内容。
框图如下:
方块类(GAME_BLOCK)
游戏区类(Window)
Private:
BLOCKINFOg_CurBlock;
(新方块)
BLOCKINFOg_NextBlock;
(下一方块)
Private:
无
Public:
VoidInitWindow()
Public:
GAME_BLOCK(){}
~GAME_BLOCK(){}
voidNewBlock();//生成方块
boolCheckBlock(BLOCKINFO_block);//检测方块能否放下
voidDrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);
voidOnRotate();//旋转方块
voidOnLeft();//左移方块
voidOnRight();//右移方块
voidOnDown();//下移方块
voidOnSink(CGAME&);//沉底方块
BLOCKINFO&CurBlock();
BLOCKINFO&NextBlock();
游戏控制类(CGame)
Private:
VoidDispatchControl(CTRL);
Public:
voidInitGame();//初始化游戏
VoidStart_Game();//开始游戏
voidGame_Over();//游戏结束
voidNewGame();//新游戏
voidQuit_Game();//退出游戏
CTRLGetControl(bool_onlyresettimer=false);//获取控制命令
在主函数中(按照2.1中框图),先通过控制类初始化游戏,再通过随机时间函数获得一种随机数,该随机数拟定一种方块,即用该随机数产生一种ID从而拟定产生为方块。
然后从键盘获得各种操作信号,通过控类函数对操作信号进行分发、解决,进而控制方块行为变化。
与此同步,监控游戏区中已有方块状态,一旦满足消行即进行消行控制,同步进行计分和级别划分,而如果游戏区已满则游戏结束,弹出提示。
而对界面和方块呈现重要通过第三方软件EasyX实现,通过其画图位置变化与时间结合达到方块视觉移动效果。
2.3、定义方块数据构造
方块是本游戏基本要素,对于方块设计,本游戏用4*4矩阵画出来,在相应位置置为‘1’和‘0’以实现各种方块形状,以“立L形”为例如下:
0
1
0
0
0
1
0
0
0
1
1
0
0
0
0
0
而在程序设计中则赋予各种基本方块一种不同十六进制ID即可表达该方块,如“立7形”其ID为[0x4460],再与其其她变形组合和着色分派即可得到各种L形ID集合{0x4460,0x02E0,0x0622,0x0740,MAGENTA};其她各种方块类似设计。
详细清单如下:
{{0x0F00,0x4444,0x0F00,0x4444,RED},//I
{0x0660,0x0660,0x0660,0x0660,BLUE},//口
{0x4460,0x02E0,0x0622,0x0740,CYAN},//L蓝绿色
{0x2260,0x0E20,0x0644,0x0470,GREEN},//反L
{0x0C60,0x2640,0x0C60,0x2640,BROWN},//Z
{0x0360,0x4620,0x0360,0x4620,YELLOW},//反Z
{0x4E00,0x4C40,0x0E40,0x4640,MAGENTA}};//T品红
2.4、方块变形
方块要实现变形,其实就是通过EasyX画出不同图形来实现,固然乱画是不行,而为了控制其变形状况,必要设定相应图形描述,本程序使用是不同图形不同ID码表达办法来实在方块描述。
能过键盘接受变形指令(即向上键),将所得信号传递给信号接受函数,再通过信号解决函数变化当前方块ID值,最后依照新ID值画出新图形,此时即实在了方块变形。
2.5、定期解决机制
为了提高游戏易控性和自动性,定期机制是很有必要。
通过定期器设立后,这里通过运用控制程序跳到定期器时间解决函数去实现,当固定期间片间隔到达后,先检测当前下坠物与否已经到达了底部,不是则进行下坠物向下移动一种单位操作,是则究竟后产生一种新“下一种下坠物”,并代替旧,将原先旧“下一种下坠物”用作当前激活状态下正在使用下坠物,并对使用后某些状态进行检测:
与否立即到达底部,使则进行销行操作;与否在到达底部同步到达游戏区域顶部,从而鉴定游戏与否因违规而结束,弹出相应对话框供顾客选取与否继续重新开始。
图3.2.2装载方块
视图类通过不同十六进制ID来记录下坠物类型,共有七种形状,并从7种方块中随机抽取图形。
而ID除了记录下坠物类型外,还需记录其当前变形状态。
在产生新下一种下坠物前,需要先将当前状态物记录和旧下一种下坠物保存下来,然后用随机函数Random()产生一种最大值不不不大于指定值随机正整数,将这个新生成正整数用作新“下一种下坠物”形状值。
三、核心代码描述。
#include
#include
#include
/////////////////////////////////////////////
//定义常量、枚举量、构造体、全局变量
/////////////////////////////////////////////
#defineWIDTH10//游戏区宽度
#defineHEIGHT22//游戏区高度
#defineUNIT20//每个游戏区单位实际像素
//定义操作类型
enumCMD
{
CMD_ROTATE,//方块旋转
CMD_LEFT,CMD_RIGHT,CMD_DOWN,//方块左、右、下移动
CMD_SINK,//方块沉底
CMD_QUIT//退出游戏
};
//定义绘制方块办法
enumDRAW
{
SHOW,//显示方块
CLEAR,//擦除方块
FIX//固定方块
};
//定义七种俄罗斯方块
structBLOCK
{
WORDdir[4];//方块四个旋转状态
COLORREFcolor;//方块颜色
}g_Blocks[7]={{0x0F00,0x4444,0x0F00,0x4444,RED},//I
{0x0660,0x0660,0x0660,0x0660,BLUE},//口
{0x4460,0x02E0,0x0622,0x0740,CYAN},//L蓝绿色
{0x2260,0x0E20,0x0644,0x0470,GREEN},//反L
{0x0C60,0x2640,0x0C60,0x2640,BROWN},//Z
{0x0360,0x4620,0x0360,0x4620,YELLOW},//反Z
{0x4E00,0x4C40,0x0E40,0x4640,MAGENTA}};//T品红
//定义当前方块、下一种方块信息
structBLOCKINFO
{
byteid;//方块ID
charx,y;//方块在游戏区中坐标
bytedir:
2;//方向
}g_CurBlock,g_NextBlock;
//定义游戏区
BYTEg_World[WIDTH][HEIGHT]={0};
/////////////////////////////////////////////
//函数声明
/////////////////////////////////////////////
voidInit();//初始化游戏
voidQuit();//退出游戏
voidNewGame();//开始新游戏
voidGameOver();//结束游戏
CMDGetCmd();//获取控制命令
voidDispatchCmd(CMD_cmd);//分发控制命令
voidNewBlock();//生成新方块
boolCheckBlock(BLOCKINFO_block);//检测指定方块与否可以放下
voidDrawUnit(intx,inty,COLORREFc,DRAW_draw);//画单元方块
voidDrawBlock(BLOCKINFO_block,DRAW_draw=SHOW);//画方块
voidOnRotate();//旋转方块
voidOnLeft();//左移方块
voidOnRight();//右移方块
voidOnDown();//下移方块
voidOnSink();//沉底方块
staticintscore=0;
/////////////////////////////////////////////
//函数定义
/////////////////////////////////////////////
//主函数
voidmain()
{
Init();
CMDc;
while(true)
{
c=GetCmd();
DispatchCmd(c);
//按退出时,显示对话框征询顾客与否退出
if(c==CMD_QUIT)
{
HWNDwnd=GetHWnd();
if(MessageBox(wnd,_T("您要退出游戏吗?
"),_T("提示"),MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
Quit();
}
}
}
//初始化游戏
voidInit()
{
initgraph(640,480);
srand((unsigned)time(NULL));
setbkmode(TRANSPARENT);//设立图案填充背景色为透明
//显示操作阐明
settextstyle(14,0,_T("宋体"));
outtextxy(20,330,_T("操作阐明:
"));
outtextxy(20,350,_T("上:
旋转"));
outtextxy(20,370,_T("下:
下移"));
outtextxy(20,390,_T("左:
左移"));
outtextxy(20,410,_T("右:
右移"));
outtextxy(20,430,_T("空格:
沉底"));
outtextxy(20,450,_T("ESC:
退出"));
outtextxy(40,150,_T(score));
//设立坐标原点
setorigin(220,20);
//绘制游戏区边界
rectangle(-1,-1,WIDTH*UNIT,HEIGHT*UNIT);
rectangle((WIDTH+1)*UNIT-1,-1,(WIDTH+5)*UNIT,4*UNIT);
//开始新游戏
NewGame();
}
//退出游戏
voidQuit()
{
closegraph();
exit(0);
}
//开始新游戏
voidNewGame()
{
//清空游戏区
setfillcolor(BLACK);
solidrectangle(0,0,WIDTH*UNIT-1,HEIGHT*UNIT-1);
ZeroMemory(g_World,WIDTH*HEIGHT);
//生成下一种方块
g_NextBlock.id=rand()%7;
g_NextBlock.dir=rand()%4;
g_NextBlock.x=WIDTH+1;
g_NextBlock.y=HEIGHT-1;
//获取新方块
NewBlock();
}
//结束游戏
voidGameOver()
{
HWNDwnd=GetHWnd();
if(MessageBox(wnd,_T("游戏结束。
\n想重新来一局吗?
"),_T("游戏结束"),MB_YESNO|MB_ICONQUESTION)==IDYES)
NewGame();
else
Quit();
}
//获取控制命令
DWORDm_oldtime;
CMDGetCmd()
{
//获取控制值
while(true)
{
//如果超时,自动下落一格
DWORDnewtime=GetTickCount();
if(newtime-m_oldtime>=500)
{
m_oldtime=newtime;
returnCMD_DOWN;
}
//如果有按键,返回按键相应功能
if(kbhit())
{
switch(getch())
{
case'w':
case'W':
returnCMD_ROTATE;
case'a':
case'A':
returnCMD_LEFT;
case'd':
case'D':
returnCMD_RIGHT;
case's':
case'S':
returnCMD_DOWN;
case27:
returnCMD_QUIT;
case'':
returnCMD_SINK;
case0:
case0xE0:
switch(getch())
{
case72:
returnCMD_ROTATE;
case75:
returnCMD_LEFT;
case77:
returnCMD_RIGHT;
case80:
returnCMD_DOWN;
}
}
}
//延时(减少CPU占用率)
Sleep(20);
}
}
//分发控制命令
voidDispatchCmd(CMD_cmd)
{
switch(_cmd)
{
caseCMD_ROTATE:
OnRotate();break;
caseCMD_LEFT:
OnLeft();break;
caseCMD_RIGHT:
OnRight();break;
caseCMD_DOWN:
OnDown();break;
caseCMD_SINK:
OnSink();break;
caseCMD_QUIT:
break;
}
}
//生成新方块
voidNewBlock()
{
g_CurBlock.id=g_NextBlock.id,g_NextBlock.id=rand()%7;
g_CurBlock.dir=g_NextBlock.dir,g_NextBlock.dir=rand()%4;
g_CurBlock.x=(WIDTH-4)/2;
g_CurBlock.y=HEIGHT+2;
//下移新方块直到有局部显示
WORDc=g_Blocks[g_CurBlock.id].dir[g_CurBlock.dir];
while((c&0xF)==0)
{
g_CurBlock.y--;
c>>=4;
}
//绘制新方块
DrawBlock(g_CurBlock);
//绘制下一种方块
setfillcolor(BLACK);
solidrectangle((WIDTH+1)*UNIT,0,(WIDTH+5)*UNIT-1,4*UNIT-1);
DrawBlock(g_NextBlock);
//设立计时器,用于判断自动下落
m_oldtime=GetTickCount();
}
//画单元方块
voidDrawUnit(intx,inty,COLORREFc,DRAW_draw)
{
//计算单元方块相应屏幕坐标
intleft=x*UNIT;
inttop=(HEIGHT-y-1)*UNIT;
intright=(x+1)*UNIT-1;
intbottom=(HEIGHT-y)*UNIT-1;
//画单元方块
switch(_draw)
{
caseSHOW:
//画普通方块
setlinecolor(0x006060);
roundrect(left+1,top+1,right-1,bottom-1,5,5);
setlinecolor(0x003030);
roundrect(left,top,right,bottom,8,8);
setfillcolor(c);
setlinecolor(LIGHTGRAY);
fillrectangle(left+2,top+2,right-2,bottom-2);
break;
caseFIX:
//画固定方块
setfillcolor(RGB(GetRValue(c)*2/3,GetGValue(c)*2/3,GetBValue(c)*2/3));
setlinecolor(DARKGRAY);
fillrectangle(left+1,top+1,right-1,bottom-1);
break;
caseCLEAR:
//擦除方块
setfillcolor(BLACK);
solidrectangle(x*UNIT,(HEIGHT-y-1)*UNIT,(x+1)*UNIT-1,(HEIGHT-y)*UNIT-1);
break;
}
}
//画方块
voidDrawBlock(BLOCKINFO_block,DRAW_draw)
{
WORDb=g_Blocks[_block.id].dir[_block.dir];
intx,y;
for(inti=0;i<16;i++,b<<=1)
if(b&0x8000)
{
x=_block.x+i%4;
y=_block.y-i/4;
if(y DrawUnit(x,y,g_Blocks[_block.id].color,_draw); } } //检测指定方块与否可以放下 boolCheckBlock(BLOCKINFO_block) { WORDb=g_Blocks[_block.id].dir[_block.dir]; intx,y; for(inti=0;i<16;i++,b<<=1) if(b&0x8000) { x=_block.x+i%4; y=_block.y-i/4; if((x<0)||(x>=WIDTH)||(y<0)) returnfalse; if((y returnfalse; } returntrue; } //旋转方块 voidOnRotate() { //获取可以旋转x偏移量 intdx; BLOCKINFOtmp=g_CurBlock; tmp.dir++;if(CheckBlock(tmp)){dx=0;gotorotate;} tmp.x=g_CurBlock.x-1;if(CheckBlock(tmp)){dx=-1;gotorotate;} tmp.x=g_CurBlock.x+1;if(CheckBlock(tmp)){dx=1;gotorotate;}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 C+ 课程设计 报告 样本