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

kneitzel

Gast
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.
 

c52jrear

Neues Mitglied
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!!!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K TicTacToe belegtes feld nicht neu besetzbar Java Basics - Anfänger-Themen 1
K TicTacToe belegtes Feld nicht neu besetzbar Java Basics - Anfänger-Themen 3
enesss tictactoe spiel Java Basics - Anfänger-Themen 5
Jxhnny.lpz TicTacToe Spiel vs Computer. (Probleme) Java Basics - Anfänger-Themen 7
TicTacToe Java Basics - Anfänger-Themen 6
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
A Überprüfung in TicTacToe Java Basics - Anfänger-Themen 5
A TicTacToe Java Basics - Anfänger-Themen 8
tom.j85 TicTacToe - probleme beim Casten Java Basics - Anfänger-Themen 6
K Fehler beim Programmieren von TicTacToe Java Basics - Anfänger-Themen 12
J TicTacToe Java Basics - Anfänger-Themen 2
A TicTacToe funktioniert bis auf "schiefer" Sieg Java Basics - Anfänger-Themen 6
shiroX Input/Output TicTacToe-Savegame Java Basics - Anfänger-Themen 1
shiroX Methoden Mögliche Spielstände bei TicTacToe Java Basics - Anfänger-Themen 14
M Array und Objektorientierung? - TicTacToe Spiel Java Basics - Anfänger-Themen 43
P TicTacToe Problem mit Win Methode Java Basics - Anfänger-Themen 4
Z TicTacToe mit Array Java Basics - Anfänger-Themen 6
T TicTacToe Spielfeld Java Basics - Anfänger-Themen 7
B TicTacToe Java Basics - Anfänger-Themen 2
S TicTacToe Java Basics - Anfänger-Themen 4
I TicTacToe blöde KI Java Basics - Anfänger-Themen 2
I Fehler bei TicTacToe Java Basics - Anfänger-Themen 108
G TicTacToe KI Java Basics - Anfänger-Themen 15
C Problem TicTacToe Java Basics - Anfänger-Themen 6
P 3D TicTacToe - Unentschieden Java Basics - Anfänger-Themen 5
G Tictactoe Java Basics - Anfänger-Themen 9
B TicTacToe Programmieren Java Basics - Anfänger-Themen 2
M Einfaches TicTacToe Programm Java Basics - Anfänger-Themen 19
H TicTacToe Fehler beim Compilieren Java Basics - Anfänger-Themen 7
cizzo TicTacToe Java Basics - Anfänger-Themen 6
W TicTacToe - Porblem mit dem Code.. Java Basics - Anfänger-Themen 5
H Hilfe bei TicTacToe mit jEdit Java Basics - Anfänger-Themen 7
0 TicTacToe, Problem mit den Checkbox-Aktionen Java Basics - Anfänger-Themen 6
N brauche hilfe zu tictactoe Java Basics - Anfänger-Themen 2
kulturfenster Problem bei TicTacToe Java Basics - Anfänger-Themen 11
P Ein einfaches Spiel: TicTacToe. Fehler und Vorschläge Java Basics - Anfänger-Themen 3
H TicTacToe: Zeit zwischen Zügen lassen Java Basics - Anfänger-Themen 9
M TicTacToe Java Basics - Anfänger-Themen 7
H TicTacToe-geeignete Klassenhierarchie Java Basics - Anfänger-Themen 3
G Hilfe bei TicTacToe Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben