21xrx.com
2025-04-14 00:17:33 Monday
文章检索 我的文章 写文章
C++编程:贪吃蛇代码
2023-07-07 16:45:15 深夜i     14     0
C++编程 贪吃蛇 代码

贪吃蛇是一种经典的游戏,其规则简单,玩法耐人寻味。作为一名程序员,如果你也喜欢玩贪吃蛇,不妨尝试自己编写一份贪吃蛇代码,体验一下编程的乐趣吧!下面,我将分享一份基于C++语言的贪吃蛇代码,希望能够给大家带来一些参考和借鉴。

首先,我们需要定义一些常量和变量,如下所示:

const int WIDTH = 20// 游戏窗口宽度
const int HEIGHT = 20; // 游戏窗口高度
const int MAX_LEN = 400; // 蛇的最大长度
char map[WIDTH][HEIGHT]; // 存储游戏地图
struct Point {
  int x;
  int y;
  Point(int _x, int _y): x(_x), y(_y) {} // 构造函数
};
vector<Point> snake; // 存储蛇的身体
Point food(-1, -1); // 存储食物的位置
int score; // 游戏得分
bool is_game_over; // 游戏是否结束
int direction = -1; // 蛇头移动方向,0表示上,1表示右,2表示下,3表示左
int sleep_time = 200; // 蛇每移动一格的时间间隔(毫秒)

接下来,我们需要实现一些函数来完成游戏的初始化、绘制、移动等功能。

首先是游戏初始化函数:

void init_game() {
  // 初始化地图
  for (int i = 0; i < WIDTH; i++) {
    for (int j = 0; j < HEIGHT; j++) {
      if (i == 0 || i == WIDTH - 1 || j == 0 || j == HEIGHT - 1) {
        map[i][j] = '#';
      } else {
        map[i][j] = ' ';
      }
    }
  }
  // 初始化蛇的位置和长度
  snake.clear();
  for (int i = 0; i < 4; i++) {
    snake.push_back(Point(WIDTH / 2 + i, HEIGHT / 2));
  }
  // 随机生成食物位置
  generate_food();
  // 初始化游戏得分和结束标志
  score = 0;
  is_game_over = false;
  // 清屏并绘制地图、蛇和食物
  system("cls");
  draw_map();
  draw_snake();
  draw_food();
}

接下来是绘制地图、蛇和食物的函数:

void draw_map() {
  for (int i = 0; i < WIDTH; i++) {
    for (int j = 0; j < HEIGHT; j++) {
      cout << map[i][j];
    }
    cout << endl;
  }
}
void draw_snake() {
  for (int i = 0; i < snake.size(); i++) {
    Point p = snake[i];
    map[p.x][p.y] = '*';
  }
}
void draw_food() {
  map[food.x][food.y] = '@';
}

接下来是移动蛇的函数:

void move_snake() {
  // 计算新的蛇头位置
  Point head = snake.front();
  switch (direction) {
    case 0:
      head.x--;
      break;
    case 1:
      head.y++;
      break;
    case 2:
      head.x++;
      break;
    case 3:
      head.y--;
      break;
  }
  // 判断是否撞墙或者撞到自己
  if (head.x < 1 || head.x >= WIDTH - 1 || head.y < 1 || head.y >= HEIGHT - 1)
    is_game_over = true;
    return;
  
  for (int i = 1; i < snake.size(); i++) {
    if (head.x == snake[i].x && head.y == snake[i].y)
      is_game_over = true;
      return;
    
  }
  // 判断是否吃到了食物
  if (head.x == food.x && head.y == food.y) {
    score++;
    snake.push_back(Point(food.x, food.y));
    generate_food();
    draw_food();
  } else {
    // 没有吃到食物,移动蛇身
    Point tail = snake.back();
    map[tail.x][tail.y] = ' ';
    snake.pop_back();
    snake.push_front(head);
  }
  // 绘制蛇的新位置
  draw_snake();
  // 延迟一段时间再移动蛇,形成动画效果
  Sleep(sleep_time);
}

最后是生成食物位置的函数:

void generate_food() {
  while (true) {
    int x = rand() % (WIDTH - 2) + 1;
    int y = rand() % (HEIGHT - 2) + 1;
    if (map[x][y] == ' ')
      food.x = x;
      food.y = y;
      return;
    
  }
}

实现了以上几个函数,我们就可以开始编写主函数了:

int main() {
  // 随机种子
  srand(time(NULL));
  // 初始化游戏
  init_game();
  // 游戏主循环
  while (!is_game_over) {
    // 处理用户输入
    if (_kbhit()) {
      char c = _getch();
      if (c == 'w' && direction != 2) direction = 0;
      if (c == 'd' && direction != 3) direction = 1;
      if (c == 's' && direction != 0) direction = 2;
      if (c == 'a' && direction != 1) direction = 3;
    }
    // 移动蛇
    move_snake();
  }
  // 游戏结束,显示得分并退出
  system("cls");
  cout << "Game over! Your score is " << score << "." << endl;
  return 0;
}

至此,我们的贪吃蛇代码就完成了。你可以将以上代码保存为一个.cpp文件并编译运行,体验一下自己编写的贪吃蛇游戏,感受一下编程的魅力。当然,如果你对以上代码有什么疑问或建议,欢迎在下方留言讨论。

  
  

评论区

请求出错了