资源描述
计算机实习汇报
题目:贪吃蛇试验汇报
邮箱:
贪吃蛇试验汇报
一.功能阐明
1.1总体功能阐明
游戏分单人和双人两种。单人游戏中有一条小蛇,不停地在屏幕上游走,“吃”掉界面上随即出现的果子,每吃一种果子,蛇的身体长度就增长一种单位。当吃下的果子积累到一定程度时,蛇的运动速度会对应地增长,等级也提高了。伴随蛇的长度的增长,游戏界面会出现随机产生的毒刺“★”,毒刺固定不动。只要蛇头碰到屏幕四面,或者碰到自己的身子,或者碰到毒刺,活着小蛇就立即毙命,游戏结束。在双人游戏中,有两条蛇头分别为红色和黄色的小蛇,争吃果子,比比谁吃的果子多。只要任意一条蛇的蛇头碰到屏幕四面,或者碰到自己的身子(碰到对方的身体没关系),或者任一条蛇碰到毒刺,游戏就会结束。
该游戏的特色是:一、添加了障碍“毒刺”,同步增长游戏等级这一项,让蛇的运动速度随分数的增长而合适增长,相比老式的贪吃蛇游戏增长了难度;二、增长双人游戏,使其具有竞赛性,让玩家在与他人竞赛中获得乐趣。三、游戏的背景画面更为细腻。
1.2顾客界面
游戏开始和退出菜单
选择单人、双人游戏的菜单
1.3使用措施
在单人游戏中,用小写的w、s、a、d四个按键分别控制蛇头上下左右四个方向的转向。双人游戏中,w、s、a、d按键控制红蛇的方向,上下左右四个方向键控制黄蛇的方向。
二.程序设计阐明
2.1 总体设计框架
[包括程序执行流程,模块划分等,需要有文字阐明和框图表达]
游戏开始
选择开始或退出游戏
退出游戏
开始游戏
开始单人游戏
开始双人游戏
开始游戏程序
播放背景音乐
游戏程序
显示游戏界面、边框、背景等
蛇的移动、增长、获取按键信息
判断与否产生毒刺
计算并显示分数和等级
判断游戏与否结束
蛇头移动
若蛇头吃下果子,则产生新的果子且增长蛇的长度。
蛇的身体跟进
若符合对应条件,在屏幕中显示毒刺
若符合条件,显示结束画面,退出游戏。
2.2 关键算法描述
算法1:[算法输入参数和输出参数,算法功能,使用什么存储构造,在主程序中起什么作用,可以使用框图或伪代码表达。
算法1:蛇身运动函数
算法1:
if(snake.direct[0]==97)
{
textout(handle,--(--snake.s_x[0]),snake.s_y[0],wColors+10,1,"◆");
Sleep(speed);
PRODUCT_FRUIT(snake.s_x,snake.s_y,&snake.length,&fruit.f_x,&fruit.f_y,wColors,handle); MOVE(snake.s_x,snake.s_y,snake.length,wColors+2,handle);
这是蛇的运动算法,以单人游戏中的向上运动为例。当蛇的构造中的方向变量为97(即“w”)时,蛇头的纵坐标增长一种单位,并延时一定期间。接着运行进行PRODUCT_FRUIT函数,该函数的作用是判断蛇头坐标与否与果子坐标重叠,若是,则生成新的果子,且蛇的长度加一。接着再运行move函数,该函数的作用为令蛇身最终一格处显示背景颜色,蛇身的其他部分随蛇头向前移动一位,整体上看就像是蛇向前移动了一格。
算法2 :void RE_POISON_FRUIT(int pfoodx[],int pfoody[],int *foodx,int *foody,int *length,int snakex[],int snakey[])
{
while(1)
{
srand((unsigned)time(NULL)*(unsigned)time(NULL));
int poison_x=2*(rand()%28+2);
int poison_y=rand()%37;
if(poison_x>=4&&poison_y>=2) {
for(q=0;q<*length;q++)
{
if((snakex[q]==poison_x)&&(snakey[q]==poison_y))
break;
}
if(q==*length)
{
for(i=0;i<100;i++)
{
if(pfoodx[i]==*foodx&&pfoody[i]==*foody)
break;
}
if(i==100)
{
pfoodx[num]=poison_x;
pfoody[num]=poison_y;
num++;
break;
}
}
}
}
}
随机产生毒果的函数。产生两个随机数,分别是毒刺的横纵坐标,若该坐标不与蛇的身体的任一节重叠,也不与目前显示的果子重叠,则该坐标符合规定。
算法3: int DEAD(int snakex[],int snakey[],int len,int pfoodx[],int pfoody[],HANDLE handle)
{
int temp;
for(int i=2;i<=len;i++)
{
if((snakex[0]<4||snakex[0]>60||snakey[0]<2||snakey[0]>40)||(snakex[0]==snakex[i]&&snakey[0]==snakey[i]))
{
temp=1;
break;
}
}
for( int b=0;b<=num;b++)
{
if((snakex[0]==pfoodx[b])&&(snakey[0]==pfoody[b]))
{
temp=1;
break;
}
}
if(temp==1)
return 1;
else
return 0;
}
判断游戏与否结束的函数,以单人游戏为例。首先用for循环判断蛇头的横纵坐标与否在规定的范围内以及蛇头与否碰到蛇身,接着再用一种for循环判断与否碰到毒刺,以上条件符合一种,该函数就返回整数1,若两者都不返回,则返回0。在主函数中,用一种if语句,用此函数返回的值作为判断条件,若值为1,则执行退出游戏,显示结束画面的语句。
算法4:int stop(char dir)
{r=!r;
s=!s;
if(!s)
{so=dir;
return 98;}
else
{ int r=int(so);
return r;}
}
暂停函数,以单人游戏为例。在主函数所在的源文献设置一种bool类型的全局变量s,初始化为真。玩家在游戏中按下回车键时,执行暂停函数,执行语句s=!s,最终函数返回一种值。将暂停函数的返回值赋值给蛇的运动方向变量,使蛇不再运动。
在双人游戏中,设置了两个暂停函数,分别控制两条蛇的停止与运动。
算法五:
DIR=_getch();
switch (DIR)
{
case 97:
if(snake.direct[0]!=100)
snake.direct[0]=97;
break;
case 100:
if(snake.direct[0]!=97)
snake.direct[0]=100;
break;
case 119:
if(snake.direct[0]!=115)
snake.direct[0]=119;
break;
case 115:
if(snake.direct[0]!=119)
snake.direct[0]=115;
break;
case 13:
snake.direct[0]=stop(snake.direct[0]);
break;
default:
break;
换取按键信息,以单人游戏为例。用swith判断语句对不一样的按键信息,另设做出上移、下移、左移、右移、暂停/开始等动作。
算法六: c=(score/10)%5; b=(score/10)/5;
if(speed!=75)
{if(c==0&&b==m+1)
{speed-=25;
level++;
m++;}
}
char bu[10];
itoa(level,bu,10);
textout(handle,72,8,wColors,1,bu);
增长蛇的移动速度及显示等级的算法,以单人游戏为例。类似毒刺产生的原理,设置两个全局变量,当这两个变量满足一定条件时,游戏等级增长一种单位,对应地蛇的速度增长。等级的最高程度为五级,防止贪吃蛇运动过快。
2.3 程序设计的难点和要点
一、在游戏运行的同步,播放背景音乐,运用到多线程的知识。
二、在双人游戏中,分别编写两条蛇的运动算法,但两条蛇需要同步获取按键信息,这样两者才能同步运动。
三、设置蛇移动的算法时,让后一种点跟随前一种点的运动轨迹,本来最终一种点的位置就显示背景颜色,使得蛇在整体上看上去一偶那个了一格。
四、蛇的得分增长一定程度
2.4 调试的措施
[过程中出现的问题和处理措施]
在编该游戏的过程中,出现了多种问题和错误,后来都一一处理了。
一、开始设置游戏等级时,当蛇满足一种升级的条件时,蛇却停止了运动,而不是像预想的那样加紧运动速度。后来发现本来是由于我用的if判断语句的判断条件出现问题,导致蛇的速度会一直减小直到零。我借鉴产生毒刺的算法,设置判断条件,使得蛇每次增长速度都都能继续稳定运行。
二、开始加入背景音乐时,贪吃蛇死亡后,不显示游戏结束的画面,而是停留在原画面中继续播放音乐。后来我设置了一种bool类型的全局变量r,把本来背景音乐函数中的无限循环的判断条件“1”换成r,当游戏结束时r变为假,使音乐不再播放。
三、刚设置双人游戏时,几乎需要把单人游戏中的每一种功能对应的函数再设置一种新的,以适应双人游戏的规定。若不仔细检查,其中微小的错误在程序编译时无法发现,但运行游戏却会出现问题。因此将单人游戏改成双人也需要极大的耐心和细致。
四、在增长毒刺和游戏等级的算法中,采用了类似的程序,都是设置两个变量,当这两个变量分别满足整除和取余的对应条件时,才执行添加毒刺或增长等级的算法。
2.5 程序性能评价
从运行效果上进行分析:
长处:添加背景颜色和背景音乐,使游戏画面更细腻绚丽。同步增长了规避毒刺、等级上升、双人游戏等功能,更具娱乐性。
局限性:背景音乐单一,双人游戏的蛇头部分闪烁不一样步。
从程序设计上进行分析:
长处:运用多种功能函数,且单人游戏与双人游戏分别对应,条例清晰。
局限性:程序的设计没有运用到类的知识。
三.心得体会
通过这次小学期的编程,使我很好地复习回忆了一遍C++的有关知识,同步对编程有了更为深刻的理解。
编译一种好的游戏,首先要考虑游戏的界面和操作与否友好以便,另一方面要尽量精简程序,增长程序的可读性,提高运算速度。好的创意和想法是十分关键的,这不是书本能交给我们的,需要我们独立思索,交流取经。
小学期的编程很好地锻炼了我的全局统筹以及逻辑思维的能力,也培养了严谨、细心、耐心、专注等优良素质。这次编写游戏的经历,使我认识了一种深刻的道理——任何事情要做好,都需要付出极大的努力。虽然是一种简朴得不想玩的小游戏,编译起来也如此费心,可以想象编写一种软件、一种操作系统需要的惊人的人力物力。
这次小学期里我的收获很大。在后来的学习中我一定要继续努力,端正态度,获得更好的成绩。
展开阅读全文