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
相关产品推荐
相关产品推荐

