鱼C论坛

 找回密码
 立即注册
查看: 1007|回复: 6

[已解决]单链表,贪吃蛇求助

[复制链接]
发表于 2020-5-11 18:14:33 | 显示全部楼层 |阅读模式
25鱼币
刚开始看贪吃蛇的代码,感觉好多不懂的。然后,在看到开始,也就是这一部分,卡住了,单链表的问题,问题用/* */括起来了,在注释里面,灰常感谢!!

这里只是一部分贪吃蛇的代码,

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

#define WIDE 60
#define TALL 30

typedef struct SNAKE  //蛇身体每个节点的坐标   链表
{
    int x;
    int y;
    struct SNAKE* next;
}snake;

/*全局变量*/
snake* head;

//声明全部函数//
void Pos();
void creatMap();

void Pos(int x, int y)//设置光标位置
{
    COORD pos;
    HANDLE hOutput;
    pos.X = x;
    pos.Y = y;
    hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hOutput, pos);
}

void creatMap()//创建地图
{
    int i;
    for (i = 0; i < WIDE; i += 2)//打印上下边框
    {
        Pos(i, 0);
        printf("■");
        Pos(i, TALL-1);
        printf("■");
    }
    for (i = 1; i <TALL; i++)//打印左右边框
    {
        Pos(0, i);
        printf("■");
        Pos(WIDE-2, i);
        printf("■");
    }
}
void initsnake()//初始化蛇身   创建一个蛇
{
    snake* tail;
    int i;
    tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置
    tail->x = 24;
    tail->y = 5;
    tail->next = NULL; //单链表最后一个节点的指针域指向NULL
    for ( i = 1; i <=4; i++)
    {
        head = (snake*)malloc(sizeof(snake));
        head->next = tail;
        head->x = 24 + 2 * i;
        head->y = 5;
        tail = head;   /*这里head for循环能够打印的是四个格子啊,怎么最后出现的是五个格子*/
    }                  /*把头赋值给尾巴怎么打印的是五个格子?*/
   
    // 从头到尾,输出蛇身
    while (tail != NULL)
    {
        Pos(tail->x, tail->y);
        printf("■");
        tail=(tail->next);  
    }
    Pos(70, 32);
}

int biteself() //判断是否咬到了自己 判断贪吃蛇是否咬到自己,
{              //就是要判断蛇的头部是否与身体的某个节点重合,如果重合,则说明咬到了自己,
    snake* self;  //否则说明没有咬到自己。
    self = head->next;
    while (self!=NULL)/*上面那行是说self是head的下一个节点,但是之前head在for循环里赋值了好多*/
    {                 /*这里的self不应该是最前面一个方格的剩下部分吗?还是这里的head是最后一个*/
        if (self->x == head->x && self->y == head->y)/*插入的方格??*/
        {
            return 1;
        }
        self = self->next;
    }
    return 0;
}

int main()
{
    creatMap();
    initsnake();
    return 0;
}
最佳答案
2020-5-11 18:14:34
第一个问题:这个地方应该是5个。
   tail = (snake*)malloc(sizeof(snake));
    tail->x = 24;
    tail->y = 5;
    tail->next = NULL;
    for ( i = 1; i <=4; i++)
    {
        head = (snake*)malloc(sizeof(snake));
        head->next = tail; // 将链表的尾部给到头。
        head->x = 24 + 2 * i;
        head->y = 5;
        tail = head;  // 将新加的Head 给到尾,这个地方有点绕,建议你调试一下就知道了,我给一个当前的内存图给你看下就明白了。
    }
当前内存状态。
1.jpg

后面的问题,也可以根据这个内存状态看出来了。

最佳答案

查看完整内容

第一个问题:这个地方应该是5个。 tail = (snake*)malloc(sizeof(snake)); tail->x = 24; tail->y = 5; tail->next = NULL; for ( i = 1; i next = tail; // 将链表的尾部给到头。 head->x = 24 + 2 * i; head->y = 5; tail = head; // 将新加的Head 给到尾,这个地方有点绕,建议你调试一下就知道了,我给一个当前的内存图给你看下就明白了。 } 当前内存状态。 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-11 18:14:34 | 显示全部楼层    本楼为最佳答案   
第一个问题:这个地方应该是5个。
   tail = (snake*)malloc(sizeof(snake));
    tail->x = 24;
    tail->y = 5;
    tail->next = NULL;
    for ( i = 1; i <=4; i++)
    {
        head = (snake*)malloc(sizeof(snake));
        head->next = tail; // 将链表的尾部给到头。
        head->x = 24 + 2 * i;
        head->y = 5;
        tail = head;  // 将新加的Head 给到尾,这个地方有点绕,建议你调试一下就知道了,我给一个当前的内存图给你看下就明白了。
    }
当前内存状态。
1.jpg

后面的问题,也可以根据这个内存状态看出来了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-11 19:18:34 | 显示全部楼层
上善若水··· 发表于 2020-5-11 18:38
第一个问题:这个地方应该是5个。
   tail = (snake*)malloc(sizeof(snake));
    tail->x = 24;

非常感谢,但是我还有一个问题,就是for循环里面那个 i 的初始值是  1  ,所以头的第一个x的坐标应该是26?(我是那么想的,也许错了)但是那个 24 是从哪里来的??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-11 20:40:42 | 显示全部楼层
卜零凌 发表于 2020-5-11 19:18
非常感谢,但是我还有一个问题,就是for循环里面那个 i 的初始值是  1  ,所以头的第一个x的坐标应该是26 ...

tail里原本有一个节点(24,5),tail=head; 赋值,然后tail那里面原本的节点不会丢掉吗??
调试的时候,看到里面还有原来的(24,5)节点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-11 20:46:55 | 显示全部楼层
head->next = tail;

tail = head;  

因为这两行代码导致了(24,5)这个节点不会掉,当for第一次运行时·· 你想一下,再打断点看下内存就知道了··
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-12 10:31:14 | 显示全部楼层
上善若水··· 发表于 2020-5-11 20:46
head->next = tail;

tail = head;  

突然明白,因为head下一个节点是tail,在第二行赋值的时候,tail还包括head的下一个节点(24,5)吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-12 10:44:48 | 显示全部楼层
是的,第一次时,就有一个copy的过程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-14 02:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表