有闲情雅致的的帮我看一下我的贪吃蛇,出了一点错误,导致我无法理解了
程序代码:
# 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); }