单链表,贪吃蛇求助
刚开始看贪吃蛇的代码,感觉好多不懂的。然后,在看到开始,也就是这一部分,卡住了,单链表的问题,问题用/* */括起来了,在注释里面,灰常感谢!!这里只是一部分贪吃蛇的代码,
#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;
} 第一个问题:这个地方应该是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 18:38
第一个问题:这个地方应该是5个。
tail = (snake*)malloc(sizeof(snake));
tail->x = 24;
非常感谢,但是我还有一个问题,就是for循环里面那个 i 的初始值是1,所以头的第一个x的坐标应该是26?(我是那么想的,也许错了)但是那个 24 是从哪里来的?? 卜零凌 发表于 2020-5-11 19:18
非常感谢,但是我还有一个问题,就是for循环里面那个 i 的初始值是1,所以头的第一个x的坐标应该是26 ...
tail里原本有一个节点(24,5),tail=head; 赋值,然后tail那里面原本的节点不会丢掉吗??
调试的时候,看到里面还有原来的(24,5)节点 head->next = tail;
tail = head;
因为这两行代码导致了(24,5)这个节点不会掉,当for第一次运行时·· 你想一下,再打断点看下内存就知道了·· 上善若水··· 发表于 2020-5-11 20:46
head->next = tail;
tail = head;
突然明白,因为head下一个节点是tail,在第二行赋值的时候,tail还包括head的下一个节点(24,5)吧。 是的,第一次时,就有一个copy的过程。
页:
[1]