单链表实现贪吃蛇
程序员文章站
2022-07-09 18:57:59
终于把学的单链表塞进贪吃蛇里的. 相比于上一篇的数组,链表的理解程度可能高一些. 上一篇的链接 上代码: #include #include #include #include #include ......
终于把学的单链表塞进贪吃蛇里的.
相比于上一篇的数组,链表的理解程度可能高一些.
上一篇的
上代码:
#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次更改)
上一篇: CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
下一篇: Redis主从复制