在C语言中实现贪吃蛇游戏并显示分数,通常需要以下几个步骤:
分数变量管理
使用一个整型变量(如`score`)来记录当前分数。每当蛇吃到食物时,分数加1。
分数显示函数
编写一个函数(如`showScore`)来在游戏界面中显示当前分数。可以使用控制台输出或图形界面库(如`curses`)实现。
更新显示逻辑
在游戏循环中,每次更新蛇的位置或得分后,调用分数显示函数刷新界面。
以下是一个使用控制台输出的示例代码,结合了链表实现和`curses`库来显示分数:
```c
include include include include include define WIDTH 20 define HEIGHT 20 typedef struct Node { int x, y; struct Node* next; } Node; typedef struct { Node* head; int length; int score; } Snake; void initSnake(Snake* snake) { snake->head = NULL; snake->length = 1; snake->score = 0; } void createFood(Snake* snake) { int x, y; do { x = rand() % WIDTH + 1; y = rand() % HEIGHT + 1; } while (isInside(snake, x, y)); Node* food = (Node*)malloc(sizeof(Node)); food->x = x; food->y = y; food->next = NULL; snake->head = food; } void drawSnake(Snake* snake) { Node* current = snake->head; while (current) { printf("%d ", current->x); current = current->next; } printf("n"); } void showScore(Snake* snake) { printf("Score: %dn", snake->score); } int isInside(Node* snake, int x, int y) { Node* current = snake->head; while (current) { if (current->x == x && current->y == y) return 1; current = current->next; } return 0; } void moveSnake(Snake* snake, int direction) { Node* prev = NULL; Node* current = snake->head; Node* newHead = NULL; switch (direction) { case UP: newHead = current->prev; break; case DOWN: newHead = current->next; break; case LEFT: newHead = current->prev->prev; break; case RIGHT: newHead = current->next->next; break; default: return; } if (newHead == NULL) return; newHead->prev = (prev == NULL) ? NULL : prev; newHead->next = current; current->prev = newHead; if (current->x == food->x && current->y == food->y) { snake->score++; createFood(snake); } else { Node* toDelete = current; current = current->next; if (prev) prev->next = current; free(toDelete); snake->length--; } if (snake->length == 1) { free(snake->head); snake->head = NULL; snake->length = 0; } } int main() { srand(time(NULL)); Snake snake; initSnake(&snake); createFood(&snake); int direction = RIGHT; int gameOver = 0; while (!gameOver) { system("cls"); drawSnake(&snake); showScore(&snake); printf("Use WASD to moven"); int key = _getch(); switch (key) { case 'w': direction = UP; break; case 's': direction = DOWN; break; case 'a': direction = LEFT; break; case 'd': direction = RIGHT; break; default: continue; } if (isInside(snake, snake.head->x, snake.head->y)) { gameOver = 1; } moveSnake(&snake, direction); } printf("Game Over! Final Score: %dn", snake.score); return 0; } ``` 代码说明: 数据结构 - 使用链表存储蛇的身体节点,每个节点包含坐标和指向下一个节点的指针。 - `Snake`结构体包含链表头指针、长度和分数。 核心函数 - `initSnake`初始化蛇的位置和分数