TicTacToe

c52jrear

Neues Mitglied
Hallo an alle. Ich bin seit ca. 3 Wochen mit dem Thema Java beschäftigt und habe ein TicTacToe aus einem Youtube Video nachprogrammiert und soweit funktionniert alles.

Das problem ist jedoch das durch das break; in der if Abfrage nach der checkWinner() Methode das Spiel abbricht. Wenn ich dieses auskommentiere funktioniert das Programm wieder.
Dazu die erste Frage: Wie genau funktioniert der Befehl: if(result.length > 0)? Was wird mit 0 verglichen?
Die zweite Frage: Ist das für so eine Bedingung geeignet? Wenn nein, dann bitte eine alternative vorschlagen.

Danke

[CODE lang="java" title="TicTacToe" highlight="43, 61"]import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class TicTacToe {

static ArrayList<Integer> playerPositions = new ArrayList<Integer>();
static ArrayList<Integer> cpuPositions = new ArrayList<Integer>();

public static void main(String[] args) {
// Spielfeld
char [] [] gameBoard = {{' ', '|', ' ', '|', ' '},
{'-', '+', '-', '+', '-'},
{' ', '|', ' ', '|', ' '},
{'-', '+', '-', '+', '-'},
{' ', '|', ' ', '|', ' '}};

// Ausgabe Spielfeld
printGameBoard(gameBoard);

while(true) {
// Feldwahl Spieler
Scanner scan = new Scanner(System.in);
System.out.println("Bitte Feld wählen (1-9): ");
int playerPos = scan.nextInt();
// Damit die Auswahl nicht von der CPU überlagert wird
while(playerPositions.contains(playerPos) || cpuPositions.contains(playerPos)) {
System.out.println("Feld besetzt.");
System.out.println("Bitte neues Feld wählen: ");
playerPos = scan.nextInt();
scan.close();
}

// Spielerwahl Ausgabe
placePiece(gameBoard, playerPos, "Player");

// Gewinner prüfen
String result = checkWinner();
if(result.length() > 0) {
System.out.println(result);
break; // FEHLER sofortiger Abbruch mit diesem break...
}

// Feldwahl CPU - mit Zufallsgenerator
Random rand = new Random();
int cpuPos = rand.nextInt(9) + 1;
// Damit die Auswahl nicht vom Player überlagert wird
while(playerPositions.contains(cpuPos) || cpuPositions.contains(cpuPos)) {
cpuPos = rand.nextInt(9) + 1;
}
// CPUwahl Ausgabe
placePiece(gameBoard, cpuPos, "CPU");

printGameBoard(gameBoard);
// Gewinner prüfen
result = checkWinner();
if(result.length() > 0) {
System.out.println(result);
break; // FEHLER sofortiger Abbruch mit diesem break...
}

}

}

// Das Spielfeld
public static void printGameBoard(char [] [] gameBoard) {
for(char[] row : gameBoard) {
for(char c : row) {
System.out.print(c);
}
System.out.println();
}
}

// Feldwahl
public static void placePiece(char [] [] gameBoard, int pos, String user) {
char symbol = ' ';

if(user.equals("Player")) {
symbol = 'X';
playerPositions.add(pos);
} else if(user.equals("CPU")) {
symbol = 'O';
cpuPositions.add(pos);
}

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

default:
System.out.println("Falsche Eingabe.");
}

}

// Gewinner ermitteln
public static String checkWinner() {

// Gewinnmöglichkeiten
List topRow = Arrays.asList(1, 2, 3);
List midRow = Arrays.asList(4, 5, 6);
List botRow = Arrays.asList(7, 8, 9);
List leftCol = Arrays.asList(1, 4, 7);
List midCol = Arrays.asList(2, 5, 8);
List rightCol = Arrays.asList(3, 6, 9);
List cross1 = Arrays.asList(1, 5, 9);
List cross2 = Arrays.asList(7, 5, 3);

List<List> winning = new ArrayList<List>();
winning.add(topRow);
winning.add(midRow);
winning.add(botRow);
winning.add(leftCol);
winning.add(midCol);
winning.add(rightCol);
winning.add(cross1);
winning.add(cross2);

// Abfrage der Bedingungen
for(List l : winning) {
if(playerPositions.containsAll(l)) {
return "Glückwunsch Du hast gewonnen!";
} else if(cpuPositions.containsAll(l)) {
return "Computer hat gewonnen!";
} else if(playerPositions.size() + cpuPositions.size() == 9) {
return "Unentschieden!";
}
}

return " ";
}

}
[/CODE]
 
Das das Programm sich beendet ist dadurch erklärbar, dass mit dem break ja die Endlosschleife while(true) verlassen wird.

Und das, was da verglichen wird, ist die Länge des Strings, der zurück gegeben wird. Ich vermute, dass Du den Code falsch abgeschrieben hast und das return am Ende von checkWinner den leeren String zurück geben soll (Also ohne das Leerzeichen zwischen den Anführungszeichen:
Java:
return ""; // Ohne Leerzeichen statt eben
return " ";

result.length ist die Länge der Zeichenkette. Diese ist 0, wenn niemand gewonnen hat und das Spiel nicht unentschieden ist. Aber sobald checkWinner eine Zeichenkette zurück gibt, dann ist das Spiel zuende.

Mit dem veränderten return macht das break; auch Sinn. Wenn nach einem Zug das Spiel vorbei ist, dann soll er aus dieser Endlosschleife aussteigen.
 
Wow, kann ich nur sagen - sowas "banales"!!! Vielen Dank für die Lösung und die Erklärung!!! Ich wäre nie auf das Leerzeichen gekommen. Aber naja, jetzt was dazu gelernt!!!
 

Zurück
Oben