生成贪吃蛇c语言程序
由于贪吃蛇的程序比较复杂,需要用到图形界面等库,因此这里提供一个简单的控制台版贪吃蛇程序,供参考。
程序逻辑:
1.定义一个二维数组作为游戏地图,用1表示蛇身,0表示空地。
2.定义一个结构体作为蛇的数据结构,包含蛇头的坐标和蛇身的长度。
3.初始化游戏地图和蛇的数据结构。
4.进入游戏循环,每次循环先绘制游戏地图和蛇,然后等待用户输入移动方向。根据用户输入更新蛇的数据结构,如果蛇头撞到边界或者蛇身,则游戏结束。如果蛇头吃到食物,则蛇身加一。重复以上步骤直到游戏结束。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define MAP_WIDTH 20
#define MAP_HEIGHT 20
#define SNAKE_INIT_LENGTH 3
int map[MAP_HEIGHT][MAP_WIDTH]; // 游戏地图
struct snake {
int head_x;
int head_y;
int body_length;
int body_x[MAP_WIDTH * MAP_HEIGHT];
int body_y[MAP_WIDTH * MAP_HEIGHT];
} snake; // 蛇的数据结构
void init_map() // 初始化地图
{
for (int i = 0; i < MAP_HEIGHT; i++) {
for (int j = 0; j < MAP_WIDTH; j++) {
map[i][j] = 0;
}
}
}
void init_snake() // 初始化蛇
{
snake.head_x = MAP_WIDTH / 2;
snake.head_y = MAP_HEIGHT / 2;
snake.body_length = SNAKE_INIT_LENGTH;
for (int i = 0; i < snake.body_length; i++) {
snake.body_x[i] = snake.head_x - i;
snake.body_y[i] = snake.head_y;
map[snake.body_y[i]][snake.body_x[i]] = 1;
}
}
void draw_map() // 绘制地图
{
system("cls");
for (int i = 0; i < MAP_HEIGHT; i++) {
for (int j = 0; j < MAP_WIDTH; j++) {
if (map[i][j] == 1) {
printf("*");
} else if (map[i][j] == 2) {
printf("@");
} else {
printf(" ");
}
}
printf("\n");
}
}
void generate_food() // 生成食物
{
int food_x, food_y;
do {
food_x = rand() % MAP_WIDTH;
food_y = rand() % MAP_HEIGHT;
} while (map[food_y][food_x] != 0);
map[food_y][food_x] = 2;
}
void move_snake(int dx, int dy) // 移动蛇
{
// 更新蛇身
for (int i = snake.body_length - 1; i >= 1; i--) {
snake.body_x[i] = snake.body_x[i - 1];
snake.body_y[i] = snake.body_y[i - 1];
}
// 更新蛇头
snake.head_x += dx;
snake.head_y += dy;
snake.body_x[0] = snake.head_x;
snake.body_y[0] = snake.head_y;
// 检查是否撞到边界或蛇身
if (snake.head_x < 0 || snake.head_x >= MAP_WIDTH || snake.head_y < 0 || snake.head_y >= MAP_HEIGHT) {
printf("Game Over!\n");
exit(0);
}
if (map[snake.head_y][snake.head_x] == 1) {
printf("Game Over!\n");
exit(0);
}
// 检查是否吃到食物
if (map[snake.head_y][snake.head_x] == 2) {
snake.body_length++;
map[snake.head_y][snake.head_x] = 1;
generate_food();
} else {
map[snake.body_y[snake.body_length - 1]][snake.body_x[snake.body_length - 1]] = 0;
map[snake.head_y][snake.head_x] = 1;
}
}
int main()
{
srand(time(NULL));
init_map();
init_snake();
generate_food();
while (1) {
draw_map();
char c = getch();
if (c == 'w') {
move_snake(0, -1);
} else if (c == 's') {
move_snake(0, 1);
} else if (c == 'a') {
move_snake(-1, 0);
} else if (c == 'd') {
move_snake(1, 0);
}
}
return 0;
}
运行效果:
@
***************************************
原文地址: https://www.cveoy.top/t/topic/Cvs 著作权归作者所有。请勿转载和采集!