Java中如何判断玩家位置集合是否包含任一获胜组合
Java中如何判断玩家位置集合是否包含任一获胜组合
嘿,我看你是想实现类似三子棋的获胜判定功能对吧?你的思路方向是对的,但当前代码的逻辑有点问题——它现在只要玩家位置里有任意一个获胜组合的元素就会输出WINNER,但我们要的是某一整组三个获胜位置全部都在玩家的集合里才算获胜,对吧?
先说说原代码的问题
你嵌套了三层循环逐个比较单个元素,这会导致只要有一个元素匹配就触发获胜日志,但这显然不符合“三子连线”的获胜规则。我们需要判断的是完整的一组获胜位置是否全部被玩家占据。
优化后的实现思路
我们可以遍历每一组获胜组合,检查这组里的所有位置是否都存在于玩家的位置集合中。只要有任意一组满足这个条件,就判定玩家获胜。
方案一:手动遍历检查(清晰直观)
private boolean validateWinner(String player, ArrayList<String> posPlayer, String[][] posWinner) { // 先做非空判断,避免空指针 if (posPlayer == null || posWinner == null) { return false; } // 遍历每一组获胜组合 for (String[] winningCombo : posWinner) { boolean isCurrentComboWinning = true; // 检查当前组合的每个位置是否都在玩家集合里 for (String position : winningCombo) { if (!posPlayer.contains(position)) { isCurrentComboWinning = false; break; // 只要有一个位置不在,直接跳过当前组合的剩余检查 } } // 如果当前组合全部位置都被玩家占据,判定获胜 if (isCurrentComboWinning) { Log.i("WINNER", "WINNER " + player); return true; } } // 所有组合都不满足,返回失败 return false; }
方案二:利用集合API简化代码(更简洁)
借助ArrayList的containsAll方法,我们可以把获胜组合转成集合,直接判断玩家集合是否包含该组合的所有元素:
import java.util.Arrays; import java.util.List; private boolean validateWinner(String player, ArrayList<String> posPlayer, String[][] posWinner) { // 先做非空判断,避免空指针 if (posPlayer == null || posWinner == null) { return false; } for (String[] winningCombo : posWinner) { // 将获胜组合数组转为List,方便调用containsAll List<String> winningList = Arrays.asList(winningCombo); if (posPlayer.containsAll(winningList)) { Log.i("WINNER", "WINNER " + player); return true; } } return false; }
额外小提示
原代码里的try-catch其实没必要,这里的逻辑不会抛出异常,提前加非空判断就足够啦。
这样修改后,就能准确实现你想要的功能:只要玩家的位置集合包含任意一组完整的获胜组合,方法就会返回true并打印获胜日志~
备注:内容来源于stack exchange,提问作者Julián David Reales de la Ossa
相关产品推荐
相关产品推荐

