计算机实习报告
       
   
*** **
班级: 07班
学号: ********
小班序号:11
******
题目:贪吃蛇
邮箱:*****************
小游戏“贪吃蛇”实验报告
一.功能说明
1.1总体功能说明
贪吃蛇的小游戏,控制蛇来吃苹果;
随着吃掉的苹果个数的增加分数会增加,
但蛇身也会变长;
如果蛇撞到墙壁或者自己的话就会死掉结束游戏。
1.2用户界面
选择游戏等级,等级越高速度越快;
游戏界面;
死后选择是否继续游戏;
1.3使用方法
  进入先选择游戏等级,1-9个等级对应的速度依次增大并且获得的分也依次增大。
通过上下左右控制蛇的运动方向,可选择1-9共9个等级,蛇会有不同的速度和分数递加。
死亡后按Y或N来继续或结束游戏
二.程序设计说明
2.1 总体设计框架
2.2 关键算法描述
1.蛇的运动算法:
将蛇的前一节坐标赋给后一节,最后一节消去前一节。
textout(handle,x[lenth-1],y[lenth-1],wColors,1,"  ");
for(int n=lenth-1;n>0;n--)
{
x[n]=x[n-1];
y[n]=y[n-1];
}
y[0]++;
textout(handle,x[1],y[1],wColors,1,"●");
textout(handle,x[0],y[0],wColors,1,"◆");
2.蛇的死亡算法:
即蛇头不与任何一个蛇身坐标相重合
int right=0; 
for(int i=1;i<lenth;i++)                                      //判断是否死掉
right=(right||(x[i]==x[0]&&y[i]==y[0]));    //若蛇头与任意一节不重合则right值为0;
3.蛇头坐标不与边框重合即撞墙的判断。
4转弯算法:
Int ch;
ch=_getch();
switch(ch)
{
case 72:
case 80:
case 75:
case 77:
default:;
2.3 程序设计的难点和关键点
1.蛇的运动算法
2.蛇不能反向运动
3.音乐和音效的插入
2.4 调试的方法
1.采用坐标赋值运算,将前一个坐标的值赋给后一个,实现传递
textout(handle,x[lenth-1],y[lenth-1],wColors,1,"  ");
for(int n=lenth-1;n>0;n--)
{
x[n]=x[n-1];
y[n]=y[n-1];
}
y[0]++;
textout(handle,x[1],y[1],wColors,1,"●");
textout(handle,x[0],y[0],wColors,1,"◆");
2.加入俩次判断:每次用一个临时变量来记录之前的按键再用SWITCH语句来判断是否方向相反。
if(_kbhit())                //检测按键以控制蛇头
    {   
        int ch;
        ch=_getch();
        switch(tempch)                //记录上次按键并判断是否按相反方向运动
        {                                  //如果方向相反则按原方向
        case 72:
            {if(ch==80)
贪吃蛇的编程代码
                ch=72;
                break;}
        case 80:
            {if(ch==72)
                ch=80;
                break;}
        case 75:
            {if(ch==77)
                ch=75;
                break;}
        case 77:
            {if(ch==75)
                ch=77;
                break;}
        default:;
        }
       
        switch(ch)                            //控制蛇头的方向
        {
        case 72:                                      //蛇头向上
        case 80:                                      //蛇头向下运动
case 75:                                          //蛇头向左运动
case 77:                                        //蛇头向右运动
3.上网搜索相关方法,采用了多线程和PlaySound函数来播放
DWORD WINAPI Music1( LPVOID lpParam )                    //多线程控制音乐
{
PlaySound( "E:\\C++保存目录\\summer\\summer\\Debug\\WA074.wav",0,NULL);
return 0;
}
HANDLE hThread;
    hThread = CreateThread(NULL,0,Music1,NULL,0,NULL);
2.5 程序性能评价
优点:能够顺利地进行游戏,
设有最高分显示,
有背景音乐,关卡。
缺点:界面不够美观,
不能加入与鼠标有关的操作
三.心得体会
  这次暑期实习我的贪吃蛇算是比较顺利的完成了,但期间不乏一些波折。
  最开始遇到的问题便是采用一个什么模型来完成整条蛇的运动。最开始我使用类似于滚动字幕的方法先让蛇能直线运动了,但后来发现如此蛇无法转弯,于是放弃了这种模型。之后采用控制蛇头和蛇尾的左边,通过擦去蛇尾补至蛇尾来进行转弯;但是这种方法在多次转弯的时候依旧麻烦,假如说蛇身一共N节,我则需要使蛇尾的运动始终慢蛇头N步;于是我想到了将蛇头的坐标赋N次值后传递到蛇尾。后来就改进设出一跳蛇每一节的坐标,前一节的坐标赋给后一节,这与赋N次值得方法原理是相同的。如此便完成了蛇的基本运动。
  接下来是解决蛇回头的问题,这个问题本来我看起来觉得比较简单,但做起来出现了不小的问题。首先我解决这问题的方法我想到的很快:设置一个临时变量来存储上一次的运动方向,与这一次检测到的按键方向进行运算,如果俩次运动方向相反则这次按键值等于原方向。但我忽略了一个问题,上下左右键是双值按键,我采用俩次按键值相加等于152来判定运动方向相反就出现了问题,而且这个问题存在了很长时间也没到哪出了错。后来我新建了一个TEST的程序尝试测试这个方法,发现输出的值都是俩个,另一个都是224。于是我发现了问题所在。之后经过尝试我在循环之前加了一个SWITCH(TEMPCH)的判定才解决了这个蛇回头的问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。