Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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.
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.
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.
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.
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.
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.