Java Editor Tic Tac Toe Gewinner ermitteln?

Bild1 - (Schule, programmieren, Java) Bild2 - (Schule, programmieren, Java)

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

DerTino123 
Fragesteller
 12.05.2017, 15:03

Vielen Dank für die Antwort.

Diese Zeilen mit Erste Reihe etc. muss ich definieren richtig?

mfg DerTino123

0
KnusperPudding  12.05.2017, 16:00
@DerTino123

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.

0
KnusperPudding  13.05.2017, 10:47
@DerTino123

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.

0
DerTino123 
Fragesteller
 13.05.2017, 17:01
@KnusperPudding

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

0
KnusperPudding  13.05.2017, 18:16
@DerTino123

Sorry:

List<String> values = new ArrayList<>();

Import für List ist java.util.List;

0
DerTino123 
Fragesteller
 13.05.2017, 20:07
@KnusperPudding

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

0
KnusperPudding  14.05.2017, 09:55
@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>();
0

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.