Java开发井字棋时非首行获胜后GameOver不触发问题求助
问题根因
你的代码存在三个核心错误,直接导致获胜判断逻辑异常:
checkGameOver方法的循环逻辑错误,首次循环仅校验顶行获胜组合后就会直接返回结果,中行、底行、列、对角线等其余7组获胜组合完全不会被校验,这就是只有顶行落子1/2/3能触发游戏结束的核心原因。- 所有判断电脑获胜的逻辑都错误使用了
contains()方法,应该和玩家判断逻辑一致使用containsAll():contains()是判断集合中是否存在单个指定元素,你传入的是整组获胜组合的List对象,而电脑位置集合里存储的是单个数字,永远不可能返回true,电脑获胜判断完全失效。 checkWinner方法的平局判断放在循环内部属于逻辑错误,应该移到循环外部,等所有获胜组合都校验完成且无胜者后,再判断是否满格平局。
修正后代码
checkGameOver方法
public static boolean checkGameOver(char [][] gameBoard){ List<Integer> topRow = Arrays.asList(1, 2, 3); List<Integer> midRow = Arrays.asList(4, 5, 6); List<Integer> botRow = Arrays.asList(7, 8, 9); List<Integer> leftCol = Arrays.asList(1, 4, 7); List<Integer> midCol = Arrays.asList(2, 5, 8); List<Integer> rightCol = Arrays.asList(3, 6, 9); List<Integer> cross1 = Arrays.asList(1, 5, 9); List<Integer> cross2 = Arrays.asList(7, 5, 3); List<List<Integer>> winConditions = new ArrayList<>(); winConditions.add(topRow); winConditions.add(midRow); winConditions.add(botRow); winConditions.add(leftCol); winConditions.add(midCol); winConditions.add(rightCol); winConditions.add(cross1); winConditions.add(cross2); for(List<Integer> condition : winConditions) { if(playerPositions.containsAll(condition) || computerPositions.containsAll(condition)) { return true; } } // 无获胜者时判断是否满格平局,平局也属于游戏结束 return playerPositions.size() + computerPositions.size() == 9; }
checkWinner方法
public static String checkWinner(char [][] gameBoard) { List<Integer> topRow = Arrays.asList(1, 2, 3); List<Integer> midRow = Arrays.asList(4, 5, 6); List<Integer> botRow = Arrays.asList(7, 8, 9); List<Integer> leftCol = Arrays.asList(1, 4, 7); List<Integer> midCol = Arrays.asList(2, 5, 8); List<Integer> rightCol = Arrays.asList(3, 6, 9); List<Integer> cross1 = Arrays.asList(1, 5, 9); List<Integer> cross2 = Arrays.asList(7, 5, 3); List<List<Integer>> winConditions = new ArrayList<>(); winConditions.add(topRow); winConditions.add(midRow); winConditions.add(botRow); winConditions.add(leftCol); winConditions.add(midCol); winConditions.add(rightCol); winConditions.add(cross1); winConditions.add(cross2); for(List<Integer> condition : winConditions) { if(playerPositions.containsAll(condition)) { return "恭喜你赢了!"; } else if(computerPositions.containsAll(condition)) { return "电脑赢了!"; } } // 所有获胜条件都不满足再判断平局 if(playerPositions.size() + computerPositions.size() == 9) { return "平局!"; } return ""; }
内容的提问来源于stack exchange,提问作者Don_Angel
相关产品推荐
相关产品推荐

