C语言结构数组实现贪吃蛇小游戏

2020-01-06 17:22:41王旭

Y的坐标稍微简单些,只要保证坐标值在1~28就行。

另外求出了坐标之后要判断食物是否与蛇身重合,重合的话重新赋值。

搞完上面的,我们就有了一个基本的(静态)效果了,现在我们要让它动起来

C语言,贪吃蛇

注:第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](此时新加的尾节)。