有闲情雅致的的帮我看一下我的贪吃蛇,出了一点错误,导致我无法理解了
程序代码:
# include <iostream>
# include <cstdlib>
# include <windows.h>
# include <time.h>
# include <conio.h>
# include <stdio.h>
using namespace std;
const int height=20;
const int wide=20;
enum state{area,apple,barrier,self,selft}; //申明枚举类型来表示地图每个元素的状态(state)
state pada; //用于switch中的分支语句
//函数声明区
void color(int b); //颜色函数
void HideCursor(); //隐藏光标函数
void gotoxy(int x,int y); //输出位置函数
int rungo(int n); //运行函数
bool enddd(); //结束判断函数
int drawApple(); //随机画苹果函数
state pandan(int nx,int ny);
void draw(void);
int begin();
int sna[height*wide][2]; //蛇身数组,储存蛇身位置
int snkl=0; //蛇身数组,以及蛇身最长度snkl 或者蛇头位置
int ax,ay; //苹果位置又时间函数加键入值随机
int nx,ny; //根据蛇头的位置,计算按键所指向的位置
int eatapple=0; //用来给吃掉的苹果计数
int noeat=0; //走过的空地的数量
char c; //定义用户输入的字符储存单位
int main()
{ int n; //用来传递游戏难度的值
bool endD;
do
{
n=begin();
rungo(n);
endD=enddd();
}while(endD);
cin.get();
return 0;
}
//无参数,输出询问语句,并将难度返回给主函数
int begin() //开始界面函数
{int i;
color(13);gotoxy(2*wide+8,11);HideCursor();
cout<<"贪吃蛇大作战";
gotoxy(2*wide+8,12);
cout<<"请选择难度";
gotoxy(2*wide+8,13);
cout<<"输入数字1-n,即可改变难度";
cin >>i;
return i;
}
//接收难度,接收键入值,调用:随机值函数,画图函数,延时函数,判断函数
int rungo(int n) //运行函数
{
sna[0][0]=(height-(height%2))/2;
sna[0][1]=(wide-(wide%2))/2; //初始化蛇身位置为地图中心
snkl=0; //在DO循环之前初始化蛇身长度
draw(); //画图
drawApple(); //画苹果
gotoxy(2*sna[0][1]+2,sna[0][0]+1);cout << "■"; //画蛇
while(1) //无限循环等待用户输入一个方向键
{if(kbhit())
{
c=getch();
if(c=='H'||c=='K'||c=='P'||c=='M')break;
}
}
do
{
if (kbhit()) //判断有没有按键
c=getch();
switch(c) //根据键入值判断用户所指向的下一个单位的位置
{
case 'H':nx=sna[snkl][0];ny=sna[snkl][1]-1; //向上H
break;
case 'K':nx=sna[snkl][0]+1;ny=sna[snkl][1]; //向右K
break;
case 'P':nx=sna[snkl][0];ny=sna[snkl][1]+1; //向下P
break;
case 'M':nx=sna[snkl][0]-1;ny=sna[snkl][1]; //向左M
}
pada=pandan(nx,ny); //执行判断下一个单元的函数,将下一个单元的内容告诉pada
switch(pada) //判断pada是什么,对每种情况进行相应的操作
{
case area: //等于空地时,蛇身运算
noeat++;
gotoxy(2*wide+8,4);cout <<"走过的空格"<< noeat ;
gotoxy(2*sna[0][0]+2,sna[0][1]+1);cout <<"□";
for(int i=0;i<snkl;i++)
{
sna[i][0]=sna[i+1][0];sna[snkl][0]=nx;
sna[i][1]=sna[i+1][1];sna[snkl][1]=ny;
}
gotoxy(2*sna[snkl][0]+2,sna[snkl][1]+1);cout << "■";
break;
case apple: //等于苹果时的运算
eatapple++;
gotoxy(2*wide+8,5);cout <<"吃的苹果"<< eatapple ;
sna[snkl+1][0]=ax;
sna[snkl+1][1]=ay;
gotoxy(ax,ay);cout <<"■";
drawApple(); //设置苹果的位置
snkl=snkl+1;
break;
case self: //等于自己的运算
return 0;
case selft: //原路返回的不执行,按原来的方向走
gotoxy(2*sna[0][0]+2,sna[0][1]+1);cout <<"□";
for(int i=0;i<snkl;i++)
{
sna[i][0]=sna[i+1][0];sna[snkl][0]=sna[snkl][0]-(nx-sna[snkl][0]);
sna[i][1]=sna[i+1][1];sna[snkl][1]=sna[snkl][1]-(ny-sna[snkl][1]);
}
gotoxy(2*sna[snkl][0]+2,sna[snkl][1]+1);cout << "■";
break;
case barrier: //撞墙不运算,结束本函数
return 0;
Sleep(n*300); //休眠0.3*n秒
}
}while (1);
return 0;
}
//接收下一个位置的坐标,并在蛇身位置数组中查找,根据不同的情况返回一个,枚举类型
state pandan(int nx,int ny)
{int i; //局部变量i;
if (nx==ax||ny==ay) //首先判断是否吃苹果,如果是的话,相比放在后面在比较运算量要少的多
return(apple);
if(snkl>1)
{
for(i=0;i<snkl-2;i++) //判断是否撞到自己,除去蛇头位置(蛇头不会装蛇头),除去蛇身第二节位置,方向按反不会死
{ //第三节也是不会撞到的,所以减少程序运算量
if (sna[i][0]==nx||sna[i][1]==ny) //同时等于说明撞自己了
return(self);
}
}
if(snkl>0)
{
if(sna[snkl-1][0]==nx||sna[snkl-1][1]==ny) //判断是否撞到第二节
return(selft);
}
if(nx<0||nx>wide||ny<0||ny>height) //判断时候撞墙,此处越界就是撞墙
return(barrier);
return(area); //如果不撞墙,不吃苹果,不吃自己第三节以后,不原路返回,就是空地了
}
//随机函数,无参数,返回一个随机坐标,赋给苹果的位置,并在地图上生成一个新苹果
int drawApple()
{ int i,j,k;
srand((unsigned)time(NULL));
i=rand();
k=height*wide-snkl+1; //k是除去蛇身后地图上还剩下的单位的数量
j=i%k; //j<剩余单元数
int n=0;
for (int a=0;a<wide;a++)
{
for (int b=0;b<height;b++)
{
if( ((j-j%wide)/wide+a)!= sna[n++][1]&& (j%wide+b)!=sna[n++][2] ) //如果随机产生的值不等于蛇身
{
ax=(j-j%wide)/wide+a;
ay=j%wide+b;
gotoxy(2*ay+2,ax+1);cout << "●";
return 0;
} //则赋给苹果,负责位置往前移动N位
}
}
}
//使用全局变量数组smap,sna画出地图,无参数无返回值
void draw(void) //画图函数
{ int i,j,k;
system("mode con cols=80 lines=25");
system("CLS"); //清屏函数
for(k=0;k<wide+2;k++) //第一行输出wide个■
{
HideCursor();
cout <<"■";
}
for (i=0;i<height+1;i++) //循环输出地图
{
gotoxy(0,i+1); //每行开头输出一个方块作为边界
cout<<"■";
for (j=0;j<wide;j++) //所有位置输出空方格
cout<<"□";
cout << "■"<<endl; //每次到结尾换行一下
}
for (k=0;k<wide+2;k++)
cout <<"■";
}
//结束询问函数,无参数,返回一个bool型数据,告诉主函数还要不要继续
bool enddd()
{
char ge;
gotoxy(2*wide+8,8);
cout <<"您一共走了"<<noeat<<"个格子";
gotoxy(2*wide+8,9);
cout <<"你一共吃了"<<eatapple<<"个苹果";
gotoxy(2*wide+8,10);
/* cout <<"请问你还要继续吗";
gotoxy(2*wide+8,11);
cout <<"↑、继续!!";
gotoxy(2*wide+8,12);
cout <<"↓、结束!!";
if (kbhit())
{
ge=getch();
if(ge=='H')
return true;
if(ge=='P')
return false;
}*/
return true;
}
void color(int b) //颜色函数
{
HANDLE hConsole = GetStdHandle((STD_OUTPUT_HANDLE)) ;
SetConsoleTextAttribute(hConsole,b) ;
}
void HideCursor() //隐藏光标
{
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursor_info={1,0};
SetConsoleCursorInfo(hOut,&cursor_info);
}
void gotoxy(int x,int y)//设置字符显示位置
{
HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE);
COORD loc={x,y};
SetConsoleCursorPosition(hOut,loc);
}





