全部评论 7

  • d

    4天前 来自 浙江

    1
  • d

    4天前 来自 浙江

    1
  • d

    4天前 来自 浙江

    1
  • 我去,这回看得清楚了

    4天前 来自 浙江

    1
  • 2 个较严重的运行期问题。我用 GCC 编译并做了边界验证,问题如下:

    1. 严重:弹仓会越界访问。 shoot() 只判断 st.chamber.empty(),但开枪后只是递增 currentSlot,并不会从 chamber 删除元素。因此 currentSlot == chamber.size() 时,chamber 仍然非空,随后执行 st.chamber[st.currentSlot] 就越界。
      最典型情况是“最后一发为空弹且射自己”:玩家会 continue,AI 会递归 aiTurn(),之后可能再次开枪。
      我用 _GLIBCXX_DEBUG 已实际复现 out-of-bounds index 啤酒退掉最后一颗子弹后也存在同类风险。

    2. 严重:knownNextType 会残留,AI 会把“猜测”当成“已知”。 开枪导致 currentSlot++ 后,没有把 knownNextType 清零。 更关键的是 GameState 只保存“是否已知”,没有保存已知的是实弹还是空弹
      AI 下一次进入 aiTurn() 时重新用剩余实弹比例计算 nxtReal,随后若旧的 knownNextType==true,就把这个概率判断当成精确信息。

    3. AI 使用啤酒后状态没有完整更新。 AI currentSlot++ 后没有重新计算 rem/realLeft/nxtReal,也没有像玩家路径那样清除 knownNextType。后面的决策继续使用退弹前的数据;若退的是最后一发,还可直接触发上述越界。

    4. 手铐在人类与 AI 路径行为不一致。 玩家使用手铐后仍可继续使用道具/开枪;AI 使用手铐后却立即 return,等于主动结束自己的本回合。 如果设计意图是“道具不消耗行动”,这里明显不一致。

    5. Linux/GCC 下存在直接编译问题。 自定义全局 void pause() 会与 POSIX 的 pause() 冲突;我在当前 GCC/glibc 环境用 C17/C20 编译均得到 ambiguating new declaration of 'void pause()'。 建议改名如 waitForEnter()

    6. 兼容性问题:random_shuffle 已过时。 该接口从 C14 起弃用、C17 标准中移除;当前 GCC 尚兼容但会产生警告,应改为 std::shuffle + <random>

    另外有几个较轻的问题:handcuffTurns 从未使用,rand()%N 存在分布偏差,system("cls"/"clear") 可移植性较差。

    我建议の优先修复顺序:①弹仓越界 → ②已知子弹状态 → ③AI啤酒状态 → ④pause() 编译冲突。

    4天前 来自 浙江

    0
    • 我求你了,不要用付费AI了

      4天前 来自 浙江

      0
    • 我给你指出了问题,建议你修正。

      4天前 来自 浙江

      0
    • 此外,你为什么认为我用了付费AI?

      4天前 来自 浙江

      0
  • d

    4天前 来自 浙江

    0
  • d

    4天前 来自 浙江

    0

热门讨论