You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++编写贪吃蛇游戏时蛇身偶尔在墙外生成如何修复

贪吃蛇蛇身出墙问题修复方案

核心问题定位

  • draw_walls函数存在数组越界bug,越界写内存会意外篡改蛇身坐标等其他数据,是偶发出墙的常见诱因
  • 可活动区域范围校验缺失:墙体围在第0行、HEIGHT+1行、第0列、WIDTH+1列,蛇的所有坐标必须满足1 ≤ x ≤ HEIGHT、1 ≤ y ≤ WIDTH,现有代码没有做强制限制
  • 初始坐标定义可能存在逻辑错误:如果Pos结构体的x对应行索引、y对应列索引,现有初始赋值x = WIDTH / 2、y = HEIGHT / 2会在WIDTH和HEIGHT数值不一致时直接超出范围

具体修复代码

1. 修复draw_walls的越界问题

void draw_walls(char board[HEIGHT + 2][WIDTH + 2]) {
  for (int j = 0; j < (WIDTH + 2); j++) {
    board[0][j] = '#';
  }
  for (int i = 1; i < (HEIGHT + 1); i++) {
    board[i][0] = '#';
    // 修改循环上限,仅填充中间空白区域,避免数组越界
    for (int j = 1; j <= WIDTH; j++) {
      board[i][j] = ' ';
    }
    board[i][(WIDTH + 1)] = '#';
  }
  for (int j = 0; j < (WIDTH + 2); j++) {
    board[HEIGHT + 1][j] = '#';
  }
  return;
}

2. 修正初始坐标+蛇身生成逻辑强制限制范围

// 初始坐标对应行、列的合法范围,x是行索引对应HEIGHT,y是列索引对应WIDTH
int x = HEIGHT / 2;
int y = WIDTH / 2;

// 初始化蛇身时强制校验每一段的坐标合法性
std::vector<Pos> init_snake(int init_length = 3) {
  std::vector<Pos> snake;
  int base_x = HEIGHT / 2;
  int base_y = WIDTH / 2;
  for(int i = 0; i < init_length; i++) {
    int curr_y = base_y - i;
    // 确保坐标落在合法活动区内
    if (curr_y < 1) curr_y = 1;
    snake.push_back({base_x, curr_y});
  }
  return snake;
}

3. 绘制函数增加合法性校验兜底

// 加const引用避免不必要的vector拷贝
void draw_snake(char board[HEIGHT + 2][WIDTH + 2], const std::vector<Pos>& snake) {
  for (size_t i = 0; i < snake.size(); i++) {
    int x = snake[i].x;
    int y = snake[i].y;
    // 仅合法坐标才绘制到面板上
    if (x >= 1 && x <= HEIGHT && y >=1 && y <= WIDTH) {
      board[x][y] = (i == 0) ? '@' : 'O';
    }
  }
  return;
}

内容的提问来源于stack exchange,提问作者likeabossk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 15:15:01