使用队列解决贪吃蛇

本文介绍了一个C语言实现的顺序队列,着重改进了EnQueue_SeqQueue函数以减少运行时间,并添加了碰撞检测功能。通过调整队列操作和优化算法,提升了性能并简化了代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 5005 
typedef struct 
{
    int *x;  
    int *y;
    int front,rear;  
}SeqQueue; 
void Init_SeqQueue(SeqQueue *Q,int n)
{
    Q->x=(int *)malloc(n*sizeof(int));
    Q->y=(int *)malloc(n*sizeof(int));
    if(Q->x==NULL||Q->y==NULL)
    {
        exit(-1);
    }
    Q->front=Q->rear=0;
}
int Empty_SeqQueue(SeqQueue *Q)
{
    if(Q->front==Q->rear)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int Full_SeqQueue(SeqQueue *Q)
{
    if((Q->rear+1)%MAXSIZE==Q->front)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int Length_SeqQueue(SeqQueue *Q)
{
    int k;
    k=(Q->rear-Q->front+MAXSIZE)%MAXSIZE;
    return(k);
}
int Collide(SeqQueue *Q)
{
    int t=Q->front;
    while (t!=Q->rear-1)
    {
        if (Q->x[t%MAXSIZE]==Q->x[Q->rear-1]&&Q->y[t%MAXSIZE]==Q->y[Q->rear-1])
        {
            return 0;
        }
        t++;
    }
    return 1;
}
int EnQueue_SeqQueue_1(SeqQueue *Q,int x,int y)
{
    if(Full_SeqQueue(Q)==1)
    {
   
        return 0;
    }
    else
    {
        Q->x[Q->rear]=x;  
        Q->y[Q->rear]=y;
        Q->rear=(Q->rear+1)%MAXSIZE;
        return 1;
    }
}
int EnQueue_SeqQueue(SeqQueue *Q,int e)
{
    if(Full_SeqQueue(Q)==1)
    {
       
        return 0;
    }
    else
    {
        if(e==0)
        {
            Q->x[Q->rear]=Q->x[((Q->rear)-1+MAXSIZE)%MAXSIZE]-1;  
            Q->y[Q->rear]=Q->y[((Q->rear)-1+MAXSIZE)%MAXSIZE]; 
            Q->rear=((Q->rear)+1)%MAXSIZE;
        }
        else if (e==1)
        {
            Q->x[Q->rear]=Q->x[((Q->rear)-1+MAXSIZE)%MAXSIZE]+1;  
            Q->y[Q->rear]=Q->y[((Q->rear)-1+MAXSIZE)%MAXSIZE]; 
            Q->rear=((Q->rear)+1)%MAXSIZE;
        }
        else if (e==2)
        {
            Q->x[Q->rear]=Q->x[((Q->rear)-1+MAXSIZE)%MAXSIZE];  
            Q->y[Q->rear]=Q->y[((Q->rear)-1+MAXSIZE)%MAXSIZE]-1; 
            Q->rear=((Q->rear)+1)%MAXSIZE;
        }
        else if (e==3)
        {
            Q->x[Q->rear]=Q->x[((Q->rear)-1+MAXSIZE)%MAXSIZE];  
            Q->y[Q->rear]=Q->y[((Q->rear)-1+MAXSIZE)%MAXSIZE]+1; 
            Q->rear=((Q->rear)+1)%MAXSIZE;
        }
        return 1;
    }
}
int DeQueue_SeqQueue(SeqQueue *Q)
{
    if(Empty_SeqQueue(Q))
    {
        return 0;
    }
    else
    {
        Q->front=(Q->front+1)%MAXSIZE;
        return 1;
    }
}
void Display_SeqQueue(SeqQueue *Q)
{
    int k,len;
    if(Empty_SeqQueue(Q)==1)
    {
    }
    else
    {
        len=Length_SeqQueue(Q);
        for(k=0;k<len;k++)
        {
            printf("%4d ",Q->x[(Q->front+k)%MAXSIZE]);
            printf("%4d\n",Q->y[(Q->front+k)%MAXSIZE]);
        }
    }
}
int main()
{
    SeqQueue Q;
    int n,t,i,T=0;
    scanf("%d %d",&n,&t);
    int x[n],y[n],e[t];
    Init_SeqQueue(&Q,MAXSIZE);
    for (i=0;i<n;i++)
    {
        scanf("%d %d",&x[i],&y[i]);
    }
    for(i=n-1;i>=0;i--)
    {
        EnQueue_SeqQueue_1(&Q,x[i],y[i]);
    }
    for(i=0;i<t;i++)
    {
        scanf("%d",&e[i]);  
    }
    for(i=0;i<t;i++)
    {
        DeQueue_SeqQueue(&Q);
        EnQueue_SeqQueue(&Q,e[i]);
        if(Collide(&Q))
        {
            T++;
        }
        else
        {
            break;
        }
    }
    printf("%d",T);
    return 0;
}

缺点较为明显,运行时间长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值