War卡牌游戏胜负判定故障:牌面值比较逻辑失效求助
War卡牌游戏牌面值比较问题修复方案
核心问题分析
你遇到的问题本质是直接比较牌面值字符串的字典序不符合卡牌实际大小规则(比如"A"的ASCII值小于"K",但实际A是最大牌),导致首回合后胜负判定逻辑失效。以下是仅使用for/if/vector的修复方案:
修复后的determineWinner函数
#include <vector> #include <string> int determineWinner(const std::string& playerRank, const std::string& computerRank) { // 定义牌面值优先级顺序:从最小到最大 std::vector<std::string> rankOrder = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}; int playerIdx = -1; int computerIdx = -1; // 遍历找到玩家牌面值在优先级列表中的位置 for (int i = 0; i < rankOrder.size(); ++i) { if (rankOrder[i] == playerRank) { playerIdx = i; break; } } // 遍历找到电脑牌面值在优先级列表中的位置 for (int i = 0; i < rankOrder.size(); ++i) { if (rankOrder[i] == computerRank) { computerIdx = i; break; } } // 通过位置索引比较牌大小 if (playerIdx > computerIdx) { return 1; // 玩家获胜 } else if (computerIdx > playerIdx) { return 2; // 电脑获胜 } else { return 0; // 平局,触发War阶段 } }
关键说明
- 优先级列表:用
vector预定义牌面值的实际大小顺序,确保"A"的索引最大,"2"最小。 - 索引比较:通过遍历找到两张牌在列表中的位置,索引越大代表牌面越大,完全符合War游戏规则。
- 兼容性:无需额外学习映射(map),仅使用你熟悉的
for/if/vector实现,且能完美适配现有代码逻辑。
验证要点
确保调用该函数时,传入的playerRank和computerRank是正确提取的牌面值部分(比如卡牌字符串"10H"需拆分出"10","AS"拆分出"A"),避免传入包含花色的完整卡牌字符串导致匹配失败。
内容的提问来源于stack exchange,提问作者BladeCJ
相关产品推荐
相关产品推荐

