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,如果我没有遵循好的做法,我很抱歉。
我不知道还能尝试什么。