俄罗斯方块程序设计基础课程设计大学论文.docx
《俄罗斯方块程序设计基础课程设计大学论文.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块程序设计基础课程设计大学论文.docx(24页珍藏版)》请在冰豆网上搜索。
俄罗斯方块程序设计基础课程设计大学论文
工业学院
课程设计报告
课程名称
程序设计基础课程设计
项目名称
俄罗斯课程设计
姓名
班级
学号
指导教师
设计时间
年月日至年月日
工业学院·计算机工程学院
目录
目录i
摘要I
序言II
人员分工安排III
1、需求分析1
1.1游戏方块需求1
1.2游戏控制的需求1
2、设计思路2
2.1方块:
2
2.2主要操作:
2
3、详细设计4
3.1设计流程图4
3.2函数功能图5
4、运行调试与分析讨论6
4.1游戏界面6
5、设计体会与小结8
摘要
近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序采用全世界最金典的游戏—俄罗斯方块作为背景,程序设置了键盘选择方式,游戏运行时随着等级的提高而速度加快,这需要玩家快速操作。
因此,本程序主要意义是为高手玩家提供训练平台。
其次也可为刚踏入游戏领域的新手们,提供一个很好的锻炼机会。
本次课程设计主要解决利用C语言设计实现俄罗斯方块游戏的算法、游戏内部功能、游戏区域的绘图的程序设计。
对于每个俄罗斯方块各自的形态变化改变到下一个形态利用数组来实现,在程序设计中,直接从架构的其中一个类对象中继承下来,将它完善而变成有某功能特性的物件对象。
关键词:
俄罗斯方块数组数据结构算法
序言
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它曾造成的轰动与造成的经济价值可言说是游戏史上的一件大事。
这款游戏最初是由苏联的游戏制作人AlexPajitnov制作的,它看似简单但却变化无穷,令人上瘾。
相信大多数用户都还记得为它痴迷得茶饭不思不想的那个俄罗斯方块时代。
俄罗斯方块最早还是出现在PC机上,而我国的用户都是通过红白机了解、喜欢上它的。
现在联众又将重新掀起这股让人沉迷的俄罗斯方块风潮。
对于一般用户来说,它的规则简单,容易上手,且游戏过程变化无穷,俄罗斯方块游戏现在基本上是每个手机必备的游戏,种类千变万化,多种多样俄罗斯方块是个老幼皆宜的小游戏,是经久不衰的一款游戏,自从它诞生那天起就一直深受人们的喜爱。
几乎每个人都玩过这个游戏,也是人们接触最多的一款游戏,它实现由四块正方形的色块组成,然后存储在一个数组的四个元素中,计算机随机产生不同七种类型的方块,根据计算机时钟控制它在一定的时间不停得产生,用户根据键盘的四个方向翻转、向左、向右和向下操作,(控制键的实现是由键盘的方向键实现)。
然后程序根据这七种方块堆叠成各种不停得模型,可以吸引更多的小玩家,让人觉得更加的有趣,使人的视觉得到冲击,更加的轻松.
人员分工安排
(1)小组负责人:
分工:
调试与检查
(2)小组成员1:
分工:
界面设计
(3)小组成员2:
分工:
方块的设计与变形
1、需求分析
1.1游戏方块需求
随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关.
1.2游戏控制的需求
游戏控制分为多个方面,包括画面绘制,控制命令的获取,控制命令的分配、控制命令的处理,方块的绘制,方块的移动,方块的旋转,方块下落和消层以及计分等。
2、设计思路
方块要实现变形,要能通过键盘接收变形指令(即上键),将所得信号传递给信号接收函数,再通过信号处理函数改变当前方块的ID值,最后根据新的ID值画出新的图形,此时即实在了方块的变形。
2.1方块:
每个方块都要记录自己的ID、形状。
形状采用4对整数坐标来表示,分别记录其4个小方块的相对位置(以方块内或旁边任一点为中心,称为参考点)。
建议可以在方块类中定义一个或多个数组,将每种ID的方块的形状数据存储好(都是一些固定的数据),这样产生一个方块时只需要提供其ID即可。
为了处理方块的旋转,我们不能只记录上述。
7种方块,而应该把它们旋转后产生的每种形状都认为是一种不同的方块(因为它们的4对坐标都不同),然后在方块ID之间建立映射关系,即哪种ID的方块旋转后变成哪种ID的方块,只要求处理一个方向的旋转。
这个映射关系也可以用c数组来实现。
此外,方块还要记录自己的参考点在指定的游戏区域中的位置。
2.2主要操作:
填充:
把自己填充到指定的游戏区域中。
返回填充成功或失败的信息。
清除:
把自己从指定的游戏区域中清除。
移动:
在指定的游戏区域中移动,包括向左、右、下移动,以1个单元格为单位。
如果可以移动,则修改参考点的位置,并在指定的游戏区域中重新填充自己(先清除、然后修改参考点位置,再填充)。
返回是否移动成功的信息。
旋转:
在指定的游戏区域中旋转一次,此时参考点位置不变,但要改变自己的ID,然后在指定的游戏区域中重新填充自己(先清除、然后修改参考点位置,再填充)。
资数
源据
消息控制信息
显数
示据
3-1设计思路图
3、详细设计
3.1设计流程图
否
否
是
3-1设计流程图
3.2函数功能图
3-2函数功能图
4、运行调试与分析讨论
4.1游戏界面
图4-1游戏开始界面
图4-2游戏运行界面
图4-3游戏结束界面
5、设计体会与小结
本次课程设计,用c语言实现了一个简易的俄罗斯方块游戏。
了解了c语言的强大特性,游戏是在速度上的高效性,是其他编程语言无法企及的。
需求分析,概要设计,详细设计在编程中的重要性是不言而喻的。
正确、高效的分析、设计为后面的编程打下了坚实的基础,后面的工作就顺利成章了。
当然,在需求分析、概要设计、详细设计阶段是需要通过不断的讨论、论证来对项目进行更改的代码实现阶段就是软件的具体实现,通过编码来实现需求中的功能。
在代码实现阶段可能会遇到各种问题,此时有可能就要对需求设计乃至需求分析进行更改。
测试阶段同样重要。
在本次软件设计中,在测试阶段就发现了游戏测试错误问题。
后来想到了通过修改程序
for(j=0;j<3;j++)
{
if(l[i][j]==1)
{
gotoxy(x+j,y+i);
printf("%c",TUAN);
}
else
continue;
}
}
}
void_L(intx,inty)//摸去该方块
{
inti,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(l[i][j]==1)
{
gotoxy(x+j,y+i);
printf("");
}
{
if(l[i][j]==1)
{
if(biaoji[y+i+1][x+j]==1)
d=1;
}
}
}
if(y+c+1==Ymap||d==1)
{
L(x,y);
break;
}
y++;
L(x,y);
break;
}
Sleep(25);
_L(x,y);
if(y+c+1==Ymap||d==1)
{
y--;
break;
}
}
}
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(l[i][j]==1)
{
biaoji[y+i][x+j]=1;
}
}
}
}
voidI_move()//同L_move
{
intx=Xmap/2-1;
inty=0;
inta,b;
intc,d,e,f;
c=0;
d=0;
e=0;
y++;
O(x,y);
Sleep(times);
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(o[i][j]==1)
{
c=i;
if(j>=e)
e=j;
if(biaoji[y+i+1][x+j]==1)
d=1;
}
}
}
if(y+c+1==Ymap||d==1)
break;
_O(x,y);
while(_kbhit()==1)
{
f=0;
key=keydown();
switch(key)
{
caseLEFT:
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(o[i][j]==1)
{
if(biaoji[y+i][x+j-1]==1)
f=1;
}
}
}
if(x-1==0||f==1)
{
O(x,y);
break;
}
x--;
O(x,y);
break;
caseRIGHT:
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(o[i][j]==1)
{
if(biaoji[y+i][x+j+1]==1)
f=1;
}
}
}
if(x+e+1==Xmap||f==1)
{
O(x,y);
break;
}
x++;
O(x,y);
break;
caseDOWN:
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(o[i][j]==1)
{
if(biaoji[y+i+1][x+j]==1)
d=1;
}
}
}
if(y+c+1==Ymap||d==1)
{
O(x,y);
break;
}
y++;
O(x,y);
break;
}
Sleep(25);
_O(x,y);
if(y+c+1==Ymap||d==1)
{
y--;
break;
}
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(o[i][j]==1)
{
biaoji[y+i][x+j]=1;
}
}
}
}
voidZ_move()//同L_move
{
intx=Xmap/2-1;
inty=0;
inti,j;
intc,d,e,f;
Z(x,y);
Sleep(500);
_Z(x,y);
while
(1)
{
c=0;
d=0;
e=0;
y++;
Z(x,y);
Sleep(times);
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(z[i][j]==1)
{
c=i;
if(j>=e)
e=j;
if(biaoji[y+i+1][x+j]==1)
d=1;
}
}
}
if(y+c+1==Ymap||d==1)
break;
_Z(x,y);
while(_kbhit()==1)
{
f=0;
key=keydown();
switch(key)
{
caseLEFT:
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
if(z[i][j]==1)
{
if(biaoji[y+i][x+j-1]==1)
f=1;
}
}
}
if(x-1==0||f==1)
{
Z(x,y);
}
}
//此函数操作游戏进程。
voidyouxiguocheng()
{
intj;
intqueue[2]={0,0};
Wall();
queue[0]=rand()%5+1;
while
(1)
{
for(j=0;j<=Xmap;j++)
{
if(biaoji[1][j]==1)
break;
}
if(biaoji[1][j]==1)
break;
queue[1]=rand()%5+1;
switch(queue[1])
{
case1:
L(Xmap+4,Ymap/4+5);
break;
case2:
I(Xmap+4,Ymap/4+5);
break;
case3:
O(Xmap+4,Ymap/4+5);
break;
case4:
Z(Xmap+4,Ymap/4+5);
break;
case5:
T(Xmap+4,Ymap/4+5);
break;
}
switch(queue[0])
{
case1:
L_move();
xiaochu();
break;
case2:
I_move();
xiaochu();
break;
case3:
O_move();
xiaochu();
break;
case4:
Z_move();
xiaochu();
break;
case5:
T_move();
xiaochu();
break;
}
queue[0]=queue[1];
switch(queue[1])
{
case1:
_L(Xmap+4,Ymap/4+5);
break;
case2:
_I(Xmap+4,Ymap/4+5);
break;
case3:
_O(Xmap+4,Ymap/4+5);
break;
case4:
_Z(Xmap+4,Ymap/4+5);
break;
case5:
_T(Xmap+4,Ymap/4+5);
break;
}
}
}
//此函数用于操作初始化界面。
voidchushihua()
{
inti;
gotoxy(5,1);
for(i=0;i<70;i++)
{
printf("=");
}
gotoxy(5,2);
for(i=0;i<70;i++)
{
printf("*");
}
gotoxy(31,4);
printf("欢~迎~来~到~");
gotoxy(30,5);
printf("《俄罗斯方块》");
gotoxy(5,7);
for(i=0;i<70;i++)
{
printf("*");
}
gotoxy(5,8);
for(i=0;i<70;i++)
{
printf("=");
}
gotoxy(4,10);
printf("按任Enter键开始游戏。
\n\n↑变换,↓加速下移,←左移,→右移。
");
gotoxy(45,23);
printf("----七组:
姜志康、王世超、李向伟");
getchar();
system("CLS");
}
//此函数用于操作结束界面。
voidgameover()
{
system("CLS");
gotoxy(30,5);
printf("#################");
gotoxy(30,6);
printf("####");
gotoxy(30,7);
printf("##GAMEOVER##");
gotoxy(30,8);
printf("####");
gotoxy(30,9);
printf("#################");
gotoxy(30,11);
printf("您的得分为:
%d",chenji);
gotoxy(30,13);
printf("欢迎下次再来~~~");
gotoxy(30,15);
printf("请按Enter键退出!
");
getchar();
}
intmain()
{
HideCursor();
srand((int)time(NULL));
chushihua();
youxiguocheng();
gameover();
}