用c语言编写一个贪吃蛇
时间: 2023-05-26 17:03:03 浏览: 75
由于贪吃蛇在不同系统和不同显示环境下实现方式可能不同,以下给出一个基本的控制台版贪吃蛇的代码实现。
```
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define MAX_LENGTH 100 // 蛇的最大长度
#define WIDTH 20 // 地图宽度
#define HEIGHT 20 // 地图高度
enum Direction{ // 方向枚举
UP, DOWN, LEFT, RIGHT
};
struct Snake{ // 蛇的结构体
int x[MAX_LENGTH], y[MAX_LENGTH]; // 蛇的每个节点的横纵坐标
int length; // 蛇的长度
enum Direction direction; // 蛇的前进方向
};
struct Food{ // 食物的结构体
int x, y; // 食物的位置
};
void printMap(struct Snake* pSnake, struct Food* pFood){ // 打印地图
for(int i = 0; i <= HEIGHT+1; i++){
for(int j = 0; j <= WIDTH+1; j++){
if(i == 0 || i == HEIGHT+1 || j == 0 || j == WIDTH+1){ // 边界
printf("#");
}else{
if(i == pFood->y && j == pFood->x){ // 食物
printf("@");
}else{
int flag = 0; // 标记是否为蛇的一部分
for(int k = 0; k < pSnake->length; k++){
if(i == pSnake->y[k] && j == pSnake->x[k]){ // 蛇
printf("*");
flag = 1;
break;
}else{
flag = 0;
}
}
if(flag == 0){ // 空白
printf(" ");
}
}
}
}
printf("\n");
}
}
void changeDirection(struct Snake* pSnake, char keystroke){ // 改变方向
switch(keystroke){
case 'w':
if(pSnake->direction != DOWN){
pSnake->direction = UP;
}
break;
case 's':
if(pSnake->direction != UP){
pSnake->direction = DOWN;
}
break;
case 'a':
if(pSnake->direction != RIGHT){
pSnake->direction = LEFT;
}
break;
case 'd':
if(pSnake->direction != LEFT){
pSnake->direction = RIGHT;
}
break;
default:
break;
}
}
void moveSnake(struct Snake* pSnake, struct Food* pFood){ // 移动蛇
for(int i = pSnake->length-1; i > 0; i--){ // 从蛇尾开始,前一个节点的位置传递给后一个节点
pSnake->x[i] = pSnake->x[i-1];
pSnake->y[i] = pSnake->y[i-1];
}
// 根据方向更新蛇头的位置
switch(pSnake->direction){
case UP:
pSnake->y[0]--;
break;
case DOWN:
pSnake->y[0]++;
break;
case LEFT:
pSnake->x[0]--;
break;
case RIGHT:
pSnake->x[0]++;
break;
default:
break;
}
// 判断蛇头是否吃到食物
if(pSnake->x[0] == pFood->x && pSnake->y[0] == pFood->y){
pSnake->length++; // 蛇变长
pFood->x = rand() % WIDTH + 1; // 食物换位置
pFood->y = rand() % HEIGHT + 1;
}
}
int judgeGameOver(struct Snake* pSnake){ // 判断游戏是否结束
if(pSnake->x[0] < 1 || pSnake->x[0] > WIDTH || pSnake->y[0] < 1 || pSnake->y[0] > HEIGHT){ // 判断是否撞墙
return 1;
}
for(int i = 1; i < pSnake->length; i++){ // 判断是否撞到自己
if(pSnake->x[0] == pSnake->x[i] && pSnake->y[0] == pSnake->y[i]){
return 1;
}
}
return 0;
}
int main(){
srand(time(NULL)); // 随机数种子
struct Snake snake = {0}; // 创建一条蛇
snake.x[0] = rand() % WIDTH + 1; // 初始位置随机
snake.y[0] = rand() % HEIGHT + 1;
snake.length = 3; // 初始长度为3
snake.direction = RIGHT; // 初始方向向右
for(int i = 1; i < snake.length; i++){ // 初始化蛇的其它节点位置
snake.x[i] = snake.x[i-1] - 1;
snake.y[i] = snake.y[i-1];
}
struct Food food = {rand() % WIDTH + 1, rand() % HEIGHT + 1}; // 创建一个食物,位置随机
while(1){ // 游戏开始
system("cls"); // 清屏
printMap(&snake, &food); // 打印地图
if(kbhit()){ // 判断是否输入方向键
char keystroke = getch();
changeDirection(&snake, keystroke);
}
moveSnake(&snake, &food); // 移动蛇
if(judgeGameOver(&snake)){ // 判断游戏是否结束
printf("Game over\n");
break;
}
Sleep(500); // 暂停一段时间,让蛇慢慢爬
}
return 0;
}
```
阅读全文