C语言链表实现贪吃蛇小游戏

Githa ·
更新时间:2024-09-20
· 1341 次阅读

本文实例为大家分享了C语言链表实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下

项目名称:

贪吃蛇小游戏

运行环境:

Linux

编程语言:

C语言

主要语法:

链表,指针,函数

备注:

游戏中可选不同难度模式,

1.简易——Easy——速度慢,可穿墙,可触碰自己
2.困难——Hard——速度快,不可穿墙,不可触碰自己
3.自动——Auto——外挂模式,自动吃食,直到胜利

代码

贪吃蛇小游戏代码:

#include <curses.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <stdio.h> #define UP 1 #define DOWN -1 #define LEFT 2 #define RIGHT -2 struct Snake //define the snake { int hang; int lie; struct Snake *next; }; struct Snake food; //define the food struct Snake *head= NULL; struct Snake *tail = NULL; int key; int dir; int set = 49; int nub = 4; void initFood() //init food { int x = rand()%20; int y = (rand()%19)+1; food.hang = x; food.lie = y; } void initNcurse() //init ncurse { initscr(); keypad(stdscr,1); noecho(); } int hasFood(int i,int j) //judge whether shoule show the food { if(food.hang == i && food.lie == j) { return 1; } return 0; } int hasSnakeNode(int i, int j) //judge whether shoule show the snake { struct Snake *p; p = head; while(p != NULL) { if(p->hang == i && p->lie == j) { return 1; } p = p->next; } return 0; } void gamePic() //show the whole picture { int hang; int lie; move(0,0); for(hang=0;hang<20;hang++) //20*20 size map { 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 if(hasFood(hang,lie)) { printw("##"); } else printw(" "); } printw("\n"); } if(hang == 19) { for(lie=0;lie<20;lie++) { printw("--"); } printw("\n"); } } printw("by HaoQing, Happy Game!\n"); switch(dir) { case UP: printw("Snake UP! \n"); break; case DOWN: printw("Snake DOWN! \n"); break; case LEFT: printw("Snake LEFT! \n"); break; case RIGHT: printw("Snake RIGHT!\n"); break; } if(nub >= 380) { printw("------------------------------------\n"); printw("==============YOU WIN!==============\n"); printw("------------------------------------\n"); } } void addNode() //add the node of snake { struct Snake *new = (struct Snake *)malloc(sizeof(struct Snake)); new->next = NULL; switch(dir) { case UP: new->hang = tail->hang-1; new->lie = tail->lie; break; case DOWN: new->hang = tail->hang+1; new->lie = tail->lie; break; case LEFT: new->hang = tail->hang; new->lie = tail->lie-1; break; case RIGHT: new->hang = tail->hang; new->lie = tail->lie+1; break; } tail->next = new; tail = new; } void initSnake() //init snake { struct Snake *p; dir = RIGHT; while(head != NULL) { p = head; head = head->next; free(p); } initFood(); head = (struct Snake *)malloc(sizeof(struct Snake)); head->hang = 1; head->lie = 1; head->next = NULL; tail = head; addNode(); addNode(); addNode(); } void deleNode() //delete the node of snake { struct Snake *p; p = head; head = head->next; free(p); } int ifSnakeDie() //judge whether the snake is die { struct Snake *p; p = head; if(tail->hang < 0 || tail->lie == 0 || tail->hang == 20 || tail->lie == 20) { return 1; } while(p->next != NULL) { if(p->hang == tail->hang && p->lie == tail->lie) return 1; p=p->next; } return 0; } void moveSnake() //move the snake { addNode(); if(hasFood(tail->hang,tail->lie)) { initFood(); nub++; //judge whether win } else deleNode(); if(set != 49 && set != 50 && set != 53) { if(ifSnakeDie()) initSnake(); } } void refreshJieMian() //refresh the picture { while(1) { moveSnake(); gamePic(); refresh(); switch(set) { case 49: usleep(200000); break; case 50: usleep(100000); break; case 51: usleep(100000); break; case 52: usleep(80000); break; case 53: usleep(70000); break; default: usleep(150000); } } } void turn(int direction) //prevent reverse { if(set != 49 && set != 50 && set != 53) { if(abs(dir) != abs(direction)) { dir = direction; } } else dir = direction; } void changeDir() //change direction { while(1) { if(set != 53) { key = getch(); switch(key) { case KEY_DOWN: turn(DOWN); //-1 break; case KEY_UP: turn(UP); //1 break; case KEY_LEFT: turn(LEFT); //2 break; case KEY_RIGHT: turn(RIGHT); //-2 break; } } else { if(tail->hang > food.hang) turn(UP); else if(tail->hang < food.hang) turn(DOWN); if(tail->lie > food.lie) turn(LEFT); else if(tail->lie < food.lie) turn(RIGHT); } } } int main() { initNcurse(); printw("======Welcome To Snake Eating!======\n"); printw("------------------------------------\n"); printw("Please select difficulty level:\n"); printw("\n"); printw(" Fool,please enter \"1\"\n"); printw(" Simple,please enter \"2\"\n"); printw(" Hard,please enter \"3\"\n"); printw(" Hell,please enter \"4\"\n"); printw(" Auto,please enter \"5\"\n"); printw("------------------------------------\n"); printw("You want:"); set = getch(); pthread_t t1; pthread_t t2; initSnake(); gamePic(); pthread_create(&t1,NULL,(void *)refreshJieMian,NULL); pthread_create(&t2,NULL,(void *)changeDir,NULL); while(1); endwin(); return 0; }



小游戏 链表 C语言 贪吃蛇

需要 登录 后方可回复, 如果你还没有账号请 注册新账号