编写一个贪吃蛇c语言程序
时间: 2023-11-18 15:57:14 浏览: 116
以下是一个基于C语言编写的贪吃蛇程序,具体实现细节可以参考代码注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define WIDTH 30 // 游戏区域宽度
#define HEIGHT 20 // 游戏区域高度
int map[HEIGHT][WIDTH]; // 地图数组,用于存储游戏区域中的元素
int snake[WIDTH*HEIGHT][2]; // 蛇身数组,用于存储蛇身的坐标
int len = 3; // 蛇身长度
int dir = 1; // 蛇头方向,1表示向右,2表示向下,3表示向左,4表示向上
int score = 0; // 得分
// 初始化游戏区域
void initMap() {
int i, j;
for(i = 0; i < HEIGHT; i++) {
for(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 createFood() {
int x, y;
do {
x = rand() % (WIDTH-2) + 1;
y = rand() % (HEIGHT-2) + 1;
} while(map[y][x] != 0);
map[y][x] = -2; // 食物
}
// 初始化蛇身
void initSnake() {
int i;
for(i = 0; i < len; i++) {
snake[i][0] = WIDTH/2 + i;
snake[i][1] = HEIGHT/2;
map[snake[i][1]][snake[i][0]] = i == 0 ? 1 : i+1; // 蛇头为1,蛇身为大于1的整数
}
}
// 显示游戏区域
void showMap() {
int i, j;
system("cls"); // 清屏
for(i = 0; i < HEIGHT; i++) {
for(j = 0; j < WIDTH; j++) {
switch(map[i][j]) {
case -1: printf("#"); break; // 游戏区域边界
case -2: printf("$"); break; // 食物
case 0: printf(" "); break; // 空白区域
default: printf("*"); break; // 蛇身
}
}
printf("\n");
}
printf("Score: %d\n", score); // 显示得分
}
// 蛇移动
void move() {
int i;
int x = snake[0][0], y = snake[0][1];
switch(dir) {
case 1: x++; break; // 向右移动
case 2: y++; break; // 向下移动
case 3: x--; break; // 向左移动
case 4: y--; break; // 向上移动
}
if(map[y][x] == -2) { // 吃到食物
len++;
score += 10;
createFood();
} else if(map[y][x] != 0) { // 撞到边界或蛇身
printf("Game Over!\n");
exit(0);
}
map[snake[len-1][1]][snake[len-1][0]] = 0; // 蛇尾变为空白区域
for(i = len-1; i > 0; i--) { // 蛇身移动
snake[i][0] = snake[i-1][0];
snake[i][1] = snake[i-1][1];
map[snake[i][1]][snake[i][0]] = i+1;
}
snake[0][0] = x; // 蛇头移动
snake[0][1] = y;
map[y][x] = 1;
}
// 获取键盘输入
void getInput() {
if(kbhit()) {
switch(getch()) {
case 'w': if(dir != 2) dir = 4; break; // 上
case 's': if(dir != 4) dir = 2; break; // 下
case 'a': if(dir != 1) dir = 3; break; // 左
case 'd': if(dir != 3) dir = 1; break; // 右
}
}
}
int main() {
srand((unsigned)time(NULL)); // 随机数种子
initMap();
createFood();
initSnake();
while(1) {
showMap();
getInput();
move();
Sleep(100); // 控制蛇移动速度
}
return 0;
}
```
阅读全文