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 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]