C语言贪吃蛇游戏代码示例
C语言贪吃蛇游戏代码示例
想学习如何用 C 语言编写经典的贪吃蛇游戏吗?以下是一个简单的代码示例,可以帮助你入门:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
// 定义游戏区域大小
#define WIDTH 20
#define HEIGHT 20
// 定义蛇的最大长度
#define MAX_LENGTH WIDTH*HEIGHT
// 定义蛇的方向
enum Direction { UP, DOWN, LEFT, RIGHT };
// 定义蛇的结构体
struct Snake {
int x, y;
};
// 定义食物的结构体
struct Food {
int x, y;
int isEaten;
};
// 全局变量
int gameover;
int score;
enum Direction dir;
struct Snake snake[MAX_LENGTH];
struct Food food;
// 函数声明
void gotoxy(int x, int y);
void initGame();
void drawGame();
void updateGame();
void getInput();
int main() {
initGame();
while (!gameover) {
drawGame();
getInput();
updateGame();
Sleep(100); // 控制游戏速度,单位为毫秒
}
system('cls');
printf('游戏结束!得分: %d\n', score);
return 0;
}
// 设置控制台光标位置
void gotoxy(int x, int y) {
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
// 初始化游戏
void initGame() {
gameover = 0;
score = 0;
dir = RIGHT;
// 初始化蛇头位置
snake[0].x = WIDTH / 2;
snake[0].y = HEIGHT / 2;
// 初始化蛇身为一个点
for (int i = 1; i < MAX_LENGTH; i++) {
snake[i].x = 0;
snake[i].y = 0;
}
// 初始化食物位置
food.x = rand() % WIDTH;
food.y = rand() % HEIGHT;
food.isEaten = 0;
}
// 绘制游戏界面
void drawGame() {
system('cls');
// 绘制上边界
for (int i = 0; i < WIDTH + 2; i++)
printf('#');
printf('\n');
// 绘制游戏区域
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
if (j == 0)
printf('#'); // 绘制左边界
if (i == snake[0].y && j == snake[0].x) {
printf('O'); // 绘制蛇头
} else if (i == food.y && j == food.x && !food.isEaten) {
printf('@'); // 绘制食物
} else {
int isBodyPart = 0;
for (int k = 1; k < MAX_LENGTH; k++) {
if (i == snake[k].y && j == snake[k].x) {
printf('*'); // 绘制蛇身
isBodyPart = 1;
}
}
if (!isBodyPart)
printf(' ');
}
if (j == WIDTH - 1)
printf('#'); // 绘制右边界
}
printf('\n');
}
// 绘制下边界
for (int i = 0; i < WIDTH + 2; i++)
printf('#');
printf('\n');
printf('得分: %d\n', score);
}
// 更新游戏状态
void updateGame() {
// 更新蛇身位置
for (int i = MAX_LENGTH - 1; i > 0; i--) {
snake[i] = snake[i - 1];
}
// 根据方向更新蛇头位置
switch (dir) {
case UP:
snake[0].y--;
break;
case DOWN:
snake[0].y++;
break;
case LEFT:
snake[0].x--;
break;
case RIGHT:
snake[0].x++;
break;
}
// 检查碰撞
if (snake[0].x < 0 || snake[0].x >= WIDTH || snake[0].y < 0 || snake[0].y >= HEIGHT)
gameover = 1;
for (int i = 1; i < MAX_LENGTH; i++) {
if (snake[0].x == snake[i].x && snake[0].y == snake[i].y)
gameover = 1;
}
// 蛇吃到食物
if (snake[0].x == food.x && snake[0].y == food.y) {
score++;
food.isEaten = 1;
// 随机生成新的食物位置
while (food.isEaten) {
food.x = rand() % WIDTH;
food.y = rand() % HEIGHT;
food.isEaten = 0;
// 确保新食物不在蛇身上
for (int i = 0; i < MAX_LENGTH; i++) {
if (snake[i].x == food.x && snake[i].y == food.y)
food.isEaten = 1;
}
}
}
}
// 获取用户输入
void getInput() {
if (_kbhit()) {
switch (_getch()) {
case 'w':
if (dir != DOWN)
dir = UP;
break;
case 's':
if (dir != UP)
dir = DOWN;
break;
case 'a':
if (dir != RIGHT)
dir = LEFT;
break;
case 'd':
if (dir != LEFT)
dir = RIGHT;
break;
case 'q':
gameover = 1;
break;
}
}
}
代码说明:
- 该代码使用
#include语句引入了必要的头文件,如stdio.h、conio.h、stdlib.h和windows.h。 - 定义了游戏区域大小、蛇的最大长度、蛇的方向、蛇的结构体、食物的结构体以及一些全局变量。
- 声明了函数
gotoxy、initGame、drawGame、updateGame和getInput。 main函数是程序的入口点,它初始化游戏并进入游戏循环。gotoxy函数用于设置控制台光标位置。initGame函数用于初始化游戏状态,包括蛇的位置、食物的位置和游戏得分等。drawGame函数用于绘制游戏界面,包括游戏区域、蛇和食物。updateGame函数用于更新游戏状态,包括蛇的移动、碰撞检测和食物的生成等。getInput函数用于获取用户的键盘输入,并根据输入更新蛇的移动方向。
注意:
- 此示例代码仅包含基本的贪吃蛇游戏逻辑,可以在此基础上进行扩展和改进。
- 该代码使用了 Windows 平台特有的头文件和函数,如果在其他平台上运行,需要进行相应的修改。
希望这段代码可以帮助你编写自己的贪吃蛇游戏!
原文地址: https://www.cveoy.top/t/topic/cizz 著作权归作者所有。请勿转载和采集!