终于把学的单链表塞进贪吃蛇里的.
相比于上一篇的数组,链表的理解程度可能高一些.
上一篇的链接
上代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define U 0
#define D 1
#define L 2
#define R 3
struct node
{
int x;
int y;
struct node *next;
};
typedef struct node NODE;
NODE *head;
int state,speed=200;
int snake_x=6,snake_y=5;
int food_x,food_y;
int wall_x=1,wall_y=1,wall_x1=97,wall_y1=25;
int gotoxy(int x,int y)
{
COORD coord = {x,y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
int add(NODE *head,int x,int y)
{
NODE *p;
p=(NODE *)malloc(sizeof(NODE));
p->x=x;
p->y=y;
gotoxy(x,y);
printf("█");
p->next=head->next;
head->next=p;
}
int delete(NODE *head)
{
NODE *p,*q;
p=(NODE *)malloc(sizeof(NODE));
for (p=head; p->next!=NULL;p=p->next)
{
q=p;
}
gotoxy(p->x,p->y);
printf(" ");
q->next=NULL;
free(p);
}
int find(NODE *head,int x,int y) //FIND:1 NOT FIND :0
{
NODE *p;
for (p=head; p!=NULL; p=p->next)
{
if (p->x==x && p->y==y)
{
return 1;
}
}
return 0;
}
int border(int x,int y)
{
//查询物体是否撞到蛇身
if (find(head,x,y)==1)
{
return 1;
}
//查询物体是否撞到墙
if (wall_x>=x || wall_x1<=x || wall_y>=y || wall_y1<=y)
{
return 1;
}
return 0;
}
int food_make()
{
//初始化随机种子
srand((unsigned int)time(NULL));
int x,y;
x=food_x;
y=food_y;
while (1)
{
//随机食物坐标
food_x=rand()%wall_x1+wall_x;
food_y=rand()%wall_y1+wall_y;
//查询食物是否生成位置错误
if (food_x%2 ==1)
{
continue;
}
if (food_x==x && food_y==y)
{
continue;
}
if (border(food_x,food_y)==1)
{
continue;
}
//打印食物
gotoxy(food_x,food_y);
printf("⊕");
gotoxy(0,29);
return 1;
}
return 0;
}
int eat()
{
if (snake_x==food_x && snake_y==food_y)
{
food_make();
return 1;
}
return 0;
}
int control()
{
state = D;
gotoxy(snake_x,snake_y);
printf(" ");
while(1)
{
if(GetAsyncKeyState(VK_UP) && state!=D)
{
state=U;
}
else if(GetAsyncKeyState(VK_DOWN) && state!=U)
{
state=D;
}
else if(GetAsyncKeyState(VK_LEFT)&& state!=R)
{
state=L;
}
else if(GetAsyncKeyState(VK_RIGHT)&& state!=L)
{
state=R;
}
else if(GetAsyncKeyState(VK_F1))
{
if (speed<=20)
{
speed=10;
}
else
{
speed=speed-10;
}
}
else if(GetAsyncKeyState(VK_F2))
{
speed=speed+10;
}
snake_move();
if (eat()==0)
{
delete(head);
}
}
}
int snake_move()
{
if (state == U)
{
--snake_y;
add(head,snake_x,snake_y);
gotoxy(10,29);
printf("Speed:%4d",speed);
}
if (state == D)
{
++snake_y;
add(head,snake_x,snake_y);
gotoxy(10,29);
printf("Speed:%4d",speed);
}
if (state == L)
{
--snake_x;
--snake_x;
add(head,snake_x,snake_y);
gotoxy(10,29);
printf("Speed:%4d",speed);
}
if (state == R)
{
++snake_x;
++snake_x;
add(head,snake_x,snake_y);
gotoxy(10,29);
printf("Speed:%4d",speed);
}
Sleep(speed);
}
int main()
{
head=(NODE *)malloc(sizeof(NODE));
head->x=NULL;
head->y=NULL;
head->next=NULL;
food_make();
control();
system("PAUSE");
return 0;
}
在这里因为大部分的代码是和上一篇同样的道理,所以有些无关紧要的就没写了
(第1次更改)
来源:oschina
链接:https://my.oschina.net/u/4332520/blog/4267286