m0_68396682 2022-11-18 20:47 采纳率: 88.9%

关于使用数据结构队列创建贪吃蛇的问题

123456789 0
3 2

134567892
3 1
345678921
3 0

``````#include<stdio.h>
#include<stdlib.h>

struct queue{
int Data[100];
int Rear;
int Front;
};
void Createqueue(struct queue *q)
{
q->Rear = -1;
q->Front = -1;
}
void Addqueue(struct queue *q, int x)
{
q->Rear++;
q->Data[q->Rear] = x;
}
int Outqueue(struct queue *q)
{
q->Front++;
return q->Data[q->Front];
}
int Isqueue(struct queue *q)
{
int i;
if(q->Rear == q->Front) {
i = 0;
}
else {
i = 1;
}

return i;
}
int main()
{
struct queue Qa;
Createqueue(&Qa);
int i;
for(i = 0;i<9;i++)
{
}
while(Isqueue(&Qa))
{
int    k = Outqueue(&Qa);
printf("%d",k);
}

}
``````
• 写回答

3条回答默认 最新

• 关注

代码如下：

``````
#include <stdio.h>
#define LEN 10
struct queue {
int Data[LEN];
int Rear;
int Front;
};

void InitQueue(struct queue* q)
{
for(int i=0;i<LEN;i++)
q->Data[i] = -1;
}

//输出
{
int i,j;
{
if(q->Data[i%LEN] != -1)
printf("%d",q->Data[i%LEN]);
}
printf("\n");
}

int main()
{
char str[12] = { 0 };
int sn, snindex; //蛇头元素和蛇头下标
int i, v, size = 0;
struct queue Qa;
InitQueue(&Qa); //初始化队列
scanf("%d %d", &sn, &snindex);

//将数字串放入队列
for (i = 0; str[i] != '\0'; i++)

//如果队头下标==蛇头下标，直接输出即可
{
printf("%d %d\n", sn, snindex);
return 0;
}
else
{
//如果队头==0
{
//队尾肯定在最后，所以蛇头直接向前移动即可
{
//队列数据前移
v = Qa.Data[snindex - 1];
for (i = snindex; i < LEN; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[LEN - 1] = v;
snindex--;
//输出蛇元素
printf("%d %d\n", sn, snindex);
}
}
else
{
// 对头下标不为0，队尾肯定在头的左侧
Qa.Rear = Qa.Front - 1;
//如果蛇头初始位置在队尾的左侧
if (snindex <= Qa.Rear)
{
//先向左侧
while (snindex > 0)
{
v = Qa.Data[snindex - 1];
for (i = snindex; i <= Qa.Rear; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[Qa.Rear] = v;
snindex--;
//打印
printf("%d %d\n", sn, snindex);
}
//snindex == 0
v = Qa.Data[LEN-1]; //
Qa.Data[LEN-1]= Qa.Data[0];
for(i=0;i<Qa.Rear;i++)
Qa.Data[i] = Qa.Data[i+1];
Qa.Data[Qa.Rear] = v;
snindex = LEN - 1;
printf("%d %d\n",sn,snindex);

//左侧吃完后，绕到数组末尾开始

{
v = Qa.Data[snindex - 1];
//蛇头后半部分移动
for (i = snindex; i < LEN; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[LEN - 1] = Qa.Data[0];
for (i = 0; i < Qa.Rear; i++)
Qa.Data[i] = Qa.Data[i + 1];
Qa.Data[Qa.Rear] = v;
snindex--;
if (v == -1)
continue;
printf("%d %d\n", sn, snindex);
}
}
else
{
//蛇头在队尾的右侧
//size = LEN - (snindex - qhead); //初始蛇身长度（含-1）
{
v = Qa.Data[snindex - 1];
//蛇头后半部分移动
for (i = snindex; i < LEN; i++)
Qa.Data[i - 1] = Qa.Data[i];
Qa.Data[LEN - 1] = Qa.Data[0];
for (i = 0; i < Qa.Rear; i++)
Qa.Data[i] = Qa.Data[i + 1];
Qa.Data[Qa.Rear] = v;
snindex--;
printf("%d %d\n", sn, snindex);
}
}
}
}
return 0;
}

``````
本回答被题主选为最佳回答 , 对您是否有帮助呢?
评论 编辑记录
1人已打赏

问题事件

• 已结题 （查看结题原因） 11月20日
• 已采纳回答 11月19日
• 修改了问题 11月18日
• 创建了问题 11月18日

悬赏问题

• ¥15 如何使用chatgpt完成文本分类任务？
• ¥15 已知速度v关于位置s的等式，怎么转化为已知位置求速度v的等式
• ¥15 我有个餐饮系统,用wampserver把环境配置好了,但是后端的网页却进去,是为什么,能不能帮远程一下？
• ¥15 R运行没有名称为"species"的插槽对于此对象类"SDMmodelCV"