用c语言打印一个贪吃蛇游戏
时间: 2024-04-30 14:17:26 浏览: 17
好的,以下是一个简单的贪吃蛇游戏的C语言代码:
```
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 20 // 地图行数
#define COL 20 // 地图列数
#define FOOD 5 // 食物的编码
int map[ROW][COL]; // 地图
int snake[100][2]; // 蛇的身体
int len; // 蛇的长度
int dir; // 蛇的方向
int score; // 得分
// 初始化地图和蛇
void init() {
// 设置随机数种子
srand(time(NULL));
// 初始化地图
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
if (i == 0 || j == 0 || i == ROW - 1 || j == COL - 1) {
map[i][j] = 1; // 墙的编码为1
} else {
map[i][j] = 0; // 空地的编码为0
}
}
}
// 初始化蛇
len = 4;
dir = 'd';
for (int i = 0; i < len; i++) {
snake[i][0] = ROW / 2;
snake[i][1] = COL / 2 - i;
map[snake[i][0]][snake[i][1]] = len - i + 1; // 蛇的编码为其长度+1
}
// 放置食物
put_food();
}
// 放置食物
void put_food() {
int x = rand() % (ROW - 2) + 1;
int y = rand() % (COL - 2) + 1;
while (map[x][y] != 0) {
x = rand() % (ROW - 2) + 1;
y = rand() % (COL - 2) + 1;
}
map[x][y] = FOOD;
}
// 打印地图
void print_map() {
system("cls"); // 清屏
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < COL; j++) {
switch (map[i][j]) {
case 0:
printf(" ");
break;
case 1:
printf("* ");
break;
case FOOD:
printf("# ");
break;
default:
printf("@ ");
break;
}
}
printf("\n");
}
printf("score: %d\n", score);
}
// 移动蛇
void move_snake() {
switch (dir) {
case 'w':
snake[len][0] = snake[0][0] - 1;
snake[len][1] = snake[0][1];
break;
case 's':
snake[len][0] = snake[0][0] + 1;
snake[len][1] = snake[0][1];
break;
case 'a':
snake[len][0] = snake[0][0];
snake[len][1] = snake[0][1] - 1;
break;
case 'd':
snake[len][0] = snake[0][0];
snake[len][1] = snake[0][1] + 1;
break;
}
// 判断是否吃到食物
if (map[snake[len][0]][snake[len][1]] == FOOD) {
len++;
score++;
map[snake[len - 1][0]][snake[len - 1][1]] = len; // 新身体的编码为蛇的长度
put_food();
} else {
map[snake[len - 1][0]][snake[len - 1][1]] = 0; // 原来的尾巴变成了空地
}
// 移动身体
for (int i = len - 1; i > 0; i--) {
snake[i][0] = snake[i - 1][0];
snake[i][1] = snake[i - 1][1];
map[snake[i][0]][snake[i][1]] = i + 1; // 更新编码
}
// 移动头部
snake[0][0] = snake[len][0];
snake[0][1] = snake[len][1];
map[snake[0][0]][snake[0][1]] = 2; // 更新头部的编码
}
// 检查游戏是否结束
int check_gameover() {
if (map[snake[0][0]][snake[0][1]] != 2) { // 撞到了身体
return 1;
}
if (snake[0][0] == 0 || snake[0][0] == ROW - 1
|| snake[0][1] == 0 || snake[0][1] == COL - 1) { // 撞到了墙
return 1;
}
return 0;
}
int main() {
init();
while (1) {
print_map();
move_snake();
if (check_gameover()) {
printf("Game Over!\n");
break;
}
if (_kbhit()) { // 检测是否有按键按下
switch (_getch()) {
case 'w':
case 's':
case 'a':
case 'd':
if ((dir == 'w' && _getch() != 's')
|| (dir == 's' && _getch() != 'w')
|| (dir == 'a' && _getch() != 'd')
|| (dir == 'd' && _getch() != 'a')) { // 判断是否按下相反的方向键
dir = _getch();
}
break;
case 'p': // 暂停
_getch();
break;
case 'q': // 退出
return 0;
}
}
Sleep(100);
}
return 0;
}
```
注意:代码中可能与您的编译器有关,如控制台清屏代码为 `system("cls")`,在某些编译器下可能要改为 `system("clear")` 或其他命令。