C语言贪吃蛇游戏代码示例 - 简单易懂
#include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h>
// 游戏界面尺寸 #define width 20 #define height 20
// 蛇身结构 typedef struct { int x; int y; } Snake;
// 游戏全局变量 int gameover; int score; int foodX, foodY; // 食物坐标 int dir; // 蛇的移动方向 int tail; int len; Snake snake[width * height];
// 初始化游戏 void init() { gameover = 0; score = 0; dir = 3; // 初始方向向左 tail = 1; len = 3;
// 初始化蛇身
snake[0].x = width / 2;
snake[0].y = height / 2;
// 生成初始食物
foodX = rand() % (width - 2) + 1;
foodY = rand() % (height - 2) + 1;
}
// 绘制游戏界面 void draw() { int i, j; system("cls"); // 清屏
// 绘制上边界
for (i = 0; i < width + 2; i++) {
printf("#");
}
printf("\n");
// 绘制游戏区域
for (j = 0; j < height; j++) {
for (i = 0; i < width; i++) {
if (i == 0 || i == width - 1) {
printf("#");
}
else if (i == snake[0].x && j == snake[0].y) {
printf("O"); // 绘制蛇头
}
else if (i == foodX && j == foodY) {
printf("*"); // 绘制食物
}
else {
int found = 0;
// 绘制蛇身
for (int k = 1; k < len; k++) {
if (snake[k].x == i && snake[k].y == j) {
printf("o");
found = 1;
break;
}
}
if (!found) {
printf(" ");
}
}
}
printf("\n");
}
// 绘制下边界
for (i = 0; i < width + 2; i++) {
printf("#");
}
printf("\n");
printf("Score: %d\n", score);
}
// 处理键盘输入 void input() { if (_kbhit()) { switch (_getch()) { case 'w': dir = 0; // 向上 break; case 's': dir = 1; // 向下 break; case 'a': dir = 2; // 向左 break; case 'd': dir = 3; // 向右 break; case 'x': gameover = 1; // 结束游戏 break; } } }
// 更新游戏状态 void update() { int prevX = snake[0].x; int prevY = snake[0].y; int prev2X, prev2Y; snake[0].x = snake[0].x + (dir == 2 ? -1 : (dir == 3 ? 1 : 0)); // 根据方向移动蛇头 snake[0].y = snake[0].y + (dir == 0 ? -1 : (dir == 1 ? 1 : 0));
// 判断蛇头是否碰到边界或自身
if (snake[0].x < 1 || snake[0].x >= width - 1 || snake[0].y < 1 || snake[0].y >= height - 1) {
gameover = 1;
return;
}
for (int i = 1; i < len; i++) {
if (snake[i].x == snake[0].x && snake[i].y == snake[0].y) {
gameover = 1;
return;
}
}
// 判断是否吃到食物
if (snake[0].x == foodX && snake[0].y == foodY) {
// 生成新的食物
foodX = rand() % (width - 2) + 1;
foodY = rand() % (height - 2) + 1;
score += 10;
len++;
// 在蛇尾增加一个新节点
snake[len - 1].x = prevX;
snake[len - 1].y = prevY;
}
else {
// 移动蛇身
for (int i = 1; i < len; i++) {
prev2X = snake[i].x;
prev2Y = snake[i].y;
snake[i].x = prevX;
snake[i].y = prevY;
prevX = prev2X;
prevY = prev2Y;
}
}
}
int main() { int delay = 100; // 游戏刷新延迟时间 init();
while (!gameover) {
draw();
input();
update();
Sleep(delay); // 延迟一段时间
}
printf("Game Over!\n");
printf("Your score: %d\n", score);
return 0;
}
原文地址: https://www.cveoy.top/t/topic/bcQI 著作权归作者所有。请勿转载和采集!