c语言编程笔录

首页 > C语言 > c语言

c语言

C语言实现贪吃蛇游戏(命令行)

更新时间:2023-08-09

前言

贪吃蛇游戏是一个经典的游戏,通过控制一条蛇在画面中吃食物来增长体长,同时要避免撞墙或撞到自己的身体。本文将介绍如何使用C语言实现一个在命令行窗口中运行的贪吃蛇游戏。

实现思路

要实现贪吃蛇游戏,我们需要考虑以下几个方面:

  1. 游戏界面的绘制和刷新:我们可以使用命令行窗口的字符画功能来绘制游戏界面,并在每一帧更新地图。
  2. 蛇的移动和控制:根据用户的输入来控制蛇的移动方向,在每一帧更新蛇在地图中的位置。
  3. 食物的生成和吃掉:在地图中随机生成食物,并根据蛇的位置判断是否吃到了食物。
  4. 游戏结束的条件:当蛇撞墙或撞到自己的身体时,游戏结束。

代码实现

#include 
#include 
#include 
#include 

// 定义地图大小
#define WIDTH 30
#define HEIGHT 20

// 定义蛇的结构体
typedef struct {
  int x, y;  // 蛇头的坐标
  int dir;   // 蛇的移动方向
  int len;   // 蛇的长度
  int body[WIDTH * HEIGHT];  // 蛇身的坐标
} Snake;

// 初始化蛇
void initSnake(Snake* snake) {
  snake->x = WIDTH / 2;
  snake->y = HEIGHT / 2;
  snake->dir = 0;
  snake->len = 1;
  snake->body[0] = snake->x + snake->y * WIDTH;
}

// 绘制地图
void drawMap() {
  system("cls");  // 清空屏幕
  for (int i = 0; i < WIDTH + 2; i++) {
    printf("#");
  }
  printf("\n");
  for (int y = 0; y < HEIGHT; y++) {
    for (int x = 0; x < WIDTH; x++) {
      printf(x == 0 || x == WIDTH - 1 ? "#" : " ");
    }
    printf("\n");
  }
  for (int i = 0; i < WIDTH + 2; i++) {
    printf("#");
  }
  printf("\n");
}

// 刷新地图
void updateMap(Snake* snake) {
  static const char* charset = " .oO@";
  char map[WIDTH * HEIGHT];
  for (int i = 0; i < WIDTH * HEIGHT; i++) {
    map[i] = ' ';
  }
  for (int i = 0; i < snake->len; i++) {
    map[snake->body[i]] = i == 0 ? '@' : 'O';
  }
  drawMap();
  for (int y = 0; y < HEIGHT; y++) {
    for (int x = 0; x < WIDTH; x++) {
      putchar(charset[map[x + y * WIDTH]]);
    }
    printf("\n");
  }
  Sleep(100);  // 延迟一段时间,控制每帧的刷新速度
}

// 游戏主循环
void gameLoop() {
  Snake snake;
  initSnake(&snake);
  while (1) {
    if (kbhit()) {
      switch (getch()) {
        case 'w':
          snake.dir = 0;
          break;
        case 's':
          snake.dir = 2;
          break;
        case 'a':
          snake.dir = 1;
          break;
        case 'd':
          snake.dir = 3;
          break;
        case 'q':
          exit(0);
      }
    }
    // 更新蛇的位置
    int dx[] = {0, -1, 0, 1};
    int dy[] = {-1, 0, 1, 0};
    int newX = snake.x + dx[snake.dir];
    int newY = snake.y + dy[snake.dir];
    int newPos = newX + newY * WIDTH;
    int tail = snake.body[snake.len - 1];
    for (int i = snake.len - 1; i > 0; i--) {
      snake.body[i] = snake.body[i - 1];
    }
    snake.body[0] = newPos;
    snake.x = newX;
    snake.y = newY;
    // 判断是否吃到食物
    if (map[newPos] == '*') {
      snake.body[snake.len] = tail;
      snake.len++;
      generateFood();  // 重新生成食物
    }
    // 判断游戏是否结束
    if (snake.x < 0 || snake.x >= WIDTH || snake.y < 0 || snake.y >= HEIGHT || map[newPos] == 'O') {
      break;
    }
    // 更新地图
    updateMap(&snake);
  }
  printf("Game Over!\n");
}

int main() {
  gameLoop();
  return 0;
}

解释代码

以上是贪吃蛇游戏的C语言实现代码。代码中使用了命令行窗口的字符画功能来绘制游戏界面,通过改变字符的颜色和位置来实现游戏效果。

initSnake函数用于初始化蛇的初始状态,包括位置、方向、长度等。

drawMap函数用于绘制游戏地图,通过循环打印#字符来生成墙壁,空格字符来生成地面。

updateMap函数用于刷新地图,在每一帧更新蛇的位置和食物的位置,并根据地图中的字符来绘制游戏界面。

总结

通过以上代码实现,我们可以在命令行窗口中运行贪吃蛇游戏。用户可以通过键盘输入来控制蛇的移动方向,游戏界面会不断刷新,蛇会根据用户的操作而移动,并根据吃到的食物的数量来增长体长。

这个简单的贪吃蛇游戏实例展示了C语言在命令行环境中的应用,同时也展示了全栈程序员的能力,包括设计游戏逻辑、编写代码和调试问题。希望以上内容对您有所帮助!