C 语言链表实现贪吃蛇游戏
#include <stdio.h>\n#include <stdlib.h>\n#include <conio.h>\n#include <windows.h>\n\n#define WIDTH 20\n#define HEIGHT 20\n\ntypedef struct Node {\n int x;\n int y;\n struct Node* next;\n} Node;\n\ntypedef struct Snake {\n Node* head;\n Node* tail;\n int length;\n int direction;\n} Snake;\n\ntypedef struct Food {\n int x;\n int y;\n} Food;\n\nenum Direction { UP, DOWN, LEFT, RIGHT };\n\nNode* createNode(int x, int y) {\n Node* node = (Node*)malloc(sizeof(Node));\n node->x = x;\n node->y = y;\n node->next = NULL;\n return node;\n}\n\nvoid initSnake(Snake* snake, int x, int y) {\n Node* node = createNode(x, y);\n snake->head = node;\n snake->tail = node;\n snake->length = 1;\n snake->direction = RIGHT;\n}\n\nvoid moveSnake(Snake* snake) {\n int x = snake->head->x;\n int y = snake->head->y;\n\n switch (snake->direction) {\n case UP:\n y--;\n break;\n case DOWN:\n y++;\n break;\n case LEFT:\n x--;\n break;\n case RIGHT:\n x++;\n break;\n }\n\n Node* node = createNode(x, y);\n node->next = snake->head;\n snake->head = node;\n\n if (snake->length == 1) {\n snake->tail = node;\n } else {\n Node* temp = snake->head;\n while (temp->next != snake->tail) {\n temp = temp->next;\n }\n temp->next = NULL;\n free(snake->tail);\n snake->tail = temp;\n }\n}\n\nvoid changeDirection(Snake* snake, char key) {\n switch (key) {\n case 'w':\n case 'W':\n if (snake->direction != DOWN) {\n snake->direction = UP;\n }\n break;\n case 's':\n case 'S':\n if (snake->direction != UP) {\n snake->direction = DOWN;\n }\n break;\n case 'a':\n case 'A':\n if (snake->direction != RIGHT) {\n snake->direction = LEFT;\n }\n break;\n case 'd':\n case 'D':\n if (snake->direction != LEFT) {\n snake->direction = RIGHT;\n }\n break;\n }\n}\n\nvoid generateFood(Food* food) {\n food->x = rand() % WIDTH;\n food->y = rand() % HEIGHT;\n}\n\nvoid drawSnake(Snake* snake) {\n system("cls");\n for (int i = 0; i < HEIGHT; i++) {\n for (int j = 0; j < WIDTH; j++) {\n if (i == snake->head->y && j == snake->head->x) {\n printf("H");\n } else if (i == snake->tail->y && j == snake->tail->x) {\n printf("T");\n } else {\n printf(" ");\n }\n }\n printf("\n");\n }\n}\n\nvoid drawFood(Food* food) {\n printf("Food: x=%d, y=%d\n", food->x, food->y);\n}\n\nint main() {\n Snake snake;\n Food food;\n char key;\n\n srand((unsigned)time(NULL));\n\n initSnake(&snake, WIDTH / 2, HEIGHT / 2);\n generateFood(&food);\n\n while (1) {\n drawSnake(&snake);\n drawFood(&food);\n\n if (_kbhit()) {\n key = _getch();\n changeDirection(&snake, key);\n }\n\n moveSnake(&snake);\n\n if (snake.head->x == food.x && snake.head->y == food.y) {\n generateFood(&food);\n snake.length++;\n }\n\n Sleep(100);\n }\n\n return 0;\n}
原文地址: https://www.cveoy.top/t/topic/pZIG 著作权归作者所有。请勿转载和采集!