前言
上节显示了贪吃蛇身子的三个节点,但是吃了食物后蛇身变长应该如何操作,本节给出答案。
一、贪吃蛇身体是什么?
使用链表这个数据结构来动态的显示贪吃蛇的身体。
二、对贪吃蛇身体进行改进
1.贪吃蛇身子显示
代码如下:
#include <curses.h>
struct Snake
{
int hang;
int lie;
struct Snake * next;
};
struct Snake node1 = {2,2,NULL};
struct Snake node2 = {2,3,NULL};
struct Snake node3 = {2,4,NULL};
void initNcurse()
{
initscr();
keypad(stdscr,1);
}
int hasSnakeNode(int i,int j)
{
struct Snake * p;
p = &node1;
while(p != NULL)
{
if(p->hang == i && p->lie == j)
{
return 1;
}
p = p -> next;
}
return 0;
}
void gamePic()
{
int hang;
int lie;
for(hang = 0;hang < 20;hang ++)
{
if(hang == 0)
{
for(lie = 0;lie < 20;lie ++)
{
printw("--");
}
printw("\n");
}
if(hang >= 0 && hang <= 19)
{
for(lie = 0;lie <= 20;lie ++)
{
if(lie == 0 || lie == 20) printw("|");
else if(hasSnakeNode(hang,lie)) printw("[]");
else printw(" ");
}
printw("\n");
}
if(hang == 19)
{
for(lie = 0;lie < 20;lie ++)
{
printw("--");
}
printw("\n");
printw("by beiweiqiuAC");
}
}
}
int main()
{
initNcurse();
node1.next = &node2;
node2.next = &node3;
gamePic();
getch();//防止程序退出
endwin();
return 0;
}
2.链表动态添加蛇的节点
我们改善上面的代码,删去
struct Snake node1 = {2,2,NULL};
struct Snake node2 = {2,3,NULL};
struct Snake node3 = {2,4,NULL};
删去示范作用的贪吃蛇身体节点,改用封装函数的方式来初始化蛇身。
void addNode()
{
struct Snake * new = (struct Snake *)malloc(sizeof(struct Snake));
new->hang = head->hang;
new->lie = head->lie+1;
new->next = NULL;
tail->next = new;
}
void initSnake(){
head = (struct Snake *)malloc(sizeof(struct Snake));
head->hang = 2;
head->lie = 2;
head->next = NULL;
tail = head;
addNode();
}
两个函数initSnake()用来初始化蛇身,addnode()用来增加蛇的身体节点。
但是这样操作有点问题,比如第二个节点是在head的基础上操作,那第三个也能在head上进行操作吗,很明显是不行的,所以我们选择在尾巴上做操作。
运行结果:
总结
我们对上节的代码进行了改进,通过封装函数,现在可以动态的显示贪吃蛇的身体了。