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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:47:33