400字范文,内容丰富有趣,生活中的好帮手!
400字范文 > C语言游戏之贪吃蛇--链表实现

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

时间:2023-06-03 13:11:15

相关推荐

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

早自习时突然想到怎么写贪吃蛇,话不多说,代码如下:

开发环境:vs

虽然开始还是出了很多指针问题。。。(很烦C语言指针)调试了很久也大概是可以畅快的玩了。

C语言新手,有很多写得不好的地方望大神提出

当然,我也不介意把我代码拿去学习(这样就说明我的代码有学习价值)

头文件:snake.h

/***By Liu Yuchuan*.3.30*/#ifndef SNAKE_H_INCLUDED#define SNAKE_H_INCLUDED#include<stdio.h>//游戏中各种符号#define CHOOSE_LOGO "->"#define SNAKE_NODE '*'#define WALL '#'#define FOOD '$'//地图大小#define mapWidth 50#define mapHeight 25//蛇状态#define LIVE 1#define DEAD 0//移动方向enum Direction{UP, DOWN, RIGHT, LEFT};typedef enum Direction Direction;struct Node;typedef struct Node Node;typedef Node* SnakeHead;typedef Node* PtrToNode;//蛇的链表节点struct Node{int x;int y;PtrToNode next;};//蛇的结构体typedef struct Snake{SnakeHead snakeHead;int lenth;int state;Direction dir;} *Snake;//食物的结构体typedef struct Food {int x;int y;int isEat;} *Food;//移动键char key_down = 's';char key_up = 'w';char key_right = 'd';char key_left = 'a';//移动间隔时间int moveTime = 100;//得分int score = 0;Food food = NULL;Snake snake = NULL;void menu();void pos(int x, int y);void startGame();void initMap();Snake initSnake(Snake snake);void printSnake(Snake snake);void clearSnake(Snake snake);void move(Snake snake);Snake getLonger(Snake snake);void createFood();int isLocationOK(int x, int y);#endif // SNAKE_H_INCLUDED

源码:Snake.c

#include"Snake.h"#include<windows.h>#include<stdlib.h>#include<conio.h>#include<time.h>int main(){menu:menu();system("cls");startGame();goto menu;}void menu(){pos(18, 2);printf("欢迎来到贪吃蛇!");//打印菜单pos(18, 6);printf("%s", CHOOSE_LOGO);printf("开始游戏");pos(20, 10);printf("退出游戏");//控制菜单int option = 0;char ch = 1;//键入回车退出循环while(1){ch = _getch();//下移if(ch == key_down){if(option == 0){pos(18, 6+option);printf(" ");option += 4;pos(18, 6+option);printf("%s", CHOOSE_LOGO);}}//上移else if(ch == key_up){if(option == 4){pos(18, 6+option);printf(" ");option -= 4;pos(18, 6+option);printf("%s", CHOOSE_LOGO);}}else if(ch == 13){switch(option){case 0:return;case 4:exit(0);}}}}//定位光标void pos(int x, int y){COORD position;position.X = x;position.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);}void startGame(){char ch = 1;score = 0;snake = initSnake(snake);initMap();food = (Food)malloc(sizeof(struct Food));food->x = 0;food->y = 0;food->isEat = 1;printSnake(snake);while (snake->state){createFood(food);//监听键盘输入if (_kbhit()) {ch = _getch();if (snake->dir != UP && ch == key_down) {snake->dir = DOWN;}else if (snake->dir != DOWN && ch == key_up) {snake->dir = UP;}else if (snake->dir != LEFT && ch == key_right) {snake->dir = RIGHT;}else if (snake->dir != RIGHT && ch == key_left) {snake->dir = LEFT;}}move(snake);}pos(mapWidth + 2, mapHeight / 2 - 1);printf(" ");pos(mapWidth + 2, mapHeight / 2);printf(" ");pos(mapWidth + 2, mapHeight / 2 + 1);printf(" ");pos(mapWidth + 2, mapHeight / 2 + 2);printf(" ");pos(mapWidth + 2, mapHeight / 2 - 1);printf("游戏结束");pos(mapWidth + 2, mapHeight / 2);printf("最终长度: %d", snake->lenth);pos(mapWidth + 2, mapHeight / 2 + 1);printf("您的得分: %d", score);pos(mapWidth + 2, mapHeight / 2 + 2);printf("Enter键返回主菜单");while(ch != 13)ch = _getch();system("cls");}void initMap(){for(int i = 0; i < mapWidth; i++){for(int j = 0; j < mapHeight; j++){if(i == 0 || j == 0 || i == mapWidth - 1 || j == mapHeight - 1){pos(i, j);printf("%c", WALL);}}}pos(mapWidth + 2, mapHeight/2 - 1);printf("当前长度(越长吃一次食物得分越高哦):");pos(mapWidth + 2, mapHeight/2);printf("%d", snake->lenth);pos(mapWidth + 2, mapHeight / 2 + 1);printf("当前得分:");pos(mapWidth + 2, mapHeight / 2+2);printf("%d", score);}Snake initSnake(Snake snake){snake = (Snake)malloc(sizeof(struct Snake));snake->snakeHead = (SnakeHead)malloc(sizeof(Node));SnakeHead snakeHead = snake->snakeHead;snakeHead->x = 4;snakeHead->y = 3;snakeHead->next = (PtrToNode)malloc(sizeof(Node));snakeHead->next->x = 4;snakeHead->next->y = 2;snakeHead->next->next = (PtrToNode)malloc(sizeof(Node));snakeHead->next->next->x = 4;snakeHead->next->next->y = 1;snakeHead->next->next->next = NULL;snake->lenth = 3;snake->dir = DOWN;snake->state = LIVE;return snake;}void printSnake(Snake snake) {PtrToNode position = snake->snakeHead;while (position) {pos(position->x, position->y);printf("%c", SNAKE_NODE);position = position->next;}}void clearSnake(Snake snake){PtrToNode position = snake->snakeHead;while (position) {pos(position->x, position->y);printf(" ");position = position->next;}}void move(Snake snake) {//判断是否会撞墙if ((snake->snakeHead->x == mapWidth - 2 && snake->dir == RIGHT)|| snake->snakeHead->x == 1 && snake->dir == LEFT|| snake->snakeHead->y == 1 && snake->dir == UP|| snake->snakeHead->y == mapHeight - 2 && snake->dir == DOWN) {snake->state = DEAD;return;}clearSnake(snake);SnakeHead head = snake->snakeHead;int x = head->x;int y = head->y;int tmpX, tmpY;switch (snake->dir) {case UP:head->y--;break;case DOWN:head->y++;break;case LEFT:head->x--;break;case RIGHT:head->x++;break;default:break;}while (head->next) {tmpX = head->next->x;tmpY = head->next->y;head->next->x = x;head->next->y = y;x = tmpX;y = tmpY;head = head->next;//判断是否咬到自己if (head->x == snake->snakeHead->x&& head->y == snake->snakeHead->y)snake->state = DEAD;}if (snake->snakeHead->x == food->x&& snake->snakeHead->y == food->y && snake->state) {score += snake->lenth / 10 + 1;food->isEat = 1;pos(food->x, food->y);printf(" ");snake = getLonger(snake);pos(mapWidth + 2, mapHeight / 2 + 2);printf("%d", score);pos(mapWidth + 2, mapHeight / 2 );printf("%d", snake->lenth);}printSnake(snake);Sleep(moveTime);}Snake getLonger(Snake snake){PtrToNode position = snake->snakeHead;while (position->next->next) {position = position->next;}int x1 = position->x;int y1 = position->y;position = position->next;int x2 = position->x;int y2 = position->y;position->next = (PtrToNode)malloc(sizeof(Node));position->next->next = NULL;if (x1 == x2) {position->next->x = x1;position->next->y = y2 + y2 - y1;}else{position->next->y = y1;position->next->x = x2 + x2 - x1;}snake->lenth++;return snake;}//生成食物void createFood(){if (food->isEat) {//获取系统时间作为产生随机数的种子srand((unsigned)time(0));while (1) {food->x = rand() % (mapWidth - 2) + 1;food->y = rand() % (mapHeight - 2) + 1;if (isLocationOK(food->x, food->y)) {pos(food->x, food->y);printf("%c", FOOD);food->isEat = 0;break;}}}}//判断位置是否合理int isLocationOK(int x, int y){PtrToNode position = snake->snakeHead;while (position) {if (x == position->x && y == position->y) {position = position->next;return 0;}}return x > 0 && x < mapWidth - 1&& y > 0 && y < mapHeight - 1;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。