关于贪吃蛇游戏的一些问题?
# 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();
}