Hilfe bei Java Tic Tac Toe

s_1895

Mitglied
Ich komme bei Java Tic Tac Toe nicht weiter iwo sind fehler 🙁

[CODE lang="java" title="Tic Tac Toe"]import java.util.Scanner;

public class TTT {

public static void main(String[] args) {
Scanner eingabe = new Scanner(System.in);

char[][] field = {
{'1', '2', '3'},
{'4', '5', '6'},
{'7', '8', '9'}
};
drawField(field);

boolean gameover = false;
int turnCount = 0;
while (!gameover && turnCount < 9) {
System.out.println("Current player: "
+ getTurnCharacter(turnCount));
System.out.print("Please enter field number: ");
int nextPos = eingabe.nextInt() - 1;

doTurn(nextPos, getTurnCharacter(turnCount), field);
drawField(field);

gameover = checkWinConditions(field);
if (!gameover) {
turnCount++;
}
}
if (gameover) {
System.out.println(getTurnCharacter(turnCount) + " has won");
} else {
System.out.println("DRAW");
}
}

public static void drawField(char[][] field) {
for (int i = 0; i < field.length; i++) {
System.out.println("+---+---+---+");

System.out.print("|");
for (int j = 0; j < field.length; j++) {
System.out.print(" " + field[j] + " |");
}
System.out.println();

}
System.out.println("+---+---+---+");
}

public static void doTurn(int nextPos, char turnPlayerCharacter,
char[][] field) {

int row = nextPos / 2 - 1;
int column = nextPos % 3;
field[row][column] = turnPlayerCharacter;
}

public static char getTurnCharacter(int turnCount) {
char currentTurnCharacter = 'O';
if (turnCount % 2 == 0) {
currentTurnCharacter = 'X';
}
return currentTurnCharacter;
}

public static boolean checkWinConditions(char[][] field) {
return checkStraightWinCondition(field)
|| checkDiagonalWinCondition(field);
}

public static boolean checkStraightWinCondition(char[][] field) {
boolean winFound = false;

int i = 0;
while (i < field.length && !winFound) {
winFound = field[0] == field[1]
&& field[0] == field[2];
if (!winFound) {
winFound = field[0] == field[1]
&& field[0] == field[2];
}
i++;
}
return winFound;
}

public static boolean checkDiagonalWinCondition(char[][] field) {
boolean diagonal1 = field[0][0] == field[1][1]
&& field[0][0] == field[2][2];
boolean diagonal2 = field[0][2] == field[1][1]
&& field[0][2] == field[2][0];
return diagonal1 || diagonal2;
}

}[/CODE]
 
Das war ein Hinweis darauf, dass Du auch verraten könntest, wobei Du nicht weiterkommst und wieso Du darauf kommst, dass Fehler enthalten sind, d. h. an welcher Stelle treten Fehler auf bzw. wie wirken sich diese aus?
 
Das ist ja mal ein Ansatz 🙂 Wenn Du 4 eingibst, wird nextPos mit 3 berechnet und doTurn mit nextPos aufgerufen. Dort wird berechnet:
Java:
        int row = nextPos / 2 - 1;
        int column = nextPos % 3;
D. h. row ist 0 und column ist 0, sodass das Feld mi der "1" belegt wird.

Offensichtlich ist die Berechnung der Zeile falsch. Überlegen wir mal kurz: bei nextPos 0,1,2 soll 0 das Ergebnis sein, bei 3,4,5 die 1 und bei 6,7,8 die 2. Die ersten Positionen sind als 0, 3 und 6. Da könnte man doch einfach durch 3 teilen:
Java:
    int row = nextPos / 3;
    int column = nextPos % 3;
Und ja, das gibt Sinn, denn einmal wird das Ergebnis der Division mit 3 ohne Rest und einmal der dazugehörige Rest ermittelt.
 
Danke 🙂 jetzt läuft es wie es soll, glaub ich zumindest, also die Eingabe stimmt jetzt so, mir wurde nur gesagt ich hab paar Fehler und soll es mir nochmal angucken und mein Dozent war leider nicht so freundlich mir zu sagen wo genau die Fehler sind
 
noch eine frage, falls du gerade zeit hast 🙂
Das ist ja mal ein Ansatz 🙂 Wenn Du 4 eingibst, wird nextPos mit 3 berechnet und doTurn mit nextPos aufgerufen. Dort wird berechnet:
Java:
        int row = nextPos / 2 - 1;
        int column = nextPos % 3;
D. h. row ist 0 und column ist 0, sodass das Feld mi der "1" belegt wird.

Offensichtlich ist die Berechnung der Zeile falsch. Überlegen wir mal kurz: bei nextPos 0,1,2 soll 0 das Ergebnis sein, bei 3,4,5 die 1 und bei 6,7,8 die 2. Die ersten Positionen sind als 0, 3 und 6. Da könnte man doch einfach durch 3 teilen:
Java:
    int row = nextPos / 3;
    int column = nextPos % 3;
Und ja, das gibt Sinn, denn einmal wird das Ergebnis der Division mit 3 ohne Rest und einmal der dazugehörige Rest ermittelt.
Noch eine Frage falls du gerade zeit hast 🙂
Kann ich dass iwie machen dass wenn spieler X 1 wählt und spieler 2 auch er das nicht überschreiben kann
 
Sicher. Das kann man noch etwas verallgemeinern: wenn auf einem Feld bereits ein X oder ein O eingetragen ist, dann darf der Zug nicht durchgeführt werden.
 

Zurück
Oben