贪吃蛇(二)

创建食物:

需要注意的时,食物在随机生成时只能出现在方框中,同时不能出现在边界上,代码如下:

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;
	}
        //其他三个方向根据蛇移动的规律改动上面部分代码即可
}

今日分析就到这里了,请各位实现上述代码,且听下次分析。

猜你喜欢

转载自blog.csdn.net/wang_zhao_/article/details/81084725