Java TicTacToe 在玩家 O 获胜时显示 2 倍的获胜文本,但在玩家 X 获胜时不显示

问题描述 投票:0回答:0
public class TicTacToe {

    static boolean won = false;
    static boolean firstRound = true;
    static List<String> fields = new ArrayList<>();
    static List<Integer> winList = new ArrayList<>();

    public static void main(String[] args) {

        for (Integer i = 0; i <= 9; i++) {fields.add(i.toString());}

        while (!won) {

            draw(1, "1");

            for (int i = 1; i <= 9; i++) {

                if (checkWin() == 'X') {
                    won = true;
                    break;
                } else if (checkWin() == 'O') {
                    won = true;
                    break;
                } else if (i % 2 == 0) {
                    playerTurn('X');
                } else {
                    playerTurn('O');
                }

                if (i == 9) {
                    System.out.println("Unentschieden!");
                    won = true;
                    break;
                }

            }

            if (won) {
                break;
            }

        }

    }

    public static void draw(int field, String symbol) {

        if (firstRound) {
            firstRound = false;
        } else {
            fields.set(field, symbol);
        }

        System.out.println("+---+---+---+");
        System.out.println("| " + fields.get(1) + " | " + fields.get(2) + " | " + fields.get(3) + " |");
        System.out.println("+---+---+---+");
        System.out.println("| " + fields.get(4) + " | " + fields.get(5) + " | " + fields.get(6) + " |");
        System.out.println("+---+---+---+");
        System.out.println("| " + fields.get(7) + " | " + fields.get(8) + " | " + fields.get(9) + " |");
        System.out.println("+---+---+---+");

    }

    public static void playerTurn(Character player) {

        Scanner in = new Scanner(System.in);

        while (true) {

            System.out.print("Spieler " + player + ", gib eine Zahl für das Feld ein: ");
            String input = in.next();

            if (input.matches("[1-9]")) {
                if (checkField(Integer.parseInt(input))) {
                    draw(Integer.parseInt(input), player.toString());
                    break;
                }
            } else {
                System.out.println("Falsche Eingabe! Gib eine Zahl von 1 bis 9 ein.");
            }

        }

    }

    public static boolean checkField(int field) {

        if (fields.get(field).equals("X") || fields.get(field).equals("O")) {
            System.out.println("Feld ist schon besetzt! Wähle ein anderes.");
            return false;
        } else {
            return true;
        }

    }

    public static Character checkWin() {

        winList.add(123);
        winList.add(456);
        winList.add(789);
        winList.add(147);
        winList.add(258);
        winList.add(369);
        winList.add(159);
        winList.add(357);

        for (Integer combo : winList) {

            Character a = combo.toString().charAt(0);
            int num1 = Integer.parseInt(a.toString());
            Character b = combo.toString().charAt(1);
            int num2 = Integer.parseInt(b.toString());
            Character c = combo.toString().charAt(2);
            int num3 = Integer.parseInt(c.toString());

            if (fields.get(num1).equals("X") && fields.get(num2).equals("X") && fields.get(num3).equals("X")) {
                System.out.println("Spieler X hat gewonnen!");
                return 'X';

            } else if (fields.get(num1).equals("O") && fields.get(num2).equals("O") && fields.get(num3).equals("O")) {
                System.out.println("Spieler O hat gewonnen!");
                return 'O';
            }

        }

        return 'N';

    }

}

当我作为玩家 O 获胜时,获胜文字会显示 2 次。但是当我作为另一个玩家获胜时,它只显示一次。我不知道为什么。其他所有旨在工作的东西都按预期工作,但只有这个小细节不起作用。

我的代码不是很好,我现在正在学习 Java,如果我没有遵循好的做法,我很抱歉。

我不知道还能尝试什么。

java tic-tac-toe
© www.soinside.com 2019 - 2024. All rights reserved.