c语言贪吃蛇详解4.食物的投放与蛇的变长
前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解。我将分几步来教大家写一个贪吃蛇小游戏。由于大家c语言未学完,这个教程只涉及数组和函数等知识点。
通过前几次的教程,我们已经做出来了能上下左右跑的小蛇了。现在我们就先来做下食物投放吧。
食物投放的基本思想是在地图上随机找一个没有蛇身也没有障碍物的地方,然后把这个地方的地图数组值标记为-1(前面我们让空地为0,障碍物为1)。
我们先来写一个函数来判断一个点是不是符合上面的条件。
int check(int ii,int jj) //判断这个点能不能放食物,可以放返回1,不能放返回0
{if(a[ii][jj]==1) //如果有障碍物,返回0
return 0;inti;for(i=0; i
{if(ii==s[i]0&&jj==s[i][1]) //如果和其中一个蛇身重合,就返回0
return 0;
}if(ii==0||ii==H-1||jj==0||jj==W-1) //如果在边界上面,返回0
return 0;return 1; //最后筛选 过后的是符合条件的点
}
要使用随机数,先
#include
然后由于要根据时间设置随机数种子,所以要
#include
在init函数里面写这句代码
srand((unsigned)time(NULL)); //设置随机数种子为现在的时间
然后写一个food函数,实现投放一个食物
voidfood()
{inti,j;do{
i=rand()%H; //生成0~H-1之间的一个数
j=rand()%W;
}while(check(i,j)==0); //生成点直到满足条件
a[i][j]=-1; //标记为食物
gotoxy(i,j);
printf("$"); //画出食物
}
然后在main里面的循环前面调用一次food,实现开始游戏时有一个食物。然后检查蛇头与食物是否重合,如果重合,就调用一次food,投放一个食物。
intmain()
{
init();//程序开始时的初始化操作
drawMap(); //画地图
food();while(1)
{
drawSnake();//画蛇
Sleep(WAIT_TIME); //等待一段时间
key();
move();//移动蛇(主要是修改蛇身数组的数据)
if(a[s[0][0]][s[0][1]]==-1) //如果蛇头碰到食物,就重新投放食物,并且把食物点重置为0
{
food();
a[s[0][0]][s[0][1]]=0;
}
}
getchar();return 0;
}
让我们来看看效果
到现在为止的代码:
#include #include#include#include#include
#define H 23
#define W 75
#define WAIT_TIME 500
//定义direction的每个值代表的方向
#define UP 0
#define DOWN 1
#define LEFT 2
#define RIGHT 3
int a[H][W]; //地图数组
int s[H*W][2]; //蛇身坐标数组