Java Editor Tic Tac Toe Gewinner ermitteln?
Guten Tag,
im Moment sollen wir in unseren Informatik Kurs das Spiel Tic Tac Toe programmieren. Als Editor benutzen wir den JavaEditor. Das Programm habe ich soweit fertig, jedoch verstehe ich nicht, wie ich den Gewinner ermitteln soll. Es wäre nett, wenn mir jemand helfen könnte.
mfg DerTino123


3 Antworten
Aktuell ist dein Programm so gestaltet, dass die Buttons per FlowLayout nacheinander angeordnet sind, und vermutlich immer nach 3 Buttons 'umbricht' sodass du bei 3 Buttons drei Zeilen hast.
Bei Tic Tac Toe gibt es mehrere Optionen um zu gewinnen:
- Drei gleiche in einer Reihe (3 Reihen)
- Drei gleiche in einer Spalte (3 Spalten)
- Drei gleiche Diagonal (Zwei Diagonale).
Du könntest theoretisch nun eine 2D-Array nutzen um dort die Indizes der einzelnen Buttons zu speichern, Beispielsweise für die erste Möglichkeit:
Erste Reihe = Button Index: 0, 1, 2
Zweite Reihe = Button Index: 3, 4, 5
byte[][] check =
{
{0, 1, 2},
{3, 4, 5}
};
Die eine Dimension deckt alle Möglichkeiten ab, die zweite Dimension deckt alle Indizes ab: Sodass du in einem Schleifendurchlauf die Möglichkeiten durchgehst und in der zweiten Schleife den Gewinner ermitteln kannst.
Ja, richtig, genauso wie in dem Beispiel:
{0, 1, 2}
Entspricht der
ersten Zeile.
{3, 4, 5}
Entspricht der
zweiten Zeile, usw.
Da du ja mehrere Konstellationen hast, so kannst du alle Möglichkeiten ebenfalls in einer Array speichern. - Weshalb ich in meinem Beispiel eine 2-Dimensionale Array verwende:
Die eine Array definiert eine Mögliche Kombination und die zweite, 'Darübergestülpte' definiert alle Kombinationen.
Naja, fast.
Deine check-2D Array solltest du als Klassen-Variable deklarieren.
Dann benötigst du eine Methode, welche die Prüfung vor nimmt, ob gewonnen wurde:
private String checkWin() {
// Durchlaufen der Kombinationsliste
for (int i = 0; i < check.length; i++) {
// Die einzelne Check-Kombination
byte[] checkKombination = check[i];
// Liste, in der Unterschiedliche Werte gesammelt werden.
List values = new ArrayList<>();
// Durchlaufen der CheckKombination
// Speichern von Unterschiedlichen Werten in einer Liste.
for (int j = 0; j < checkKombination.length; j++) {
// Pro Eintrag in CheckKombination prüfen wir aus der Button-Array den Wert und hängen ihn eindeutig an die valuesListe an.
String buttonLabel = b[j].getLabel();
if (!values.contains(buttonLabel)) {
values.add(buttonLabel);
}
}
// Es gibt nun drei Möglichkeiten:
// Die Array hat einen Wert, nämlich einen Leeren, weil für diese Kombination noch nichts vorhanden ist
// Die Array hat einen Wert, nämlich entweder X oder Y, und somit steht ein gewinner fest
// Die Array hat zwei Werte, und somit gibt es für die Kombination keinen gewinner.
// Entsprechend ist nur eine Kombination zu prüfen:
// Ein Eintrag und dieser Eintrag darf nicht leer sein. In diesem Falle wird der 'Gewinner' zurück gegeben
// Alternativ wird die Schleife fortgesetzt und notfalls eben kein Gewinner, sondern ein LeerEintrag zurück gegeben
if (values.size() == 1 && !values.get(0).equals("")) {
return values.get(0);
}
}
return "";
}
diese kannst du dann beim Button-Drücken überprüfen. Nachdem du den Wert auf den Button geschrieben hast. - Die Stelle daher wäre wohl in einem Actionlistener.
Ok danke für die ausführliche Erklärung. Ich habe alles verstanden, bis auf die Zeile List values = new ArrayList<>(); , denn hier steht im Programm die Fehlermeldung illegal start of type hättest du eine Idee wie ich diesen beheben könnte? Tut mir leid, dass ich so viele Fragen stelle, jedoch kenne ich mich in Java nicht so sehr aus.
mfg DerTino123
Danke für die Antwort. Jedoch bekomme ich immer noch die Fehlermeldung. Ist irgendwie schon komisch. Die Fehlermeldung bezieht sich glaube ich auf die <> Zeichen.
mfg DerTino123
Was die Spitz-Klammern betrifft: Diese stehen für den sogenannten Generics-Typ. Hier String.
Sollte es sein wie du vermutest, dass die Spitz-Klammern angemeckert werden, so kann es an der Java-Version liegen. Ab Java 8 gibt es das sogenannte Diamond Interface, sodass man den Generics-Typen nicht immer voll ausschreiben muss.
Versuche daher mal:
List<String> values = new ArrayList<String>();
Liste alle möglichen Ausgangskombinationen für einen Sieg auf. Ob in einem Array, verschiedenen Strings oder Byte-Variablen, ist egal.
Da musst du dir was einfallen lassen, da es nichts bringt wenn wir dir das sagen.
Ich habs damals mit einem Array gemacht, wo alle Möglichen Kombinationen drinstehen die man zum Gewinnen brauch und hab dann damit verglichen so als Anreiz für dich.
Vielen Dank für die Antwort.
Diese Zeilen mit Erste Reihe etc. muss ich definieren richtig?
mfg DerTino123