c 小游戏编程代码,c 小游戏编程代码怎么写
用C语言编写简单小游戏:从零开始的贪吃蛇游戏编程指南
引言:为什么用C语言编写小游戏?
C语言作为一门经典的编程语言,以其高效、灵活和接近硬件的特点,一直是游戏开发领域的基础语言之一,对于初学者来说,通过编写简单的小游戏,不仅能巩固编程基础,还能培养问题解决能力和逻辑思维,本文将带你从零开始,使用C语言编写一个经典的贪吃蛇游戏,并解析其中的关键代码。

贪吃蛇游戏的实现步骤
环境准备
在开始编写代码前,确保你已安装了C语言编译器(如GCC),如果你使用的是Windows系统,可以安装MinGW;如果是Linux或MacOS用户,系统通常自带GCC编译器。

游戏设计思路
贪吃蛇游戏的核心逻辑包括:
- 游戏区域(通常是一个二维网格)
- 蛇的移动(通过键盘方向键控制)
- 食物的生成
- 碰撞检测(蛇与食物、蛇与边界、蛇与自身)
- 分数计算
代码实现
以下是贪吃蛇游戏的完整代码,附带详细注释:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h> // 用于控制延时和获取键盘输入
#define WIDTH 20 // 游戏区域宽度
#define HEIGHT 20 // 游戏区域高度
#define SNAKE_SIZE 10 // 蛇的初始长度
// 定义蛇和食物的结构体
typedef struct {
int x;
int y;
} Position;
typedef struct {
Position body[SNAKE_SIZE * 2]; // 蛇的每一节身体坐标
int length; // 蛇的当前长度
int direction; // 蛇的移动方向:0-上,1-右,2-下,3-左
} Snake;
Position food; // 食物位置
// 初始化游戏
void initGame(Snake *snake) {
snake->length = 3; // 初始长度为3
snake->direction = 2; // 初始方向向下
// 初始化蛇的位置
snake->body[0].x = WIDTH / 2;
snake->body[0].y = HEIGHT / 2;
snake->body[1].x = WIDTH / 2 - 1;
snake->body[1].y = HEIGHT / 2;
snake->body[2].x = WIDTH / 2 - 2;
snake->body[2].y = HEIGHT / 2;
// 随机生成食物
srand(time(NULL));
food.x = rand() % WIDTH;
food.y = rand() % HEIGHT;
}
// 绘制游戏区域
void drawGame(Snake *snake) {
system("cls"); // 清屏(Windows系统使用cls,Linux使用clear)
// 绘制游戏区域边界
printf("Score: %d\n", snake->length - 3); // 显示分数
for (int y = 0; y < HEIGHT; y++) {
for (int x = 0; x < WIDTH; x++) {
if (x == 0 || y == 0 || x == WIDTH - 1 || y == HEIGHT - 1) {
printf("#"); // 边界
} else {
int isSnake = 0;
for (int i = 0; i < snake->length; i++) {
if (snake->body[i].x == x && snake->body[i].y == y) {
isSnake = 1;
break;
}
}
if (isSnake) {
printf("*"); // 蛇的身体
} else if (x == food.x && y == food.y) {
printf("$"); // 食物
} else {
printf(" ");
}
}
}
printf("\n");
}
}
// 更新蛇的位置
void updateSnake(Snake *snake) {
// 计算新的头部位置
Position newHead;
switch (snake->direction) {
case 0: // 上
newHead.x = snake->body[0].x;
newHead.y = snake->body[0].y - 1;
break;
case 1: // 右
newHead.x = snake->body[0].x + 1;
newHead.y = snake->body[0].y;
break;
case 2: // 下
newHead.x = snake->body[0].x;
newHead.y = snake->body[0].y + 1;
break;
case 3: // 左
newHead.x = snake->body[0].x - 1;
newHead.y = snake->body[0].y;
break;
}
// 检查是否吃到食物
if (newHead.x == food.x && newHead.y == food.y) {
// 吃到食物,蛇变长
snake->length++;
// 生成新的食物
food.x = rand() % WIDTH;
food.y = rand() % HEIGHT;
} else {
// 没吃到食物,移除尾部
for (int i = snake->length - 1; i > 0; i--) {
snake->body[i] = snake->body[i - 1];
}
}
// 将新头部插入蛇身体数组
for (int i = snake->length - 1; i >= 1; i--) {
snake->body[i] = snake->body[i - 1];
}
snake->body[0] = newHead;
// 检查碰撞
if (newHead.x < 0 || newHead.x >= WIDTH || newHead.y < 0 || newHead.y >= HEIGHT) {
printf("Game Over! Final Score: %d", snake->length - 3);
exit(0);
}
for (int i = 1; i < snake->length; i++) {
if (newHead.x == snake->body[i].x && newHead.y == snake->body[i].y) {
printf("Game Over! Final Score: %d", snake->length - 3);
exit(0);
}
}
}
// 获取键盘输入
void getDirection(Snake *snake, int *key) {
*key = 0;
while (*key == 0) {
switch (GetAsyncKeyState(77)) { // 右箭头键
case -16777216:
*key = 1;
break;
}
switch (GetAsyncKeyState(75)) { // 左箭头键
case -16777216:
*key = 3;
break;
}
switch (GetAsyncKeyState(73)) { // 上箭头键
case -16777216:
*key = 0;
break;
}
switch (GetAsyncKeyState(80)) { // 下箭头键
case -16777216:
*key = 2;
break;
}
Sleep(10); // 延时,避免键盘扫描冲突
}
// 防止蛇直接反向移动
if (*key == 0 && snake->direction == 2) return;
if (*key == 1 && snake->direction == 3) return;
if (*key == 2 && snake->direction == 0) return;
if (*key == 3 && snake->direction == 1) return;
snake->direction = *key;
}
// 主函数
int main() {
Snake snake;
initGame(&snake);
while (1) {
drawGame(&snake);
int key;
getDirection(&snake, &key);
updateSnake(&snake);
Sleep(100); // 控制游戏速度
}
return 0;
}
代码解析
- 结构体定义:
Position和Snake结构体用于存储游戏中的位置信息。 - 初始化函数:
initGame设置蛇的初始位置、长度和方向,并随机生成食物。 - 绘制函数:
drawGame使用字符在控制台绘制游戏区域,包括蛇、食物和边界。 - 更新函数:
updateSnake根据方向移动蛇,并检查是否吃到食物或发生碰撞。 - 键盘输入:
getDirection使用Windows API获取键盘输入,并防止蛇直接反向移动。
编译与运行
将上述代码保存为snake.c,然后使用以下命令编译并运行:
gcc snake.c -o snake.exe
snake.exe
扩展与优化
- 图形界面:可以使用SDL或OpenGL库将游戏升级为图形界面。
- 难度调整:通过调整游戏速度和蛇的移动步长来增加难度。
- 多人模式:扩展代码以支持双人对战模式。

相关文章:
文章已关闭评论!