Unity3D卡牌游戏检测_CardList列表是否存在3张同类型卡牌的实现方案
解决方案
方案1:字典计数法(推荐,完全兼容后续新增卡牌,无维护成本)
该方案不依赖_CardList的排序规则,仅需一次遍历即可完成检测,新增卡牌类型时无需修改检测逻辑:
void CardChecking() { // 手牌不足3张直接跳过检测 if (_CardList.Count < 3) return; Dictionary<CardType, int> typeCountDic = new Dictionary<CardType, int>(); foreach (var card in _CardList) { // 统计对应类型的卡牌数量 if (typeCountDic.ContainsKey(card._cardType)) { typeCountDic[card._cardType]++; } else { typeCountDic[card._cardType] = 1; } // 检测到达到3张直接触发操作,提前终止遍历 if (typeCountDic[card._cardType] == 3) { // 建议提前配置CardType和场景ID的映射字典,避免硬编码或者ToString()的拼写风险 // 示例:SceneManager.LoadScene(cardTypeSceneMapping[card._cardType]); SceneManager.LoadScene(card._cardType.ToString()); // 可选:触发操作后移除这三张卡牌,避免重复触发 // _CardList.RemoveAll(c => c._cardType == card._cardType); return; } } }
如果需要提前配置卡牌类型和操作/场景的映射关系,可以全局维护一个静态字典,新增卡牌时仅需修改映射配置即可:
// 全局配置,仅需在新增卡牌时维护此处 public static Dictionary<CardType, int> CardTypeSceneMap = new Dictionary<CardType, int>() { {CardType.A, 1}, {CardType.B, 2}, {CardType.C, 3}, // 后续新增卡牌直接加一行即可 };
方案2:排序场景下的轻量修复(仅适用于_CardList已按类型排序的场景)
原有逻辑越界是因为循环上限设置错误,只需要把循环的终止条件改为i < _CardList.Count - 2即可保证不会访问到超出列表范围的索引:
void CardChecking() { // 手牌不足3张直接跳过 if (_CardList.Count < 3) return; // 循环上限为Count-2,i最大为Count-3,i+2最大为Count-1,不会越界 for (int i = 0; i < _CardList.Count - 2; i++) { if(_CardList[i]._cardType == _CardList[i+1]._cardType && _CardList[i + 1]._cardType == _CardList[i+2]._cardType) { SceneManager.LoadScene(_CardList[i]._cardType.ToString()); // 触发后直接返回,避免重复检测 return; } } }
内容的提问来源于stack exchange,提问作者Balaji jp
相关产品推荐
相关产品推荐

