卜零凌 发表于 2020-5-11 18:14:33

单链表,贪吃蛇求助

刚开始看贪吃蛇的代码,感觉好多不懂的。然后,在看到开始,也就是这一部分,卡住了,单链表的问题,问题用/* */括起来了,在注释里面,灰常感谢!!

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

#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 给到尾,这个地方有点绕,建议你调试一下就知道了,我给一个当前的内存图给你看下就明白了。
    }
当前内存状态。


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

卜零凌 发表于 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 是从哪里来的??

卜零凌 发表于 2020-5-11 20:40:42

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

tail里原本有一个节点(24,5),tail=head; 赋值,然后tail那里面原本的节点不会丢掉吗??
调试的时候,看到里面还有原来的(24,5)节点

上善若水··· 发表于 2020-5-11 20:46:55

head->next = tail;

tail = head;

因为这两行代码导致了(24,5)这个节点不会掉,当for第一次运行时·· 你想一下,再打断点看下内存就知道了··

卜零凌 发表于 2020-5-12 10:31:14

上善若水··· 发表于 2020-5-11 20:46
head->next = tail;

tail = head;


突然明白,因为head下一个节点是tail,在第二行赋值的时候,tail还包括head的下一个节点(24,5)吧。

上善若水··· 发表于 2020-5-12 10:44:48

是的,第一次时,就有一个copy的过程。
页: [1]
查看完整版本: 单链表,贪吃蛇求助