首页 > Java > java教程 > 正文

井字棋胜负判断教程:修复及优化

心靈之曲
发布: 2025-07-11 15:26:02
原创
339人浏览过

井字棋胜负判断教程:修复及优化

本文针对一个简单的井字棋游戏,重点解决了胜负判断功能失效的问题。通过分析错误原因,并提供正确的代码示例,详细讲解了如何准确地检测游戏中的获胜条件,确保程序能够正确判定胜负,并避免潜在的逻辑错误。

胜负判断逻辑修正

原代码中,胜负判断的核心问题在于使用了错误的集合方法。ArrayList<Integer> 类型的 plaeyer1position 和 plaeyer2position 存储的是玩家落子的位置(整数),而 gewinner 列表中的元素是 List<Integer>,代表获胜的各种位置组合。

错误代码:

if(plaeyer1position.contains(l)){
    return "Spieler 1 gewonnen";
} else if (plaeyer2position.contains(l)) {
    return "Spieler 2 gewonnen";
}
登录后复制

plaeyer1position.contains(l) 检查的是 plaeyer1position 是否包含整个 List<Integer> 对象 l,这永远不会成立,因为 plaeyer1position 存储的是 Integer,而不是 List<Integer>。

正确的做法是使用 containsAll() 方法,判断 plaeyer1position 是否包含 l 中的 所有 元素。

正确代码:

绘蛙AI修图
绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

绘蛙AI修图 129
查看详情 绘蛙AI修图
if(plaeyer1position.containsAll(l)){
    return "Spieler 1 gewonnen";
} else if (plaeyer2position.containsAll(l)) {
    return "Spieler 2 gewonnen";
}
登录后复制

X.containsAll(Y) 会检查 X 是否包含 Y 中的所有元素。这样,只要玩家1或玩家2占据了 gewinner 列表中的任何一个获胜组合的所有位置,就能正确判定胜负。

优化建议

除了修正胜负判断逻辑外,还可以对代码进行一些优化,提高可读性和健壮性。

  1. 代码国际化: 避免在代码中使用德语注释和输出,统一使用英语,方便代码维护和共享。
  2. 简化胜负判断: 将判断平局的逻辑放在循环外面,可以减少不必要的判断。
  3. 避免重复打印棋盘: bestimmmung_der_position 方法中调用了 gameboard 方法,导致每次落子后棋盘打印两次,可以移除 bestimmmung_der_position 方法中的 gameboard(board) 调用。
  4. 输入验证: 增加对玩家输入位置的验证,防止输入超出范围的数字或已被占用的位置。
  5. 可读性优化: 将 List 改为 List<Integer> 增加代码可读性

以下是优化后的 checkWinner() 方法:

public static String checkWinner() {

    List<Integer> top_zeile = Arrays.asList(1, 2, 3);
    List<Integer> mid_zeile = Arrays.asList(4, 5, 6);
    List<Integer> bot_zeile = Arrays.asList(7, 8, 9);

    List<Integer> links_reihe = Arrays.asList(1, 4, 7);
    List<Integer> mitte_reihe = Arrays.asList(2, 5, 8);
    List<Integer> rechts_reihe = Arrays.asList(3, 6, 9);

    List<Integer> diagonale_rechts = Arrays.asList(1, 5, 9);
    List<Integer> diagonale_links = Arrays.asList(7, 5, 3);

    List<List<Integer>> gewinner = new ArrayList<>();
    gewinner.add(top_zeile);
    gewinner.add(mid_zeile);
    gewinner.add(bot_zeile);
    gewinner.add(links_reihe);
    gewinner.add(mitte_reihe);
    gewinner.add(rechts_reihe);
    gewinner.add(diagonale_links);
    gewinner.add(diagonale_rechts);

    for (List<Integer> l : gewinner) {
        if (plaeyer1position.containsAll(l)) {
            return "Player 1 wins!";
        } else if (plaeyer2position.containsAll(l)) {
            return "Player 2 wins!";
        }
    }

    if (plaeyer1position.size() + plaeyer2position.size() == 9) {
        return "No player wins.\n";
    }

    return "";
}
登录后复制

完整示例代码(包含优化建议)

import java.util.*;

public class TicTacToe {

    static ArrayList<Integer> plaeyer1position = new ArrayList<>();
    static ArrayList<Integer> plaeyer2position = new ArrayList<>();
    public static void main(String[] args) {
        char[][] board = {{' ', '|', ' ', '|', ' '},
                {'-', '+', '-', '+', '-'},
                {' ', '|', ' ', '|', ' '},
                {'-', '+', '-', '+', '-'},
                {' ', '|', ' ', '|', ' '}};

        gameboard(board);

        Scanner scn = new Scanner(System.in); // Scanner should be initialized once

        while(true) {
            System.out.println("Player 1, enter your position (1-9):");
            int position = getValidPosition(scn, board);
            bestimmmung_der_position(board, position, "Player 1");

            gameboard(board); // Print board after Player 1's move

            String result = checkWinner();
            if (!result.isEmpty()) {
                System.out.println(result);
                break;
            }


            System.out.println("Player 2, enter your position (1-9):");
            int position2 = getValidPosition(scn, board);
            bestimmmung_der_position(board, position2, "Player 2");

            gameboard(board); // Print board after Player 2's move

            result = checkWinner();
            if (!result.isEmpty()) {
                System.out.println(result);
                break;
            }

            if (plaeyer1position.size() + plaeyer2position.size() == 9) {
                System.out.println("It's a draw!");
                break;
            }
        }

        scn.close(); // Close the scanner to prevent resource leaks
    }

    public static void gameboard(char[][] board) {
        for (char[] row : board) {
            for (char c : row) {
                System.out.print(c);
            }
            System.out.println();
        }
    }

    public static void bestimmmung_der_position(char[][] board,int position, String spieler) {

        char symbol = ' ';

        if(spieler.equals("Player 1")){
            symbol = 'X';
            plaeyer1position.add(position);
        } else if (spieler.equals("Player 2")) {
            symbol = 'O';
            plaeyer2position.add(position);
        }


        switch (position) {
            case 1:
                board[0][0] = symbol;
                break;
            case 2:
                board[0][2] = symbol;
                break;
            case 3:
                board[0][4] = symbol;
                break;
            case 4:
                board[2][0] = symbol;
                break;
            case 5:
                board[2][2] = symbol;
                break;
            case 6:
                board[2][4] = symbol;
                break;
            case 7:
                board[4][0] = symbol;
                break;
            case 8:
                board[4][2] = symbol;
                break;
            case 9:
                board[4][4] = symbol;
                break;
            default:
                break;

        }
        //gameboard(board); // Removed duplicated call
    }

    public static String checkWinner(){

        List<Integer> top_zeile = Arrays.asList(1, 2, 3);
        List<Integer> mid_zeile = Arrays.asList(4, 5, 6);
        List<Integer> bot_zeile = Arrays.asList(7, 8, 9);

        List<Integer> links_reihe = Arrays.asList(1, 4, 7);
        List<Integer> mitte_reihe = Arrays.asList(2, 5, 8);
        List<Integer> rechts_reihe = Arrays.asList(3, 6, 9);

        List<Integer> diagonale_rechts = Arrays.asList(1, 5, 9);
        List<Integer> diagonale_links = Arrays.asList(7, 5, 3);

        List<List<Integer>> gewinner = new ArrayList<>();
        gewinner.add(top_zeile);
        gewinner.add(mid_zeile);
        gewinner.add(bot_zeile);
        gewinner.add(links_reihe);
        gewinner.add(mitte_reihe);
        gewinner.add(rechts_reihe);
        gewinner.add(diagonale_links);
        gewinner.add(diagonale_rechts);

        for (List<Integer> l : gewinner) {
            if (plaeyer1position.containsAll(l)) {
                return "Player 1 wins!";
            } else if (plaeyer2position.containsAll(l)) {
                return "Player 2 wins!";
            }
        }

        return "";
    }

    public static int getValidPosition(Scanner scanner, char[][] board) {
        int position;
        while (true) {
            try {
                position = scanner.nextInt();
                if (position < 1 || position > 9) {
                    System.out.println("Invalid input. Please enter a number between 1 and 9:");
                } else if (isPositionTaken(position, board)) {
                    System.out.println("Position is already taken. Please choose another position:");
                } else {
                    break; // Valid input, exit the loop
                }
            } catch (InputMismatchException e) {
                System.out.println("Invalid input. Please enter a number:");
                scanner.next(); // Consume the invalid input to prevent an infinite loop
                continue;
            }
        }
        return position;
    }

    public static boolean isPositionTaken(int position, char[][] board) {
        switch (position) {
            case 1:
                return board[0][0] != ' ';
            case 2:
                return board[0][2] != ' ';
            case 3:
                return board[0][4] != ' ';
            case 4:
                return board[2][0] != ' ';
            case 5:
                return board[2][2] != ' ';
            case 6:
                return board[2][4] != ' ';
            case 7:
                return board[4][0] != ' ';
            case 8:
                return board[4][2] != ' ';
            case 9:
                return board[4][4] != ' ';
            default:
                return true; // Should not happen, but handle it to avoid errors
        }
    }
}
登录后复制

总结

通过修正 checkWinner() 方法中的集合判断逻辑,并加入输入验证等优化措施,可以使井字棋游戏更加健壮和易用。 记住,理解集合类型的区别和正确使用集合方法是编写可靠代码的关键。 此外,良好的代码风格和注释也能显著提高代码的可读性和可维护性。

以上就是井字棋胜负判断教程:修复及优化的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号