Y的坐标稍微简单些,只要保证坐标值在1~28就行。
另外求出了坐标之后要判断食物是否与蛇身重合,重合的话重新赋值。
搞完上面的,我们就有了一个基本的(静态)效果了,现在我们要让它动起来

注:第86行是设置控制台窗口长、宽的系统函数。
4.让蛇动起来
蛇每次移动背后发生的事就是数组里的值改变,再在每个坐标位置打印蛇身。
为了让蛇一直动,我们就需要一个循环
while(1)
{
//获得输入,改变坐标
//在每个坐标处输出
}
首先,我们需要确定方向,而这需要两个变量,一个是输入值(可能是任意值),另一个则是确定方向的变量。
这里介绍一个函数
int kbhit(void);
// 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
这是一个非阻塞函数,有键按下时返回非0,但此时按键码仍然在键盘缓冲队列中。所以在确定键盘有响应之后,再用一个char变量将输入从缓冲区中调出来。
if(kbhit())
ch = getch();
再对ch做判断,如果是符合情况(不能往后走等)的输入,则开始执行switch改变坐标
if(ch=='w'&&direction!='s')
direction = ch;
else if(ch=='s'&&direction!='w')
direction = ch;
else if(ch=='a'&&direction!='d')
direction = ch;
else if(ch=='d'&&direction!='a')
direction = ch;
else if(ch==' ')
continue;
这里设置空格是暂停,而为了让蛇一开始就移动,我们把direction设置为d(往右)。
在方向确定了之后,再用一个switch语句进行坐标判断
switch(direction)
{
case 'w':
if(snake[0].x==food.x && snake[0].y-1==food.y)
{
length++;
score+=10;
snake[2+length].x = snake[2+length-1].x;
snake[2+length].y = snake[2+length-1].y;
for(i=length+3-2;i>0;i--)
{
snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;
}
CreateFood();
}
else
{
Pos(snake[2+length].x,snake[2+length].y);
printf(" ");
for(i=length+3-1;i>0;i--)
{
snake[i].x = snake[i-1].x;
snake[i].y = snake[i-1].y;
}
}
snake[0].y -=1;
break;
case 's':
//。。。
case 'a':
//。。。
case 'd':
//。。。
}
对蛇头的下一步做判断,如果吃到了食物的话,则先对分数等全局变量进行处理,再把snake[2+length-1](吃到食物后的倒数第二个变量)的值赋值给snake[2+length](此时新加的尾节)。










