Hallo Wir sollen für ein Schulprojekt ein Tic Tac Toe Programm in Java erstellen. Das hat alles auch soweit gut funktioniert, bis auf die Abbruchbedingung?

... komplette Frage anzeigen

2 Antworten

Ein Lösungsansatz wäre, du erstellst dir eine weitere Klasse, mit der du feststellst, ob für eine "Reihe" (Die diagonal, senkrecht oder waagerecht sein kann)  die Bedingung erfüllt ist.

z.B. wie der Name schon sagt: Bedingung, oder eben Condition.

Diese Klasse sollte nun drei Buttons entgegen nehmen und zwei Methoden haben: 

matches() um festzustellen, ob die Bedingung erfüllt ist.

getFirstButtonText() um den ersten Button-Text zu bekommen.

Damit weißt du,  wenn die Bedingung erfüllt ist: D.h. alle 3 Buttons den selben wert haben, wer der Sieger ist.

        static class Condition {

private JButton btn1, btn2, btn3;
public Condition(JButton btn1, JButton btn2, JButton btn3) {
this.btn1 = btn1; this.btn2 = btn2; this.btn3 = btn3; }

public boolean matches() {
if (btn1.getText().equals(btn2.getText()) && btn1.getText().equals(btn3.getText())) {
return true;
}
return false;
}

public String firstButtonText() {
return btn1.getText();
}
}

Damit das aufgeht, benötigst du in deiner Klasse als Instanz-Variable eine Liste von Bedingungen, die du später überprüfst:

private List<Condition> conditions = new ArrayList<>();

Nachdem du deine Buttons an dein Fenster gehängt hast, solltest du auch die Conditions setzen: Für jede Zeile, für jede Spalte und für jede Diagonale:

Condition row1 = new Condition(button1, button2, button3);
Condition row2 = new Condition(button4, button5, button6);
Condition row3 = new Condition(button7, button8, button9);

Condition column1 = new Condition(button1, button4, button7); Condition column2 = new Condition(button2, button5, button8); Condition column3 = new Condition(button3, button6, button9);
Condition diagonal1 = new Condition(button1, button5, button9); Condition diagonal2 = new Condition(button7, button6, button3);
conditions.addAll(Arrays.asList(new Condition[]{row1, row2, row3, column1, column2, column3, diagonal1, diagonal2}));

Wenn du das hast, solltest du dir in deine Spiel-Klasse noch eine Methode einbauen um zu einen möglichen Gewinner zu ermitteln:

public String checkWinner() {
    String winner = "";
    for (Condition condition : conditions) {
        if (condition.matches()) {
            winner = condition.firstButtonText();
            break;
        }
    }
    return winner;
}

Im Anschluss kannst du am Ende deines Actionlisteners dann auf diese Methode zugreifen und den Gewinner ausgeben lassen:

String winner= checkWinner();
if (winner.length() > 0) {
    JOptionPane.showConfirmDialog(window, "Und der Sieger ist: " + winner);
}
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von KnusperPudding
07.06.2016, 15:02

Kleine Korrektur: In Condition in der Methode matches sollte man noch überprüfen ob der Notwendige Wert nicht-leer ist:

!btn1.getText().isEmpty() && ...
0
Kommentar von JanSimonsen
14.06.2016, 11:49

Danke für die antwort habs hibekommen 

0

Den Text der Buttons auslesen und dann überprüfen, ob drei Buttons in einer Reihe den selben Text haben.

Einfacher wäre es aber, wenn du den Text (char o oder x) zusätzlich in einem 3x3 Array speicherst. Dann kannst du viel einfacher prüfen, ob je eine Spalte oder eine Reihe aus identischen Zeichen besteht. Dann musst du dich nur noch um die Diagonalen kümmern.

Aber ich will dir hier keine Lösung vorprogrammieren, das bekommst du auch hin ;)

if(count == 1 || count == 3 || count == 5 || count == 7 || count == 9){
letter = "X";
} else if(count == 2 || count == 4 || count == 6 || count == 8 || count == 10){
letter = "O";
}

Kannst du mit modulo verkürzen (https://de.wikipedia.org/wiki/Division_mit_Rest)

if( count % 2 == 0)
letter = "X";
else
letter = "O";
Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von JanSimonsen
14.06.2016, 11:49

Danke hat mir sehr geholfen 

0

Was möchtest Du wissen?