C语言实现贪吃蛇游戏计分代码及设计思路

C语言实现贪吃蛇游戏计分代码实现流程:

初始化地图

定义一个二维数组map,用于表示游戏地图。初始化时,将地图边缘设置为墙壁,内部都设置为0,即空地。

初始化贪吃蛇

定义一个结构体Snake,其中包括蛇头和蛇身,以及蛇的长度和方向。初始时,将蛇头放在地图中心,蛇身则从蛇头向左延伸,长度为初始值。蛇的方向初始设为向右。

初始化食物

定义一个结构体Food,其中包括食物的位置。初始时,随机生成一个位置,直到该位置为0,即空地。

更新地图

每次更新地图时,将蛇和食物所在位置的值设为SNAKE和FOOD,其余位置的值为0。

更新贪吃蛇

根据当前方向,移动蛇头和蛇身。如果蛇头碰到食物,蛇身增加一节,分数加1,重新生成食物。

检查碰撞

检查蛇头是否碰到边缘或蛇身。

更新方向

如果按下的键为方向键,更新贪吃蛇的方向。

主循环

每次循环中,先检查是否有按键按下,并根据按键更新方向。然后更新贪吃蛇和地图,并检查碰撞。最后等待一段时间后再进入下一次循环。如果检测到碰撞,游戏结束,输出分数。

代码示例:

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

#define MAP_WIDTH 30
#define MAP_HEIGHT 20
#define SNAKE_MAX_LENGTH (MAP_WIDTH * MAP_HEIGHT)
#define WALL 1
#define SNAKE 2
#define FOOD 3

typedef struct {
    int x;
    int y;
} Position;

typedef struct {
    int length;
    Position head;
    Position body[SNAKE_MAX_LENGTH];
    char direction;
} Snake;

typedef struct {
    Position pos;
} Food;

int map[MAP_HEIGHT][MAP_WIDTH];
int score;

void initMap() {
    for (int i = 0; i < MAP_HEIGHT; i++) {
        for (int j = 0; j < MAP_WIDTH; j++) {
            if (i == 0 || i == MAP_HEIGHT - 1 || j == 0 || j == MAP_WIDTH - 1) {
                map[i][j] = WALL;
            } else {
                map[i][j] = 0;
            }
        }
    }
}

void printMap() {
    for (int i = 0; i < MAP_HEIGHT; i++) {
        for (int j = 0; j < MAP_WIDTH; j++) {
            switch (map[i][j]) {
                case WALL:
                    printf("#");
                    break;
                case SNAKE:
                    printf("*");
                    break;
                case FOOD:
                    printf("o");
                    break;
                default:
                    printf(" ");
                    break;
            }
        }
        printf("\n");
    }
    printf("score: %d\n", score);
}

void initSnake(Snake *snake) {
    snake->length = 1;
    snake->head.x = MAP_WIDTH / 2;
    snake->head.y = MAP_HEIGHT / 2;
    snake->body[0].x = snake->head.x;
    snake->body[0].y = snake->head.y;
   snake->direction = 'd'; // 初始方向为向右
map[snake->head.y][snake->head.x] = SNAKE;
}

void initFood(Food *food) {
srand((unsigned int)time(NULL));
do {
food->pos.x = rand() % (MAP_WIDTH - 2) + 1;
food->pos.y = rand() % (MAP_HEIGHT - 2) + 1;
} while (map[food->pos.y][food->pos.x] != 0);
map[food->pos.y][food->pos.x] = FOOD;
}

void updateMap(Snake *snake, Food *food) {
map[snake->head.y][snake->head.x] = SNAKE;
for (int i = 0; i < snake->length; i++) {
map[snake->body[i].y][snake->body[i].x] = SNAKE;
}
map[food->pos.y][food->pos.x] = FOOD;
}

void updateSnake(Snake *snake, Food *food) {
int dx = 0, dy = 0;
switch (snake->direction) {
case 'w':
dy = -1;
break;
case 's':
dy = 1;
break;
case 'a':
dx = -1;
break;
case 'd':
dx = 1;
break;
}
int tail_x = snake->body[snake->length - 1].x;
int tail_y = snake->body[snake->length - 1].y;
for (int i = snake->length - 1; i > 0; i--) {
snake->body[i].x = snake->body[i - 1].x;
snake->body[i].y = snake->body[i - 1].y;
}
snake->head.x += dx;
snake->head.y += dy;
snake->body[0].x = tail_x;
snake->body[0].y = tail_y;
if (snake->head.x == food->pos.x && snake->head.y == food->pos.y) {
snake->length++;
score++;
initFood(food);
}
}

int checkCollision(Snake *snake) {
if (snake->head.x == 0 || snake->head.x == MAP_WIDTH - 1 ||
snake->head.y == 0 || snake->head.y == MAP_HEIGHT - 1) {
return 1;
}
for (int i = 1; i < snake->length; i++) {
if (snake->head.x == snake->body[i].x && snake->head.y == snake->body[i].y) {
return 1;
}
}
return 0;
}

void updateDirection(Snake *snake, char direction) {
if ((direction == 'w' && snake->direction == 's') ||
(direction == 's' && snake->direction == 'w') ||
(direction == 'a' && snake->direction == 'd') ||
(direction == 'd' && snake->direction == 'a')) {
return;
}
snake->direction = direction;
}

int main() {
Snake snake;
Food food;
char direction;
initMap();
initSnake(&snake);
initFood(&food);
updateMap(&snake, &food);
printMap();
while (1) {
if (_kbhit()) {
direction = _get
        switch (_getch()) {
            case 'w':
            case 's':
            case 'a':
            case 'd':
                updateDirection(&snake, direction);
                break;
        }
    }
    system("cls");
    updateSnake(&snake, &food);
    updateMap(&snake, &food);
    printMap();
    if (checkCollision(&snake)) {
        printf("Game over! Your score is %d\n", score);
        break;
    }
    Sleep(SLEEP_TIME);
}
return 0;

C语言实现贪吃蛇游戏计分代码设计思路:

  1. 定义蛇的结构体,包括蛇头坐标、蛇身长度、蛇身坐标数组、蛇的方向等信息。
  2. 定义食物的结构体,包括食物坐标等信息。
  3. 定义地图的二维数组,记录地图上每个位置的状态(空闲、蛇身、食物)。
  4. 定义游戏得分变量,初始化为0。
  5. 初始化地图,将地图上所有位置都置为空闲状态。
  6. 随机生成一个食物坐标,将地图上该位置的状态设置为食物。
  7. 在蛇头所在的位置将蛇的方向设置为初始方向,开始游戏循环。
  8. 在每个循环中,根据蛇的方向移动蛇的位置,更新地图上蛇的位置。
  9. 判断蛇是否吃到食物,如果吃到,则在地图上随机生成一个新的食物坐标,更新地图状态,并增加游戏得分。
  10. 判断蛇是否撞到自己或者墙壁,如果撞到,则游戏结束。
  11. 在游戏结束后,显示游戏得分。