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

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


void CreateMap() 
{ 
 int i; 
 for(i=0;i<LONG;i+=2) 
 { 
 Pos(i,0); 
 printf("■"); 
 Pos(i,WIDTH-1); 
 printf("■"); 
 } 
 for(i=1;i<WIDTH-1;i++) 
 { 
 Pos(0,i); 
 printf("■"); 
 Pos(LONG-2,i); 
 printf("■"); 
 } 
} 

C语言,贪吃蛇

这样看就舒服多了,不过也让复杂度提升了一些,上边框每个符号的坐标分别是(0,0)(2,0)(4,0)…(2*n-2,0)这个在蛇的移动及食物的模块再提。

2.初始化一条蛇

因为蛇以及食物 本质上都是一个坐标,所以我们可以定义一个新的数据类型Node,每一个Node都是一个存储了两个变量(x、y)的结构体,再通过Node来定义蛇和食物。


typedef struct node{ 
 int x; 
 int y; 
}Node; 
 
 
Node snake[60];

好了,我们现在定义了一条叫snake的蛇。为了这条蛇肥胖适中长宽比例一致,我们用"⊙"代表蛇的每一节。刚开始我们令蛇出现在地图中间位置,蛇头在右,共3个节点。所以我们需要求得每个节点的坐标。


 void InitializeSnake() 
{ 
 int i; 
 for(i=0;i<3;i++) 
 { 
 snake[i].x = (LONG/2-i*2);//(30,15)(28,15)(26,15) 
 snake[i].y = WIDTH/2; 
 Pos(snake[i].x,snake[i].y); 
 printf("⊙"); 
 } 
} 

这样我们就在(30,15)(28,15)(26,15)三个坐标处确定了一条蛇。X坐标之间减2是因为"⊙"在X轴占两个基本值。

C语言,贪吃蛇

3.随机出现食物

先创建一个变量来存储食物的坐标

Nodefood;

得到它的坐标其实就是用随机值对长、宽取余,使值在区间(地图)范围内。


void CreateFood() 
{ 
 int i; 
 srand((unsigned int)time(0)); 
 while(1) 
 { 
 do{ 
  food.x = rand()%(LONG-6)+2; 
 }while(food.x%2!=0); 
 food.y = rand()%(WIDTH-2)+1; 
 for(i=0;i<3+length;i++) 
  if(food.x==snake[i].x && food.y==snake[i].y) 
  { 
  i=-1; 
  break; 
  } 
 if(i>=0) 
 { 
  Pos(food.x,food.y); 
  printf("●"); 
  break; 
 } 
 } 
 //AfterEatFood(); 
} 

X的坐标值求法为rand()%(LONG-6)+2,因为食物"●"也是两个字符的位置,所以它可能的取值为(2,y)(4,y)…(56,y)上下变宽共30个字符,从0开始,每个+2,所以最后一个为(58,y)

Rand()%(LONG)的取值范围为0~59而x=1,x=2,x=58,x=59是地图范围,所以得对LONG-6(60-6=54)取余,这样取值范围就是0~54,再加2,就成了2~56.又因为蛇的各节坐标及移动x坐标都是+2,所以食物的x坐标必须是偶数,这可以用一个do(…)while()搞定,先取值,再判断,不行就再取值