基于Raylib的C++贪吃蛇程序运行数分钟后卡顿冻结求助
Raylib C++贪吃蛇程序运行冻结的问题修复
1. 核心问题:死循环导致程序冻结
在Food::GetRandomPos函数中,while循环内部重新定义了局部变量position,导致循环外的目标变量从未被更新。当初始生成的食物位置与蛇身重合时,循环会无限执行无法退出,最终造成程序完全冻结。
错误代码片段:
Vector2 GetRandomPos(deque<Vector2> snake_body) { float x = GetRandomValue(0, cell_count_x - 1); float y = GetRandomValue(0, cell_count_y - 1); Vector2 position = { x, y }; while (CheckPos(snake_body, position) == false) { float x = GetRandomValue(0, cell_count_x - 1); float y = GetRandomValue(0, cell_count_y - 1); Vector2 position = { x, y }; // 重新定义局部变量,外部position未更新 } return position; }
修复代码:
Vector2 GetRandomPos(deque<Vector2> snake_body) { float x = GetRandomValue(0, cell_count_x - 1); float y = GetRandomValue(0, cell_count_y - 1); Vector2 position = { x, y }; while (!CheckPos(snake_body, position)) { x = GetRandomValue(0, cell_count_x - 1); y = GetRandomValue(0, cell_count_y - 1); position = { x, y }; // 修改外部变量,不再重新定义 } return position; }
2. 潜在问题:成员变量访问错误
在Game::CheckCollisionWithBody函数中,错误地使用了body.size(),但Game类并没有名为body的成员变量,应该访问snake.body.size()。这个错误会导致编译失败或未定义行为,可能间接引发程序异常。
错误代码片段:
void CheckCollisionWithBody() { for (int i = 2; i < body.size(); i++) // Game类无body成员,访问错误 if (Vector2Equals(snake.body[0], snake.body[i])) GameOver(); }
修复代码:
void CheckCollisionWithBody() { for (int i = 2; i < snake.body.size(); i++) // 正确访问snake的body成员 if (Vector2Equals(snake.body[0], snake.body[i])) GameOver(); }
额外优化建议
- 传递
snake_body时使用常量引用,避免不必要的拷贝:将Food::GetRandomPos(deque<Vector2> snake_body)改为Food::GetRandomPos(const deque<Vector2>& snake_body),同理CheckPos函数也改为引用传递。 - 增加边界判断:当蛇身占满整个游戏区域时,
GetRandomPos仍会进入死循环,可添加逻辑判断无可用位置时直接触发游戏结束。
内容的提问来源于stack exchange,提问作者Ernest Vandenbulcke
相关产品推荐
相关产品推荐

