
张老师为您分享以下优质知识
在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`初始化蛇的位置和分数