Schleife für einen TicTacToe Computer

MaxgQ

Mitglied
Das ist ein einfacher Code für meinen Computer Spieler in TicTacToe. Dieser Code beschreibt, wenn sobald das Spielfeld 1 und 2 mit einem Kreuz besetzt ist, dann muss der Computer, wenn der Zug möglich ist sein Kreis im Feld 3 setzten damit er mich blocken kann. Meine Frage ist nun, ob jemand weiss, wie ich eine Endlose Schleife daraus bilden kann, damit ich nicht für jede einzelne Situation einen langen Code schreiben muss. Falls jemand eine Idee hätte, könnte ich auch noch den gesamten Code senden, falls es helfen sollte.


if (Game.getFieldContent(gameBoard, 1) == 'X' && Game.getFieldContent(gameBoard, 2) == 'X' && Game.validMove(4, gameBoard)) {
return 3;
}
 
Zuletzt bearbeitet:

NullCharm

Aktives Mitglied
Zum TicTacToe Spielen gehört schon etwas mehr Intelligenz, als nur nur zu versuchen, den Gegner zu blocken, sobald dieser 2 aufeinanderfolgende Steinchen setzt... sprich dein Ansatz ist falsch.
 

kneitzel

Top Contributor
Unabhängig, ob die Taktik perfekt ist oder nicht, kann man sich die ja einmal überlegen.

Hier wäre - wie so oft - immer das Teile und Herrsche wichtig: Du baust also viele Methoden.

Und das Vorgehen ist gar nicht so kompliziert: Du beschreibst das Problem einfach. Also: Was machst Du?
Mal dir ein Feld auf: Was musst Du machen?

- Du prüfst alle Zeilen
- Du prüfst alle Spalten
- Du prüfst die Diagonalen

Super! Der erste Anfang ist gemacht: Das kann schon in Java umsetzen: checkRows(); checkColumns(); checkDiagonals();

Jetzt kannst Du her gehen und dieses weiter prüfen. Das kann dann im ersten Schritt wirklich so sein:
Java:
void checkRows() {
    checkRow1();
    checkRow2();
    checkRow3();
}

Du kannst das aber auch schon direkt als Schleife schreiben - der Parameter ist dann eine Zeile.

Und was ist dann bei checkRow1? Das ist ein Check von 3 Feldern: checkFields(int field1, int field2, int field3) oder vielleicht auch direkt als Array/varargs: checkFields(int... fields)

Jetzt wirst Du sagen: Aber so schreibe ich viel Code! Das wollte ich doch explizit nicht!

==> Hier kommt das sogenannte Refactoring ins Spiel. Du schaust Dir immer das Ergebnis an um dann ggf. etwas umzuschreiben.
Wenn Du im Rahmen des Vorgangs hast, dass
Java:
checkRow1() {
    checkFields(1,2,3);
}
ist, dann brichst Du das Schreiben der checkRow Methoden ab und ersetzt die Aufrufe direkt durch checkFields Aufrufe.

Und wenn Du gewisse Regeln siehst, dann kannst Du es auch zusammen fassen. Dann wird die Check Methode evtl. einfach ein Algorithmus, der in einer Schleife die Reihen und Spalten prüft und dann am Ende noch zwei Aufrufe für die Diagonalen. Hier ist die Frage aber die Lesbarkeit. Da rate ich durchaus dazu, lieber mehr Methoden zu schreiben. Die Bezeichner bei den Methoden (Namen der Methode und Parameter) fungieren hier sozusagen zur Dokumentation.

Und nun bleibt halt noch das checkFields - mit den 3 Feldern. Da kannst Du dann ebenso vorgehen? Dazu kannst Du ja einfach mal überlegen: Was prüfst Du genau? Vielleicht siehst Du dann gute Ansätze. Zur Not schreibst Du halt etwas mehr Code. Das ist ein valider Ansatz. Aber immer auf doppelten Code schauen um den dann ggf. über eine Methode zu vereinheitlichen.
 

MaxgQ

Mitglied
Zum TicTacToe Spielen gehört schon etwas mehr Intelligenz, als nur nur zu versuchen, den Gegner zu blocken, sobald dieser 2 aufeinanderfolgende Steinchen setzt... sprich dein Ansatz ist falsch.

Mein Ansatz ist gar nicht falsch. Mein Programm funktioniert. Leider ist der Computer Gegner noch nicht so intelligent, dass er in der Lage ist perfekte Züge zu machen. Deshalb habe ich diese Methode versucht, welche total Sinn ergibt. Aber wen du schon so kritisch auf meine Frage reagierst, dann kannst du gerne für mich eine künstliche Intelligenz programmieren.
 

kneitzel

Top Contributor
Aber wen du schon so kritisch auf meine Frage reagierst, dann kannst du gerne für mich eine künstliche Intelligenz programmieren.
Das ist doch gar nicht notwendig. Da es nur 9 Felder gibt und Rechner heute genug Ressourcen haben, kannst Du alle Möglichkeiten incl. deren Entwicklung durchspielen. Alle Züge, bei denen der Gegner gewinnt, wirst Du nicht nehmen.

Hast Du mehrere Möglichkeiten, bei denen der Gegner nicht gewinnt, dann nimmst Du die Alternative, bei der das Verhältnis von Siegen zu Verlieren oder bei mehreren Optionen: Siegen zu Unentschieden am Besten ist.

Damit wirst Du immer ein Unentschieden erringen können.
 

kneitzel

Top Contributor
Nur um es zu quantifizieren und etwas mehr Logik rein zu bringen:
-> Du hast insgesamt maximal 9! Züge - das sind also um 360.000. Das ist zu hoch geschätzt, denn sobald ein Sieg eingetreten ist, wird ja nicht weiter gespielt. (Erster Spieler hat 9 Möglichkeiten, der zweite Spieler hat dann 8 Möglichkeiten, der erste Spieler hat dann nur noch 7 Möglichkeiten also 9*8*7*....

Das ist also durchaus machbar mit aktuellen Computern. Aber hier kann man dann auch vereinfachen, in dem wir z.B. beim Schach abschauen. Da gibt es Eröffnungsbibliotheken. Bei uns wäre das:
-> Computer macht ersten Zug immer in die Mitte.
--> Maximal 7! (5040)Möglichkeiten bleiben, wenn der Computer wieder am Zug ist.

-> Spieler macht ersten Zug in die Mitte -> Computer wählt zufällig eine Ecke aus.
-> Spieler macht ersten Zug nicht in die Mitte -> Computer wählt die Mitte.
--> 6! (720) Möglichkeiten bleiben, wenn der Computer wieder am Zug ist.

Und damit haben wir eine Sache, die wirklich unkompliziert ist. Diese "Eröffnungsbibliothek" kann man dann noch erweitern wenn man möchte.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T String aus While Schleife für ganze Klasse sichtbar machen Allgemeine Java-Themen 5
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
Lukas2904 Schleife mit ansteuerung einer Klasse Allgemeine Java-Themen 5
A For-Schleife Allgemeine Java-Themen 5
J Algorithmen Analyse einer Schleife Allgemeine Java-Themen 6
1 Klassen Variabel aus Schleife übergeben Allgemeine Java-Themen 8
D "Automatisierte", variable verschachtele for-Schleife Allgemeine Java-Themen 9
F Schleife funktioniert nicht richtig Allgemeine Java-Themen 13
K For-Schleife <> oder != Operator verwenden? Allgemeine Java-Themen 2
J Einen Thread in einer Schleife Allgemeine Java-Themen 2
D While-Schleife - if Zweig unterbrechen Allgemeine Java-Themen 1
F Zweifache For-Schleife Allgemeine Java-Themen 6
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
M While-Schleife schneller, solange die Abbruchbedingung nicht vom Schleifeninneren abhängt Allgemeine Java-Themen 3
S Variablen String[] Array per schleife in int[] einlesen Allgemeine Java-Themen 8
D Methoden Buttons erscheinen doppelt nach Wiederholung in Schleife Allgemeine Java-Themen 1
RalleYTN Problem bei Schleife die durch einen 2D raum iterieren soll Allgemeine Java-Themen 1
T for - Schleife Allgemeine Java-Themen 1
J While Schleife ausführen bis Zahl = X Allgemeine Java-Themen 19
R Komplizierte Schleife Allgemeine Java-Themen 1
Q For-Schleife in String-Value Allgemeine Java-Themen 3
F Abstrakte Klasse in "For each" Schleife Allgemeine Java-Themen 1
F for-Schleife auf Kommandoebene ausgeben Allgemeine Java-Themen 9
P Input/Output java.util.Scanner in einer Schleife und Exception-Behandlung: Einlesen einer Zahl Allgemeine Java-Themen 4
P Erweiterte For Schleife Allgemeine Java-Themen 7
D Arraylist/For Schleife/Scanner Allgemeine Java-Themen 30
Y automatisierte for Schleife Allgemeine Java-Themen 13
B For schleife und weiter? Allgemeine Java-Themen 8
D Probleme bei for-Schleife Allgemeine Java-Themen 4
L einfache Verzinsung mit for-Schleife & Ausschluss von Werten beim Einlesen Allgemeine Java-Themen 5
N Frage zur while-Schleife Allgemeine Java-Themen 18
M for Schleife mit Swing Button abbrechen Allgemeine Java-Themen 7
M PdfPTable per for-Schleife befüllen Allgemeine Java-Themen 3
F for-Schleife mit : Allgemeine Java-Themen 5
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
A Collections Array-Elemente in ArrayList kopieren ohne Schleife Allgemeine Java-Themen 7
P Variablen Auf durch for-Schleife generierte JComboBox zugreifen Allgemeine Java-Themen 3
G while Schleife ausführen solange eine Taste gedrückt ist Allgemeine Java-Themen 14
F Foreach und for - Schleife Allgemeine Java-Themen 10
W Berechnung Durchschnitt mit Schleife Allgemeine Java-Themen 9
S for-Schleife, while-Schleife Problem Allgemeine Java-Themen 6
H Netbeans Warning bei Thread.sleep in Schleife Allgemeine Java-Themen 4
A java.lang.NullPointerException bei Schleife Allgemeine Java-Themen 3
S Erste Schritte Exception beendet Schleife nicht - Methode macht trotz throw weiter? Allgemeine Java-Themen 9
R while schleife auf 3 durchgänge beschränken Allgemeine Java-Themen 6
V anstatt thread.join() einfach while schleife? Allgemeine Java-Themen 8
x22 for-Schleife Allgemeine Java-Themen 76
S Text in for Schleife in Label einfügen Allgemeine Java-Themen 4
J Schleife mit : Allgemeine Java-Themen 18
S Klassen in einer Schleife durchlaufen Allgemeine Java-Themen 11
E Schleife wird nicht ausgeführt!!! Allgemeine Java-Themen 8
C Schleife mit leerem Anweisungsblock wird trotz erfüllter Bedingung nicht verlassen Allgemeine Java-Themen 9
S Do-While Schleife bricht nicht ab Allgemeine Java-Themen 3
S Erste Schritte if-Anweisung in for- oder while-schleife umwandeln Allgemeine Java-Themen 3
K CheckBox schleife Allgemeine Java-Themen 2
D Methoden Thread Schleife Status Allgemeine Java-Themen 7
J Verschiedene Klassen als "Object" in ArrayList und dann in for-Schleife erzeugen!? Allgemeine Java-Themen 2
R In einer for Schleife bei einem Substring anfangen, wo man davor aufgehört hat Allgemeine Java-Themen 6
T Rekursion mit While Schleife kombinieren? Allgemeine Java-Themen 4
D Sterne Muster mit einer Schleife Allgemeine Java-Themen 5
Dragonfire Code Konvention for-Schleife / return Allgemeine Java-Themen 15
hdi Detail-Frage zur for-Schleife Allgemeine Java-Themen 9
J Thread pausieren, lange while-Schleife Allgemeine Java-Themen 8
Q Variable aus Schleife/Switch benutzen Allgemeine Java-Themen 7
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
C Geschachtelte For-Schleife: Äußere Schleife wird nur einmal durchlaufen!? Allgemeine Java-Themen 3
W While-ESC-Schleife funktioniert nicht Allgemeine Java-Themen 3
W return Collection mit schleife durchsuchen Allgemeine Java-Themen 10
H Threads.... ich will aus der While-Schleife raus Allgemeine Java-Themen 6
calzone Warum wird nicht aus der Schleife gesprungen ? Allgemeine Java-Themen 2
lacyuu Schleife hängt sich auf, wieso?? Allgemeine Java-Themen 2
ModellbahnerTT Problem: Schleife über Textdatei Allgemeine Java-Themen 5
J Schachbrett mit for- oder while-Schleife Allgemeine Java-Themen 22
I For- Schleife falsch? Allgemeine Java-Themen 8
T Schleife kurzzeitig anhalten Allgemeine Java-Themen 5
V Problem in While-Schleife Allgemeine Java-Themen 3
Escorter Switch in der Schleife! Allgemeine Java-Themen 4
C Auswertung der for each schleife? Allgemeine Java-Themen 2
GilbertGrape foreach Schleife Allgemeine Java-Themen 12
J FOR-Schleife-Problem Allgemeine Java-Themen 10
G Schleife durch Button beenden Allgemeine Java-Themen 6
S Schleife funktioniert nicht Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
T getParameter in while schleife Allgemeine Java-Themen 3
O while - Schleife unterbrechen mit break; Allgemeine Java-Themen 5
R array.length in For-Schleife verwenden? Allgemeine Java-Themen 22
V Schleife funktioniert nicht wie gewünscht Allgemeine Java-Themen 5
T Schleife im Konstruktor? Allgemeine Java-Themen 9
S Schleife mit Durchlaufrate Allgemeine Java-Themen 5
R Per for schleife string propertys in einer datei speichern Allgemeine Java-Themen 15
H In Testklasse Objekte erzeugen und in einer Schleife ausgebe Allgemeine Java-Themen 4
M Problem mit while/do Schleife Allgemeine Java-Themen 12
B Try/Catch in While-Schleife mit Scanner - Hilfe! Allgemeine Java-Themen 3
M schleife? Allgemeine Java-Themen 6
G Daten aus einer For Schleife zwischen speichern Allgemeine Java-Themen 4
F While(true)-Schleife im JPanel Allgemeine Java-Themen 9
H Schleife um Methode Allgemeine Java-Themen 7
S In der For-schleife jeweils ein neues Array erstellen Allgemeine Java-Themen 8
S Endlos-Schleife bei Ausgabe von ArrayList Allgemeine Java-Themen 6

Ähnliche Java Themen


Oben