关于贪吃蛇游戏的一些问题?

我为别人找到了这个。

# include & ltstdio.h & gt

# include & ltconio.h & gt

# include & ltwindows.h & gt

# include & lttime.h & gt

#定义食物7

#定义标题5

#定义主体6

#定义墙1

#定义道路0

#向上定义1

#向下定义2

#定义左侧3

#定义权利4

#定义宽25

#定义转换器30

#定义编号20

int map[kuan][chang],hi,bj,fi,fj,t;//全局变量映射数组头坐标、食物坐标和速度控制参数

Void gotoxy(int x,int y) //移动坐标

{

COORD coord

坐标。X = x

坐标。Y = y

SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),coord);

}

Void hidden()//隐藏光标

{

控制台_光标_信息CCI;

GetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),& ampCCI);

CCI . b visible = 0;//指定1显示,指定0隐藏。

SetConsoleCursorInfo(GetStdHandle(STD _ OUTPUT _ HANDLE),& ampCCI);

}

void paint(int xx,int yy)

{

gotoxy(2*yy,xx);

开关(映射[xx][yy])

{

案例0:printf(" ");打破;

case 1:printf("□");打破;

案例五:printf(“◎”;打破;

案例6:printf(“△”);打破;

案例7:printf("●");打破;

}

}

Void start()//初始化地图数组信息,随机黑鱼位置,第一个食物位置。

{

int i,j;

for(I = 0;我& lt= Kuan-1;i++)

{

map[I][0]= wall;

map[I][Chang-1]= wall;

}

for(j = 0;j & lt= Chang-1;j++)

{

map[0][j]= wall;

map[Kuan-1][j]= wall;

}

for(I = 0;我& lt= Kuan-1;i++)

for(j = 0;j & lt= Chang-1;j++)

油漆(I,j);

gotoxy(64,2);Printf("1.a减速//d加速");

gotoxy(64,4);Printf("2。esc暂停”);gotoxy(65,5);Printf("任意键继续");

}

Int getkey(int ddd)//根据当前方向按任意键,暂停不响应相反方向的键。

{

char c;

while(c=getch())

{

开关(c)

{

案例72://1

{

if(ddd==2)

向下返回;

其他

向上返回;

}

案例80://2

{

if(ddd==1)

向上返回;

其他

向下返回;

}

案例75://3

{

if(ddd==4)

向右返回;

其他

向左返回;

}

案例77://4

{

if(ddd==3)

向左返回;

其他

向右返回;

}

案例27:继续;//esc暂停,A减速,D加速。

案例97:{ t+= 10;返回ddd}

案例100:{ t-= 10;返回ddd}

默认值:{

返回ddd

}

}

返回0;

}

}

无效游戏()

{

int fd=0,len=1,direction=4,a[100000],b[100000],k,m,kk=0,aa=0,bb=0,I,iii = 0;

int SJ = 0;//sj用来记录存储被吃水果坐标的数组的角标。

int zz=0,mm=0,fa[数字+2],FB[数字+2];

t = 250//全局变量在这里赋值。

hi = rand()%(Kuan-7)+6;bj = rand()%(Chang-8)+5;map[hi][bj]= head;油漆(hi,bj);//在一定范围内,蛇头的初始位置是随机的,身体是左边三个方块(可以展开写入游戏)

a[3]= hi;b[3]= bj;//头位置存储在a b数组的第四项。

for(I = 0;我& lt3;i++)

{ map[hi][bj-1-I]= body;油漆(嗨,bj-I-1);a[2-I]= hi;b[2-I]=(bj-I-1);}

//身体位置从尾到颈存储在0 1 2项中。

k = 4;m = 4;//数组后,从第四位开始存储黑鱼的坐标。

while(1)

{

而(!kb hit()& amp;& amp莱恩。=0)//在没有按键输入且没有撞墙的情况下进入循环使得len=0(防止撞墙后没有按键输入被终止)。

{

while(FD & lt;=num)//如果FD

{

{ fi = rand()%(Kuan-3)+1;FJ = rand()%(Chang-3)+1;}

while(map[fi][FJ]& gt;0);//不在墙壁里,也不在蛇的身体里。

if(FD & lt;20)

{ map[fi][FJ]= food;油漆(fi,FJ);fa[zz++]= fi;FB[mm++]= FJ;fd++;}

其他

{ map[fi][FJ]= food;油漆(fi,FJ);fa[SJ]= fi;FB[SJ]= FJ;fd++;}//如果fd=20进来循环,新生成的水果的坐标会赋给上次吃的数组,方便后续循环检测。

}

开关(方向)

{

案例1:{ map[hi][bj]= body;油漆(hi,bj);hi-;打破;}

案例二:{ map[hi][bj]= body;油漆(hi,bj);hi++;打破;}

案例三:{ map[hi][bj]= body;油漆(hi,bj);bj-;打破;}

案例四:{ map[hi][bj]= body;油漆(hi,bj);bj++;打破;}

}

if((map[hi][bj]= = body)| |(map[hi][bj]= = wall))//在绘制新的头部之前,判断要绘制的位置是否是身体在地图上的位置。是意味着失败。

{gotoxy(30,12);Printf("失败!");len = 0;打破;}

map[hi][bj]= head;油漆(hi,bj);//连接,否则执行此步骤绘制头部。

a[k++]= hi;b[m++]= bj;kk++;//设置另外两个数组记录磁头的坐标,kk代表磁头运行的次数。

for(I = 0;我& lt= numi++)

{

if(hi = = fa[I]& amp;& ampBj==fb[i])//吃水果的时候,记录fd+1,score +1,length +1,吃的水果的坐标,存储在数组的角上。

{ FD = FD-1;len++;iii++;SJ = I;}

}

如果(kk & gt(len-1))//头的每一步,kk++删除前面轨迹坐标对应的体,也就是尾部。吃菜的话,尾巴留一次,等脑袋再动的时候再删。

{

if(映射[a[aa]][b[bb]]!=墙)

{

map[a[aa]][b[bb]]= road;

油漆(a[aa],b[bb]);

aa++;b b++;

kk-;

}

其他

{ aa+= 9;b b+ = 9;map[a[aa]][b[bb]]= road;油漆(a[aa],b[bb]);kk-= 9;}

}

if(len & gt;=18)//异常版本代码

{

for(I = 1;我& lt11;i++)

{ map[a[k-11-I]][b[m-11-I]]= wall;油漆((a[k-11-i]),(b[m-11-I]);}//从头后第十二节开始,就变成墙了。

len-= 8;

t+= 4;

}

gotoxy(64,7);Printf("3。分数:%d”,iii);

睡眠(t-2 * iii);//速度算法需要改进!!!!!!!!

}

If (len==0)//碰壁,退出while(1) total循环。

打破;

direction=getkey(方向);//点击键,getch提取并删除输入的字符,这样在(!kb hit());

}

}

主()

{

srand(time(NULL));

hidden();

start();

game();

gotoxy(0,0);//锁定屏幕显示

getchar();

}