可以用C语言写一个贪吃蛇小游戏吗?代码要详细注释
时间: 2023-05-19 13:00:42 浏览: 273
当然可以!以下是一个简单的贪吃蛇游戏的 C 代码,注释详细:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
// 定义常量
#define WIDTH 20
#define HEIGHT 20
#define SNAKE_LENGTH 100
// 定义全局变量
int score = 0; // 得分
int speed = 100; // 速度
int snake_length = 3; // 蛇的长度
int snake_x[SNAKE_LENGTH], snake_y[SNAKE_LENGTH]; // 蛇的坐标
int food_x, food_y; // 食物的坐标
int direction = 1; // 蛇的方向,1:向右,2:向下,3:向左,4:向上
// 初始化游戏
void init_game() {
// 初始化蛇的位置
snake_x[0] = 2;
snake_y[0] = 2;
snake_x[1] = 1;
snake_y[1] = 2;
snake_x[2] = 0;
snake_y[2] = 2;
// 随机生成食物的位置
srand((unsigned)time(NULL));
food_x = rand() % WIDTH;
food_y = rand() % HEIGHT;
}
// 显示游戏界面
void show_game() {
system("cls"); // 清屏
// 显示边框
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
// 显示游戏区域
for (int i = 0; i < HEIGHT; i++) {
printf("#");
for (int j = 0; j < WIDTH; j++) {
if (i == snake_y[0] && j == snake_x[0]) { // 蛇头
printf("O");
} else if (i == food_y && j == food_x) { // 食物
printf("X");
} else {
int is_body = 0;
for (int k = 1; k < snake_length; k++) {
if (i == snake_y[k] && j == snake_x[k]) { // 蛇身
printf("o");
is_body = 1;
break;
}
}
if (!is_body) {
printf(" ");
}
}
}
printf("#\n");
}
// 显示边框
for (int i = 0; i < WIDTH + 2; i++) {
printf("#");
}
printf("\n");
// 显示得分和速度
printf("Score: %d\n", score);
printf("Speed: %d\n", speed);
}
// 处理键盘输入
void handle_input() {
if (_kbhit()) { // 判断是否有键盘输入
char ch = _getch(); // 获取键盘输入
switch (ch) {
case 'w':
if (direction != 2) { // 防止蛇倒退
direction = 4;
}
break;
case 's':
if (direction != 4) {
direction = 2;
}
break;
case 'a':
if (direction != 1) {
direction = 3;
}
break;
case 'd':
if (direction != 3) {
direction = 1;
}
break;
}
}
}
// 移动蛇
void move_snake() {
// 记录蛇尾的位置
int tail_x = snake_x[snake_length - 1];
int tail_y = snake_y[snake_length - 1];
// 移动蛇的身体
for (int i = snake_length - 1; i > 0; i--) {
snake_x[i] = snake_x[i - 1];
snake_y[i] = snake_y[i - 1];
}
// 移动蛇的头部
switch (direction) {
case 1:
snake_x[0]++;
break;
case 2:
snake_y[0]++;
break;
case 3:
snake_x[0]--;
break;
case 4:
snake_y[0]--;
break;
}
// 判断是否吃到食物
if (snake_x[0] == food_x && snake_y[0] == food_y) {
score += 10; // 得分加10
speed -= 5; // 速度加快
snake_length++; // 蛇的长度加1
food_x = rand() % WIDTH; // 随机生成新的食物位置
food_y = rand() % HEIGHT;
}
// 判断是否撞墙或撞到自己
if (snake_x[0] < 0 || snake_x[0] >= WIDTH || snake_y[0] < 0 || snake_y[0] >= HEIGHT) {
printf("Game Over!\n");
exit(0);
}
for (int i = 1; i < snake_length; i++) {
if (snake_x[0] == snake_x[i] && snake_y[0] == snake_y[i]) {
printf("Game Over!\n");
exit(0);
}
}
// 如果没有吃到食物,则删除蛇尾
snake_x[snake_length - 1] = tail_x;
snake_y[snake_length - 1] = tail_y;
}
int main() {
init_game(); // 初始化游戏
while (1) {
show_game(); // 显示游戏界面
handle_input(); // 处理键盘输入
move_snake(); // 移动蛇
Sleep(speed); // 等待一段时间,控制游戏速度
}
return 0;
}
```
阅读全文