单链表实现贪吃蛇
Posted your-path
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单链表实现贪吃蛇相关的知识,希望对你有一定的参考价值。
终于把学的单链表塞进贪吃蛇里的.
相比于上一篇的数组,链表的理解程度可能高一些.
上一篇的链接
上代码:
#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次更改)
以上是关于单链表实现贪吃蛇的主要内容,如果未能解决你的问题,请参考以下文章
代码解析双向链表实现贪吃蛇游戏!简单易学,开发自己第一个游戏!