课程设计报告
题目:基于C++俄罗斯方块?
学院:
专业:
学号:
姓名:
》
二○一三年十二月
经典小游戏设计-俄罗斯方块
】
一、需求分析。
、游戏需求
随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T 字型)下落填充给定的区域,若填满一条便消掉,若在游戏中各形状填满了给定区域,为输者,弹出相应提示。
、游戏界面需求
良好的用户界面,有关信息显示(如操作方法、等级等)。
让方块在一定的区域内运动和变形,该区域用一种颜色表明,即用一种颜色作为背景,本游戏的背景设为黑色。
还需用另一种颜色把黑色围起来,宽度适中,要实现美感。
而不同的方块用不同的着色表示,使游戏界面更加清晰、有条理。
消层时采用一定的时间延迟,增加视觉消行的感官效果。
、游戏方块需求
良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、L字形、反L形、T字型)以及另外本程序另外加入的点形方块,各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。
为体现游戏的趣味性和扩展性,本游戏象征性的增加了点形方块,其他更多形状的方块可用类似方法增加。
@
、游戏控制的需求
游戏控分为多个方面,包括画面绘制,控制命令的获取,控制命令的分配、控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和消层以及计分等。
对各个命令的合理处理和综合控制十分重要,一旦出错可能导致整个程序的崩溃,因此需要小心设计。
二、系统设计。
、程序流程图:
、游戏设计概述
从整体上而言,在该游戏可设计一个方块类,其中包括对方块的信息描述(如:ID)、方块的操作(如:旋转、下沉)。
再设计一个控制类,实现各种控制(如:获取
控制信号,分发控制信号)。
另定义一个游戏区类,用以处理游戏区绘制等内容。
框
ir[];
while((c & 0xF) == 0)
{
;
c >>= 4;
}
·
ir[];
int x, y;
for(int i = 0; i < 16; i++, b <<= 1)
if (b & 0x8000)
{
x = + i % 4;
y = - i / 4;
if (y < HEIGHT)
;
DrawUnit(x, y, g_Blocks[].color, _draw);
}
}
ir[];
int x, y;
for(int i = 0; i < 16; i++, b <<= 1)
if (b & 0x8000)
{
、
x = + i % 4;
y = - i / 4;
if ((x < 0) || (x >= WIDTH) || (y < 0))
return false;
if ((y < HEIGHT) && (g_World[x][y]))
return false;
}
return true;
>
}
ir[];
for(i = 0; i < 16; i++, b <<= 1)
if (b & 0x8000)
{
if - i / 4 >= HEIGHT)
{ // 如果方块的固定位置超出高度,结束游戏
GameOver();
`
return;
}
else
g_World[ + i % 4][ - i / 4] = 1;
}
// 检查是否需要消掉行,并标记
BYTE remove = 0; // 低 4 位用来标记方块涉及的 4 行是否有消除行为for(y = ; y >= max - 3, 0); y--)
)
{
i = 0;
for(x = 0; x < WIDTH; x++)
if (g_World[x][y] == 1)
i++;
if (i == WIDTH)
{
remove |= (1 << - y));
—
setfillcolor(LIGHTGREEN);
setlinecolor(LIGHTGREEN);
setfillstyle(BS_HATCHED, HS_DIAGCROSS);
fillrectangle(0, (HEIGHT - y - 1) * UNIT + UNIT / 2 - 5, WIDTH * UNIT - 1, (HEIGHT - y - 1) * UNIT + UNIT / 2 + 5);
setfillstyle(BS_SOLID);
}
}
if (remove) // 如果产生整行消除
—
{
// 延时 300 毫秒
Sleep(300);
// 擦掉刚才标记的行
IMAGE img;
for(i = 0; i < 4; i++, remove >>= 1)
{
|
if (remove & 1)
{
for(y = - i + 1; y < HEIGHT; y++)
for(x = 0; x < WIDTH; x++)
{
g_World[x][y - 1] = g_World[x][y];
g_World[x][y] = 0;
}
getimage(&img, 0, 0, WIDTH * UNIT, (HEIGHT - - i + 1)) * UNIT);
putimage(0, UNIT, &img);
score++;
outtextxy(50, 150,_T(score));
}
}
}
// 产生新方块
NewBlock();
}
四、测试结果。
程序完成后运行如下,达到预期结果,运行效果良好。
成功地完成了方块的显示、旋转、消行功能,游戏可玩性强,且具有封装性、通用性、容错性。
五、实验总结。
本次C++课程设计前期准备阶段,设想一些构想和主要任务;后期则是具体功能
的实现。
这次设计中我遇到了不少困难,本来设想实现双人版对战,美化界面和增加背景音乐等功能,可是由于时间的短促,最终没能实现,心里不免有些遗憾,在实现类的封装和类的继承和多态性时,也遇到了不少问题,通过大家的一起探讨和分析,问题最终一个个迎刃而解,系统开发基本完毕。
通过这次课程设计,使我懂得了不少东西。
我们在日常的学习中应该注意对所学知识的实践运用,在学习时,应该深入的了解,体会知识,这对我们今后的学习和工作会有很大的帮助。
通过此次的实践,我体会到学以致用的乐趣,收获了很多。