用C语言写一段贪吃蛇游戏代码
由于贪吃蛇游戏的实现方式有很多种,这里提供一种比较简单的实现方式。
首先,我们需要定义一些常量和变量,如下所示:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define ROW 20
#define COL 40
#define SNAKE_LEN (ROW * COL)
int snake[SNAKE_LEN][2]; // 蛇的位置
int food[2]; // 食物的位置
int snake_len; // 蛇的长度
char map[ROW][COL]; // 地图
int dir; // 方向
int score; // 分数
其中,snake 数组存储蛇的位置,每个元素表示一个坐标,例如 snake[0][0] 表示蛇头的行号,snake[0][1] 表示蛇头的列号;food 数组表示食物的位置,同样有两个元素,表示行号和列号。snake_len 表示蛇的长度,map 数组表示地图,dir 表示方向,score 表示分数。
接下来,我们需要初始化一些变量,如下所示:
void init() {
// 初始化蛇
snake[0][0] = ROW / 2;
snake[0][1] = COL / 2;
snake_len = 1;
// 初始化地图
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) {
map[i][j] = '#'; // 边界
} else {
map[i][j] = ' '; // 空格
}
}
}
// 初始化食物
srand((unsigned) time(NULL)); // 随机数种子
food[0] = rand() % (ROW - 2) + 1; // 食物不能出现在边界上
food[1] = rand() % (COL - 2) + 1;
map[food[0]][food[1]] = '*';
// 初始化方向和分数
dir = 'w'; // 初始方向向上
score = 0;
}
在 init 函数中,我们用蛇头的位置初始化蛇的位置,用空格和井号初始化地图,用随机数初始化食物的位置,用字符 w 表示初始方向向上,用 0 表示初始分数。
接下来,我们需要实现一些函数来处理游戏逻辑,如下所示:
// 显示地图
void show_map() {
system("cls"); // 清屏
printf("score: %d\n", score);
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
printf("%c", map[i][j]);
}
printf("\n");
}
}
// 移动蛇
void move_snake() {
int x, y;
x = snake[0][0];
y = snake[0][1];
switch (dir) {
case 'w': x--; break;
case 's': x++; break;
case 'a': y--; break;
case 'd': y++; break;
}
// 判断是否吃到食物
if (x == food[0] && y == food[1]) {
map[food[0]][food[1]] = ' ';
for (int i = snake_len; i > 0; i--) {
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
snake_len++;
score++;
food[0] = rand() % (ROW - 2) + 1;
food[1] = rand() % (COL - 2) + 1;
map[food[0]][food[1]] = '*';
} else {
map[snake[snake_len - 1][0]][snake[snake_len - 1][1]] = ' ';
for (int i = snake_len - 1; i > 0; i--) {
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
}
snake[0][0] = x;
snake[0][1] = y;
// 判断是否撞墙
if (map[x][y] == '#' || map[x][y] == '@') {
printf("Game over!\n");
exit(0);
}
map[x][y] = '@';
}
// 处理键盘输入
void handle_input() {
if (_kbhit()) {
int c = _getch();
switch (c) {
case 'w':
case 's':
case 'a':
case 'd':
if (dir != 'w' + c - 'a') { // 防止蛇头掉头
dir = c;
}
break;
}
}
}
// 主函数
int main() {
init();
while (1) {
show_map();
move_snake();
handle_input();
Sleep(100); // 休眠100毫秒
}
return 0;
}
在 show_map 函数中,我们用 printf 函数按照地图的内容输出地图,并在开头显示当前分数。
在 move_snake 函数中,我们根据当前方向计算出蛇头的新位置,判断是否吃到食物,如果吃到食物则将蛇长度加一并重新生成食物,否则将蛇尾的位置设置为空格,并将蛇的位置向前移动一格。最后,我们需要判断蛇头是否撞墙或撞到自己的身体,如果是则游戏结束。
在 handle_input 函数中,我们使用 _kbhit 函数和 _getch 函数获取键盘输入,并根据输入修改方向,注意要防止蛇头掉头。
在主函数中,我们使用 init 函数初始化游戏,然后在一个死循环中不断调用 show_map 函数、move_snake 函数和 handle_input 函数,并使用 Sleep 函数休眠一段时间,以控制游戏速度。
完整代码如下:
原文地址: https://www.cveoy.top/t/topic/bxJB 著作权归作者所有。请勿转载和采集!