创建食物:
需要注意的时,食物在随机生成时只能出现在方框中,同时不能出现在边界上,代码如下:
void creatfood()
{
snake *food_1;
srand((unsigned)time(NULL));//初始化随机数
food=(snake*)malloc(sizeof(snake));//初始化food_1
while((food_1->x%2)!=0)//保证食物出现在方框中
{
food_1->x=(rand)%52+2;//食物的横坐标为2~53
}
food_1-y=rand()%24+1;//食物的纵坐标在1~24之间
q=head;
while(q->next==head)
{
if(q->x==food_1->x && q-y==food_1-y)//判断食物与蛇身是否重合
{
free(food_1);//食物与蛇身重合,释放食物指针
creatfood();//重新创建食物
}
q=q->next;
}
gotoxy(food_1->x,food_1->y);//打印食物位置
food=food_1;
color(12);
printf("●");//输出食物
}
将该函数加入switch语句中。
判断蛇是否咬到自己:
当蛇头与蛇身重合,为游戏结束的第一种情况。
int biteself()
{
snake *self;
self=head->next;//蛇身节点
while(self!=NULL)
{
if(self->x==head->x && self->y==head->y)
{
return 1;//返回1,游戏结束
}
self=self->next;
}
return 0;
}
判断蛇是否撞到墙:
void cantcrosswall()
{
if(head->x==0 || head->x==56 || head->y==0 || head->y==26)
{
endgamestatus=1;//游戏结束第一种情况
}
}
设置蛇加速前进:
void speedup()
{
if(sleeptime>=50)//如果时间间隔大于等于50
{
sleeptime=sleeptime-10;//时间间隔减10
add=add+2; //每次得分加2
}
}
设置蛇减速前进:
void speeddown()
{
if(sleeptime<350)//如果时间间隔小于350
{
sleeptime=sleeptime+30;//时间间隔加30
add=add-2; //每次得分减2
if(sleeptime==350)
{
add=1;//保证最低分为1
}
}
}
设置不按键时蛇的前进方向:
向上移动时,x坐标不变,y坐标-1
向下移动时,x坐标不变,y坐标+1
向左移动时,x坐标-2,y坐标不变
向右移动时,x坐标+2,y坐标不变
蛇在上、下、左、右移动时,会遇到两种情况,一种是前进方向有食物,另一种是没有食物。
以一个方向为例,代码如下:
void snakemove()
{
//蛇前进,上U,下D,左L,右R
snake *nexthead;
cantcrosswall();
nexthead = (snake*)malloc(sizeof(snake));
if (status == U)
{
nexthead->x = head->x;
nexthead->y = head->y-1;
nexthead->next = head;
head = nexthead;
q = head; //如果吃到食物的话,执行if语句
if (nexthead->x == food->x && nexthead->y == food->y)
{
while (q != NULL)
{
gotoxy(q->x, q->y);
color(14);
printf(“☆”);//将●换为☆
q = q->next;
}
score = score + add;
speedup();
creatfood();
}
else
{ //没有吃到食物
while (q->next->next != NULL)
{
gotoxy(q->x, q->y);
color(14);
printf("☆");
q = q->next;
}
gotoxy(q->next->x, q->next->y);
color(3);
printf(“□”); //打印□后,释放指向下一位的指针
free(q->next);
q->next = NULL;
}
//其他三个方向根据蛇移动的规律改动上面部分代码即可
}
今日分析就到这里了,请各位实现上述代码,且听下次分析。