游戏描述:
贪吃蛇是一款经典游戏,玩家控制一条蛇,在屏幕上移动并吃掉食物。每当蛇吃掉一块食物后,身体会增长一个格子。如果蛇撞到墙壁或自己的身体,则游戏结束。
实现思路:
- 定义蛇的初始位置和方向。
- 定义食物的位置,当蛇的头部和食物位置重合时,蛇身增加一个格子并重新生成食物。
- 定义蛇的移动函数,每次移动时将蛇身的每个格子的位置向前移动一个格子,并将蛇头移动到下一个位置。
- 定义游戏结束的条件,当蛇头撞到墙壁或自己的身体时,游戏结束。
- 在控制台上显示游戏界面,使用不同的字符表示蛇头、蛇身、墙壁和食物等元素。
下面是一个简单的C语言实现贪吃蛇的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define WIDTH 30
#define HEIGHT 20
int map[HEIGHT][WIDTH]; // 游戏地图
int snake[WIDTH * HEIGHT][2]; // 蛇的坐标,第一维表示坐标的序号,第二维表示坐标的横纵坐标
int snake_len = 3; // 蛇的长度
int snake_dir = 'w'; // 蛇的方向
int food_x, food_y; // 食物的坐标
void init_map()
{
// 初始化地图,将所有位置设为0
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
map[i][j] = 0;
}
}
// 初始化蛇的位置
int x = WIDTH / 2, y = HEIGHT / 2;
for (int i = 0; i < snake_len; i++) {
snake[i][0] = x + i;
snake[i][1] = y;
map[y][x + i] = 1;
}
// 随机生成食物的位置
srand((unsigned int) time(NULL));
do {
food_x = rand() % WIDTH;
food_y = rand() % HEIGHT;
} while (map[food_y][food_x] != 0);
map[food_y][food_x] = 2;
}
void draw_map()
{
// 在控制台上显示游戏地图
system("cls"); // 清屏
for (int i = 0; i <= HEIGHT + 1; i++) {
for (int j = 0; j <= WIDTH + 1; j++) {
if (i == 0 || i == HEIGHT + 1 || j == 0 || j == WIDTH + 1) {
printf("#"); // 绘制墙壁
} else if (map[i - 1][j - 1] == 0) {
printf(" "); // 绘制空格
} else if (map[i - 1][j - 1] == 1) {
printf("*"); // 绘制蛇身
} else if (map[i - 1][j - 1] == 2) {
printf("$"); // 绘制食物
}
}
printf("\n");
}
}
void move_snake()
{
// 移动蛇的身体
for (int i = snake_len - 1; i >= 1; i--) {
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
// 移动蛇的头部
if (snake_dir == 'w') {
snake[0][1]--;
} else if (snake_dir == 's') {
snake[0][1]++;
} else if (snake_dir == 'a') {
snake[0][0]--;
} else if (snake_dir == 'd') {
snake[0][0]++;
}
// 判断蛇是否吃到了食物
if (snake[0][0] == food_x && snake[0][1] == food_y) {
snake_len++; // 蛇的长度加一
do {
food_x = rand() % WIDTH;
food_y = rand() % HEIGHT;
} while (map[food_y][food_x] != 0);
map[food_y][food_x] = 2; // 重新生成食物
}
// 判断蛇是否撞到了墙壁或自己的身体
if (snake[0][0] < 0 || snake[0][0] >= WIDTH || snake[0][1] < 0 || snake[0][1] >= HEIGHT ||
map[snake[0][1]][snake[0][0]] == 1) {
printf("Game over!\n");
exit(0);
}
// 更新地图
for (int i = 0; i < HEIGHT; i++) {
for (int j = 0; j < WIDTH; j++) {
map[i][j] = 0;
}
}
for (int i = 0; i < snake_len; i++) {
map[snake[i][1]][snake[i][0]] = 1;
}
map[food_y][food_x] = 2;
}
int main()
{
init_map();
draw_map();
while (1) {
// 获取玩家输入
if (_kbhit()) {
char ch = _getch();
if (ch == 'w' || ch == 's' || ch == 'a' || ch == 'd') {
snake_dir = ch;
}
}
move_snake();
draw_map();
// 暂停一段时间,控制蛇的移动速度
int t = 1000000;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < t; j++) {
;
}
}
}
return 0;
}
运行结果:
##############################
# #
# #
# #
# #
# #
# #
# #
# #
# #
# #
# *** #
# #
# #
# #
# #
# #
# #
# #
# #
##############################
在控制台上显示出一个30x20的游戏地图,蛇的头部用""表示,身体用""表示,食物用"$"表示,墙壁用"#"表示,空格用" "表示。玩家可以使用"w"、"s"、"a"、"d"键来控制蛇的移动方向。当蛇撞到墙壁或自己的身体时,游戏结束。