用C语言编写贪吃蛇游戏的程序
时间: 2023-05-24 12:03:50 浏览: 94
用C语言编写的“贪吃蛇游戏源程序”.7z
A:
以下是一个简单的C语言贪吃蛇游戏程序:
```
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define MAP_WIDTH 20 // 地图宽度
#define MAP_HEIGHT 20 // 地图高度
typedef enum {
NO_WALL = 0,
LEFT_WALL,
RIGHT_WALL,
UP_WALL,
DOWN_WALL,
} WALL_TYPE;
typedef struct {
int x; // 坐标x
int y; // 坐标y
} COORD;
// 按键枚举
typedef enum {
KEY_NONE = 0,
KEY_LEFT,
KEY_RIGHT,
KEY_UP,
KEY_DOWN,
} KEY_TYPE;
// 生成指定范围内的随机数
int rand_int(int min, int max)
{
return rand() % (max - min + 1) + min;
}
// 计算地图上任意位置的坐标
COORD map_pos_to_coord(int pos)
{
COORD coord = {
pos % MAP_WIDTH,
pos / MAP_WIDTH,
};
return coord;
}
// 计算坐标在地图中的位置
int coord_to_map_pos(COORD coord)
{
return coord.y * MAP_WIDTH + coord.x;
}
// 游戏主循环
void game_loop()
{
int map[MAP_WIDTH * MAP_HEIGHT]; // 地图数组
COORD snake[MAP_WIDTH * MAP_HEIGHT];// 蛇身数组
int snake_len = 3; // 蛇身长度
COORD food; // 食物坐标
int game_over = 0; // 游戏结束标志
int score = 0; // 得分
KEY_TYPE key = KEY_NONE; // 按键
// 初始化地图
for (int i = 0; i < MAP_WIDTH * MAP_HEIGHT; i++) {
if (i < MAP_WIDTH || i % MAP_WIDTH == 0
|| i % MAP_WIDTH == MAP_WIDTH - 1
|| i >= MAP_WIDTH * (MAP_HEIGHT - 1)) {
map[i] = WALL_TYPE(LEFT_WALL + (i / MAP_WIDTH) % 2 * 2
+ (i % MAP_WIDTH) % 2);
}
else {
map[i] = NO_WALL;
}
}
// 初始化随机数种子
srand(time(NULL));
// 初始化蛇头和蛇身的位置
snake[0] = map_pos_to_coord(MAP_WIDTH * (MAP_HEIGHT / 2) + MAP_WIDTH / 2);
snake[1] = map_pos_to_coord(coord_to_map_pos(snake[0]) - 1);
snake[2] = map_pos_to_coord(coord_to_map_pos(snake[0]) - 2);
// 随机生成食物
while (1) {
food.x = rand_int(1, MAP_WIDTH - 2);
food.y = rand_int(1, MAP_HEIGHT - 2);
if (map[coord_to_map_pos(food)] == NO_WALL) {
break;
}
}
// 游戏主循环
while (!game_over) {
// 显示地图和分数
system("cls");
printf("Score: %d\n", score);
for (int y = 0; y < MAP_HEIGHT; y++) {
for (int x = 0; x < MAP_WIDTH; x++) {
int pos = y * MAP_WIDTH + x;
if (map[pos] != NO_WALL) {
putchar('#');
}
else if (coord_to_map_pos(snake[0]) == pos) {
putchar('O');
}
else if (coord_to_map_pos(food) == pos) {
putchar('$');
}
else {
int is_body = 0;
for (int i = 1; i < snake_len; i++) {
if (coord_to_map_pos(snake[i]) == pos) {
putchar('o');
is_body = 1;
break;
}
}
if (!is_body) {
putchar(' ');
}
}
}
putchar('\n');
}
// 接收按键
if (_kbhit()) {
switch (_getch()) {
case 'a':
key = KEY_LEFT;
break;
case 'd':
key = KEY_RIGHT;
break;
case 'w':
key = KEY_UP;
break;
case 's':
key = KEY_DOWN;
break;
case 'q':
game_over = 1;
break;
default:
break;
}
}
// 移动蛇
COORD next_pos = snake[0];
switch (key) {
case KEY_LEFT:
next_pos.x--;
break;
case KEY_RIGHT:
next_pos.x++;
break;
case KEY_UP:
next_pos.y--;
break;
case KEY_DOWN:
next_pos.y++;
break;
default:
break;
}
if (map[coord_to_map_pos(next_pos)] == NO_WALL) {
// 吃到食物,蛇身长度+1,重新生成食物
if (coord_to_map_pos(food) == coord_to_map_pos(next_pos)) {
snake_len++;
for (int i = snake_len - 1; i > 0; i--) {
snake[i] = snake[i - 1];
}
snake[0] = next_pos;
score += 10;
while (1) {
food.x = rand_int(1, MAP_WIDTH - 2);
food.y = rand_int(1, MAP_HEIGHT - 2);
if (map[coord_to_map_pos(food)] == NO_WALL) {
break;
}
}
}
// 向前移动蛇身
else {
for (int i = snake_len - 1; i > 0; i--) {
snake[i] = snake[i - 1];
}
snake[0] = next_pos;
}
}
else {
game_over = 1;
}
// 暂停100ms
Sleep(100);
}
// 显示游戏结束画面
system("cls");
printf("Game over!\n");
printf("Score: %d\n", score);
}
int main()
{
// 隐藏光标
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);
CursorInfo.bVisible = FALSE;
SetConsoleCursorInfo(handle, &CursorInfo);
// 进入游戏主循环
game_loop();
// 暂停程序运行
system("pause");
return 0;
}
```
阅读全文