全部评论 1

  • 3 个严重问题 + 几个明确逻辑缺陷

    1. 致命:攻击的其实是玩家副本。
      opponents.push_back(players[i]) 会复制 Player;后续攻击、毒药、致盲、解除武装等都修改 opponents,而不是原始 players。因此真实玩家血量基本不会下降,死亡检测检查的又是原始 players,游戏可能一直无法结束。偷窃还会出现“自己获得道具,但对方原道具没丢”的复制问题。

    2. 严重 UB:AI 名称生成写错。

      name = "AI玩家" + static_cast<char>('0' + (i + 1));
      

      这里不是字符串拼接,而是对字符串字面量做指针偏移,可能出现乱码、异常名称甚至崩溃。应至少改成 std::string("AI玩家") + char(...)

    3. 潜在悬空引用。
      Item& item = human.inventory[...] 后,STEAL/LUCKY 会向同一个 inventory 执行 push_back();若 vector 扩容,item 引用立即失效,之后再执行 item.used = true 属于未定义行为。

    4. 沉默/致盲实际上不会生效。
      玩家回合刚开始就先把 isSilencedisBlind 清成 false,然后才执行玩家行动,所以“下回合无法使用道具”的效果被提前解除。

    5. DOUBLE 道具完全没有实际效果。
      使用时只有一句输出,没有保存“双倍伤害”状态;普通攻击仍直接使用 rollDice() * 10

    6. SABOTAGE 文案说“随机破坏”,实际永远破坏第一件未使用道具。

    另外,std::random_shuffle 属于旧接口,现代 C++17 标准已移除,跨编译器可能存在兼容问题。

    4天前 来自 浙江

    1

热门讨论