C语言贪吃蛇游戏代码实现 - 简单易懂的入门示例
由于代码比较长,建议您在本地使用 C 语言编译器进行运行。
以下是一个简单的贪吃蛇代码:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#define WIDTH 20 // 地图宽度
#define HEIGHT 20 // 地图高度
int map[WIDTH][HEIGHT]; // 地图
int snake[WIDTH * HEIGHT][2]; // 蛇的身体
int len; // 蛇的长度
int dir; // 蛇的方向
int score; // 得分
void init_map(); // 初始化地图
void init_snake(); // 初始化蛇
void print_map(); // 打印地图
void move(); // 移动蛇
void generate_food(); // 生成食物
void check_game_over(); // 检查游戏是否结束
int main(){
init_map();
init_snake();
generate_food();
print_map();
while(1){
if(kbhit()){ // 如果有按键按下
char ch = getch();
switch(ch){
case 'w': // 上
if(dir != 2) // 防止蛇倒退
dir = 0;
break;
case 'd': // 右
if(dir != 3)
dir = 1;
break;
case 's': // 下
if(dir != 0)
dir = 2;
break;
case 'a': // 左
if(dir != 1)
dir = 3;
break;
case 'q': // 退出游戏
exit(0);
break;
}
}
move();
check_game_over();
print_map();
Sleep(100); // 控制蛇的速度
}
return 0;
}
void init_map(){
for(int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++){
if(i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1){ // 边界
map[i][j] = -1;
}
else{
map[i][j] = 0;
}
}
}
}
void init_snake(){
len = 3; // 初始长度为3
snake[0][0] = HEIGHT / 2;
snake[0][1] = WIDTH / 2;
for(int i = 1; i < len; i++){
snake[i][0] = snake[i - 1][0] + 1;
snake[i][1] = snake[i - 1][1];
}
dir = 0; // 初始方向为上
score = 0;
}
void print_map(){
system('cls'); // 清空屏幕
for(int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++){
if(map[i][j] == -1){ // 边界
printf('#');
}
else if(map[i][j] == 0){ // 空地
printf(' ');
}
else if(map[i][j] == 1){ // 蛇的身体
printf('*');
}
else if(map[i][j] == 2){ // 食物
printf('@');
}
}
printf('
');
}
printf('Score: %d
', score); // 打印得分
}
void move(){
int new_head[2];
switch(dir){
case 0: // 上
new_head[0] = snake[0][0] - 1;
new_head[1] = snake[0][1];
break;
case 1: // 右
new_head[0] = snake[0][0];
new_head[1] = snake[0][1] + 1;
break;
case 2: // 下
new_head[0] = snake[0][0] + 1;
new_head[1] = snake[0][1];
break;
case 3: // 左
new_head[0] = snake[0][0];
new_head[1] = snake[0][1] - 1;
break;
}
if(map[new_head[0]][new_head[1]] == -1 || map[new_head[0]][new_head[1]] == 1){ // 撞墙或咬自己
exit(0);
}
if(map[new_head[0]][new_head[1]] == 2){ // 吃到食物
len++;
score++;
generate_food();
}
for(int i = len - 1; i > 0; i--){ // 移动身体
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
}
snake[0][0] = new_head[0]; // 移动头部
snake[0][1] = new_head[1];
for(int i = 0; i < len; i++){ // 更新地图
map[snake[i][0]][snake[i][1]] = 1;
}
map[snake[len - 1][0]][snake[len - 1][1]] = 0; // 清除尾部
}
void generate_food(){
srand(time(NULL)); // 设置随机种子
int x, y;
do{
x = rand() % (HEIGHT - 2) + 1; // 随机生成坐标
y = rand() % (WIDTH - 2) + 1;
}while(map[x][y] != 0); // 如果位置已经被占据,则重新生成
map[x][y] = 2; // 放置食物
}
void check_game_over(){
int count = 0;
for(int i = 0; i < HEIGHT; i++){
for(int j = 0; j < WIDTH; j++){
if(map[i][j] == 1){
count++;
}
}
}
if(count == HEIGHT * WIDTH - 2 * (HEIGHT + WIDTH - 2)){ // 蛇占满整个地图
exit(0);
}
}
注意,此代码只是一个简单的实现,有很多可以改进的地方,例如可以添加难度选择、增加蛇的速度、记录最高分等功能。
原文地址: https://www.cveoy.top/t/topic/mQgl 著作权归作者所有。请勿转载和采集!