c语言双向链表写贪吃蛇的移动,怎么写?怎么添头去尾?我实在没办法了,谁救救我,给高分。
structsnake{intx;inty;structsnake*previous;structsnake*next;}*head,*tail;老师给出的贪吃蛇数据结构...
struct snake{
int x;
int y;
struct snake *previous;
struct snake *next;
}*head,*tail;
老师给出的贪吃蛇数据结构,问题是怎么实现蛇的移动,老师说添头去尾,怎么个弄法,我看网上别人用数组记录蛇的每一节,没用双向链表很容易就解决了,但老师说必须用到双向链表什么的。求大神给个c语言的代码,比如填一下下面的:
if(life==1&&foodflag==0)
food_show();/*出现食物的函数,我写好了*/
/*蛇移动的复合语句*/
{
蛇移动,添头去尾,怎么写,要用到双向链表。关键步骤。
}
switch(headdirection)
{
case 1:head->y-=10;break;
case 2:head->y+=10;break;
case 3:head->x-=10;break;
case 4:head->x+=10;break;
}
。。。。/*可能出现的情况等等,不用写*/
}
哎,都不行,两位大侠都说的有道理,但还是不对,沾了点边,我最后还是baidu了几天搞定了,所以分也不好给了,要能一人给50分就好了,不好意思了,还是多谢两位大侠,不要怪我。 展开
int x;
int y;
struct snake *previous;
struct snake *next;
}*head,*tail;
老师给出的贪吃蛇数据结构,问题是怎么实现蛇的移动,老师说添头去尾,怎么个弄法,我看网上别人用数组记录蛇的每一节,没用双向链表很容易就解决了,但老师说必须用到双向链表什么的。求大神给个c语言的代码,比如填一下下面的:
if(life==1&&foodflag==0)
food_show();/*出现食物的函数,我写好了*/
/*蛇移动的复合语句*/
{
蛇移动,添头去尾,怎么写,要用到双向链表。关键步骤。
}
switch(headdirection)
{
case 1:head->y-=10;break;
case 2:head->y+=10;break;
case 3:head->x-=10;break;
case 4:head->x+=10;break;
}
。。。。/*可能出现的情况等等,不用写*/
}
哎,都不行,两位大侠都说的有道理,但还是不对,沾了点边,我最后还是baidu了几天搞定了,所以分也不好给了,要能一人给50分就好了,不好意思了,还是多谢两位大侠,不要怪我。 展开
2个回答
展开全部
用单向链表也能构造,不过双向链表构造起来更加的方便而已。其实两者的原理是一样的。移动后,蛇的所有节的位置都发生了移动,为了减少移动的数量,最好的办法就是创造一个新头,然后把尾吧剪掉。
struct snake* New_Head;
New_Head = (struct snake*)malloc(sizeof(struct snake));
/* 新的头结点的位置自己写吧。*/
New_Head -> next = head; /*head 是这个链表的头指针,自己改。*/
head -> previous = New_Head;/*这是双向链表所要的。*/
tail -> previous -> next = NULL;
tail -> previous = NULL;
free(tail);
struct snake* New_Head;
New_Head = (struct snake*)malloc(sizeof(struct snake));
/* 新的头结点的位置自己写吧。*/
New_Head -> next = head; /*head 是这个链表的头指针,自己改。*/
head -> previous = New_Head;/*这是双向链表所要的。*/
tail -> previous -> next = NULL;
tail -> previous = NULL;
free(tail);
追问
大哥,我改了运行了下,你这个好像也不行,改和没改之前一样的,只画不去,那个怎么把tail释放了,我认为就算剪了尾巴,tail还是该重新指向新的尾巴吧,要不然老师给个*tail和*head做什么,大哥,在帮我一下,我就差这一步了。
追答
那我改一下你试试看吧,抱歉昨天没看的仔细,反正原理就是这样的。
struct snake* New_Head;
New_Head = (struct snake*)malloc(sizeof(struct snake));
/* 新的头结点的位置自己写吧。*/
New_Head -> next = head; /*head 是这个链表的头指针,自己改。*/
New_Head -> previous = NULL;
head -> previous = New_Head;/*这是双向链表所要的。*/
tail = tail ->previous;
tail -> next -> previous = NULL;
free(tail -> next);
tail -> next = NULL;
这样改过之后你看看行不行,不行请追问。
展开全部
/*蛇移动的复合语句*/
{
struct snake * nt=(Snake*)malloc(sizeof(struct snake));
nt->x=tail->x,nt->y=tail->y; //原来尾部的位置
struct snake * temp=tail;
while(temp!=head)
{
//把从当前尾部开始的蛇身体部分移到前一块的位置去(走一步)
temp->x=temp->previous->x;
temp->x=temp->previous->y;
temp=temp->previous;
//除了蛇头部分,因为蛇头可以靠输入改变方向
}
//因为吃了食物,所以蛇要变长,这里添加新的蛇尾,位置就是移动前蛇尾的位置,上面已经保存了。
tail->next=nt;
nt->previous=tail;
nt->next=NULL;
tail=nt;
}
{
struct snake * nt=(Snake*)malloc(sizeof(struct snake));
nt->x=tail->x,nt->y=tail->y; //原来尾部的位置
struct snake * temp=tail;
while(temp!=head)
{
//把从当前尾部开始的蛇身体部分移到前一块的位置去(走一步)
temp->x=temp->previous->x;
temp->x=temp->previous->y;
temp=temp->previous;
//除了蛇头部分,因为蛇头可以靠输入改变方向
}
//因为吃了食物,所以蛇要变长,这里添加新的蛇尾,位置就是移动前蛇尾的位置,上面已经保存了。
tail->next=nt;
nt->previous=tail;
nt->next=NULL;
tail=nt;
}
追问
大哥,怎么好像不行啊~!没去尾,没添头,我编译了下,运行起来好像不是那么回事~!
追答
你看啊,蛇的身体每一部分是双链表的一个节点对吧,蛇每移动一步,蛇身体的每一部分(除了头)的位置就是前一部分的位置,头部的位置依靠你这里的headdirection决定对吧,着就相当于你所说的添头去尾,添头你写好了。
这里是去尾:
struct snake * temp=tail;
while(temp!=head)
{
//把从当前尾部开始的蛇身体部分移到前一块的位置去(走一步)
temp->x=temp->previous->x;
temp->y=temp->previous->y; //我原来打错了。。。。打成temp->x了。。。
temp=temp->previous;
//除了蛇头部分,因为蛇头可以靠输入改变方向
}
我原来的程序是有点问题,因为我理解错了。
//如果吃到了食物,这里要在移动前执行。
struct snake * nt=(Snake*)malloc(sizeof(struct snake));
nt->x=tail->x,nt->y=tail->y; //原来尾部的位置
//如果吃到了食物,这里在移动后执行:
tail->next=nt;
nt->previous=tail;
nt->next=NULL;
tail=nt;
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询