双向链表-多线程双线链表实现贪食蛇蛇身不长,怎么破

问题描述

多线程双线链表实现贪食蛇蛇身不长,怎么破

#include
#include
#include
#include
typedef struct node{
int* body;
struct node* p_prev;
struct node* p_next;
}node;
node head;
int move();
char dir;
int* SaveTailBody; //保存尾节点地址

void show(int map[20][20],int x,int y)
{
for(y=0;y
{
for(x=0;x
{
if(x==0||x==19||y==0||y==19)
{
printf("*");
}
else if(map[x][y]==1)
{
printf("@");
}
else if(map[x][y]==2)
{
printf("O");
}
else
{
printf(" ");
}
}
printf("n");
}
}
void add_body(int map[20][20],int* p_x,int* p_y,int* p_ax,int* p_ay,node* p_head,node* p_tail,node* tailSave)
{
node* p_node=(node*)malloc(sizeof(node));
if(!p_node) perror("p_node"),exit(-1);
p_node->p_prev=NULL;
p_node->body=p_head->body;
p_node->p_next=p_head->p_next;
p_head->p_prev=NULL;
p_head->body=&map[*p_x][*p_y];
p_head->p_next=p_node;
p_node->p_prev=p_head;
/*p_head=p_head^p_tail; //异或交换两个节点的值
p_tail=p_head^p_tail;
p_head=p_head^p_tail;*/
}
int move(int map[20][20],int* p_x,int* p_y,int* p_ax,int* p_ay,node* p_head,node* p_tail)
{
switch(dir){
case 'a':
if(map[--*p_x][*p_y]==0){
SaveTailBody=p_tail->body;
SaveTailBody=0;
p_tail->body=p_tail->p_prev->body;
map[*p_x][*p_y]=1;
p_head->body=&map[*p_x][*p_y];
break;
}
++*p_x;
if(map[--*p_x][*p_y]==2){
map[*p_x][*p_y]=1;
// add_body(map,p_x,p_y,p_ax,p_ay,p_head,p_tail,tailSave);
node
p_node=(node*)malloc(sizeof(node));
if(!p_node) perror("p_node"),exit(-1);
p_head->p_next->p_prev=p_node;
p_node->p_prev=p_head;
p_node->body=p_head->body;
p_node->p_next=p_head->p_next;
p_head->body=&map[*p_x][*p_y];
p_head->p_next=p_node;
break;
}
case 'd':
p_tail->body=0;
p_tail->body=p_tail->p_prev->body;
map[++*p_x][*p_y]=1;
p_head->body=&map[*p_x][*p_y];
break;
case 'w':
*p_tail->body=0;
p_tail->body=p_tail->p_prev->body;
map[*p_x][--*p_y]=1;
p_head->body=&map[*p_x][*p_y];
break;
case 's':
*p_tail->body=0;
p_tail->body=p_tail->p_prev->body;
map[*p_x][++*p_y]=1;
p_head->body=&map[*p_x][*p_y];
break;
}
}
void
task(void* p){
while(1){
scanf("%s",&dir);
}
}
int main()
{
int map[20][20]={};
srand(time(0));
int x=0,y=0; //初始化蛇头坐标
int ax=0,ay=0; //初始化实食物坐标
x=rand()%18+1;

y=rand()%18+1;
ax=rand()%18+1;
ay=rand()%18+1;
map[x][y]=1;
map[x+1][y]=1; //蛇尾坐标
map[ax][ay]=2;
int* p_x;int*p_y;
int* p_ax;int*p_ay;
p_x=&x;p_y=&y;
p_ax=&ax;p_ay=&ay;
node* p_head=(node*)malloc(sizeof(node));
if(!p_head) perror("p_head"),exit(-1);
node* p_tail=(node*)malloc(sizeof(node));
if(!p_tail) perror("p_tail"),exit(-1);
p_head->body=&map[x][y];
p_head->p_prev=NULL;
p_head->p_next=p_tail;
p_tail->body=&map[x+1][y];
p_tail->p_prev=p_head;
p_tail->p_next=NULL;
pthread_t id;
pthread_create(&id,0,task,0);
while(1){
show(map,x,y);
if(*p_x==0||*p_x==19||*p_y==0||*p_y==19){
printf("GAME OVERn");
exit(-1);
}
move(map,p_x,p_y,p_ax,p_ay,p_head,p_tail);
usleep(300000);
}
return 0;

}

首先,描述一下功能
地图是一个二位数组,蛇是一个结构体的节点:
typedef struct node{
int* body;
struct node* p_prev;
struct node* p_next;
}node;
因为是双向链表所有有上一个跟下一个的指针。
食物在地图上的值是2:
map[ax][ay]=2;
蛇头是p_head,尾是p_tail;

wasd是上下左右,多线程实现,按一下方向会不停走,直到方向改变或者撞墙。

问题来了:
吃到食物之后(向左吃到食物,就是a方向)
case 'a':
if(map[--*p_x][*p_y]==0){
SaveTailBody=p_tail->body;
SaveTailBody=0;
p_tail->body=p_tail->p_prev->body;
map[*p_x][*p_y]=1;
p_head->body=&map[*p_x][*p_y];
break;
}
++*p_x;
if(map[--*p_x][*p_y]==2){
map[*p_x][*p_y]=1;
// add_body(map,p_x,p_y,p_ax,p_ay,p_head,p_tail,tailSave);
node
p_node=(node*)malloc(sizeof(node));
if(!p_node) perror("p_node"),exit(-1);
p_head->p_next->p_prev=p_node;
p_node->p_prev=p_head;
p_node->body=p_head->body;
p_node->p_next=p_head->p_next;
p_head->body=&map[*p_x][*p_y];
p_head->p_next=p_node;
break;
}
开辟了一个堆空间用来存储新增加的节点,食物的节点用来当蛇头(1是蛇,2是食物),把新增加的节点放在蛇头后面。
因为初始的蛇是两个节点,一个头一个尾,我把新节点加在头的位置或者尾的位置或者中间的位置都试过了,然并卵。
吃到食物之后确实增加了一个蛇身节点,显示也正确,但是走了两步之后蛇就开始走一步长一结,而且我把p_tail->p_prev->body(尾节点的上一个节点的body)打出来之后居然是0(1是蛇身,意思就是这个节点的位置应该是空的才对),我一直在纠结是不是指针操作出问题,已经来来回回看过好多遍了,实在找不到问题所在。

时间: 2024-11-12 21:00:56

双向链表-多线程双线链表实现贪食蛇蛇身不长,怎么破的相关文章

贪食蛇怎么走的这么奇葩....

问题描述 为什么这个蛇有的时候会一下走两格?一卡一卡的找了好久都没有找出错误....才这么点程序不会是电脑卡造成的吧,求大神帮忙看看[code=publicclassGameTest{publicstaticvoidmain(String[]args){Yardy=newYard(newSnake());y.gameBegin();}}importjava.awt.Color;importjava.awt.Font;importjava.awt.Frame;importjava.awt.Grap

c++-菜鸟求大神帮忙解答贪食蛇问题

问题描述 菜鸟求大神帮忙解答贪食蛇问题 以下的这段贪食蛇代码是我在百度上看到的,我不理解int tcsZuobiao[2][100]; //蛇的坐标数组for (i = 0; i tcsZuobiao[0][i] = 1; tcsZuobiao[1][i] = i + 1; }这里为什么蛇的坐标是[2][100]呢,还有循环里面的也不懂为什么要这样弄 #include #include #include #include using namespace std; // 刷新当前屏幕 inline

Console小技巧——Console版贪食蛇

其实这是我写的第一个小游戏,大学C语言那个剪子.石头.布的实验我是没做-- 今天刚好是愚人节,就把这个当作小礼物送给大家,希望大家天天高兴 :) 这个Console版贪食蛇是"七彩输出"和"字符涂鸦"的综合应用. 估计编写Console程序用得最多的就是ReadLine()和WriteLine()这两个方法了吧,其实Console还有几 个很有用的方法,稍加组合就可以使Console程序非常有意思了. 这里挑几个核心的总结一下. 如何使输出有颜色: Console.

在线旅游正以“贪食蛇”模式洗牌

携程新劲敌来了.对手靠"吞并同类"的贪食蛇模式显现江湖. 总部位于广州的易网通旅行(以50.7%的份额控股广之旅)近日宣布,全资收购总部在北京的游易航空旅行网,成立"易网通游易"新公司,年营收总额达17.5亿元,超过在线旅游老大携程16亿的年收入. 蚂蚁雄兵能够击败大象吗?"从第三方研究数据看,携程在在线旅游市场占领先地位,占据的80%以上的市场份额正在进一步扩大."携程CEO范敏回答淡定. 当心!在线旅游企业开始新一轮洗牌了.细分到机票预订这类

“贪食蛇”亚马逊不断扩张持续亏损:是时候考虑盈利问题了

导语:亚马逊就像一个贪食蛇,不断投资.不断吞食.不断膨胀,在利润面前不慌不忙.只是,亚马逊是否会"成于贪食.亦败于贪食"? 上周,亚马逊公布2013年第二季度财报,亏损700万美元.股东和业界对此并不惊讶,亚马逊的亏损不是一两个季度了.上市后16年来亚马逊时常爆出亏损消息,股票却仍然一路高涨,市盈率已超过3000倍.像这样的亚马逊业界"奇葩",独此一家,没有分店. 亚马逊高层总在华尔街质疑他们时说,"如果我们想追求利润,下个季度就可以让利润翻番."

当心!在线旅游正以“贪食蛇”模式洗牌

漫画:张建辉 携程新劲敌来了.对手靠"吞并同类"的贪食蛇模式显现江湖. 总部位于广州的易网通旅行(以50 .7%的份额控股广之旅)近日宣布,全资收购总部在北京的游易航空旅行网,成立"易网通游易"新公司,年营收总额达17.5亿元,超过在线旅游老大携程16亿的年收入. 蚂蚁雄兵能够击败大象吗?"从第三方研究数据看,携程在在线旅游市场占领先地位,占据的80%以上的市场份额正在进一步扩大."携程CEO范敏回答淡定. 当心!在线旅游企业开始新一轮洗牌了.细

Flash游戏制作:贪食蛇经典游戏新手教程

教程 这是我写的第一个游戏..功能还没完善..只有最基本的功能..先把大致的拿上来让大家看看先. 效果及源文件:贪吃蛇.rar 其实整个游戏一共要解决几个问题. 1.如何让蛇根据键盘的方向移动? 2.如何让食物随机分布? 3.如何让蛇碰到食物的时候食物消失蛇身加长? 4.如何移动框外或者碰到蛇身就就GAME OVER. 先说第一个问题 .1.如何让蛇根据键盘的方向移动?先将复杂的问题简单化.就一个MC而言.我们如何通过键盘移动呢? 新建MC..并将起命名成 snakehead(蛇头)然后在新建一

MFC 写贪食蛇时遇到的问题..

问题描述 界面如下在classwizard中加了按键响应处理函数voidC贪吃蛇Dlg::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){//MessageBox(L"游111戏:");//TODO:在此添加消息处理程序代码和/或调用默认值switch(nChar){caseVK_LEFT:dir=left;break;caseVK_RIGHT:dir=right;break;caseVK_UP:dir=up;break;caseVK_DOWN:

用vb编写贪食蛇

' ' Q B a s i c N i b b l e s ' ' Copyright (C) Microsoft Corporation 1990 ' ' Nibbles is a game for one or two players. Navigate your snakes ' around the game board trying to eat up numbers while avoiding ' running into walls or other snakes. The mo