Tic Tac Toe und Minimax - Erstellen einer unvollkommenen AI auf einem Mikrocontroller

8

Ich habe ein Tic-Tac-Toe-Spiel auf einem Mikrocontroller erstellt, einschließlich einer perfekten KI (perfekte Bedeutung, dass es nicht verliert). Ich habe dafür keinen Minimax-Algorithmus benutzt, nur eine kleine Zustandsmaschine mit allen möglichen und optimalen Bewegungen. Mein Problem ist jetzt, dass ich verschiedene Schwierigkeiten (leicht, mittel und schwer) implementieren wollte. Die KI wäre bisher die harte. Also habe ich darüber nachgedacht, wie ich das am besten machen kann und wollte den minimax -Algorithmus verwenden, aber in einer Weise, dass er alle Punkte für alle Spielpositionen berechnet, so dass ich manchmal auch die zweitbeste Punktzahl wählen kann der Besten. Da ich all diese Berechnungen nicht immer auf dem Mikrocontroller selbst durchführen kann, wollte ich ein kleines Programm erstellen, das ich auf meinem Computer ausführen kann, das mir Arrays aller möglichen Board-Zustände (in Bezug auf Symmetrie, ect, um den Speicher zu minimieren) gibt verwendet) und ihre entsprechenden Punkte. Dazu habe ich zuerst versucht, den Minimax-Algorithmus selbst zu implementieren, in Bezug auf depth , um die scores jedes Zustands richtig zu berechnen. Es sollte mir dann alle optimalen Moves (vorerst) in einem Array zurückgeben. Es scheint jedoch nicht so gut zu funktionieren. Ich habe versucht, es mit einigen printf Zeilen zu debuggen. Hier ist der Code von sowohl der Funktion minimax als auch meiner Hauptfunktion:

%Vor%

Das main ist:

%Vor%

Außerdem habe ich einige Variablen:

%Vor%

Sowie meine gewinnende Funktion:

%Vor%

Aus irgendeinem Grund, wenn das Minimax das letzte Mal von depth 7 schrittweise nach depth 1 zurückkehrt, überschreibt es mein Array g_moves mit allen 0, was zu den folgenden Zeilen in meiner gedruckten Ausgabe führt (nur die letzten 70 Zeilen):

%Vor%

Wenn Sie weitere Informationen benötigen, um mir zu helfen, werde ich sie Ihnen gerne zur Verfügung stellen, wenn ich sie selbst habe.

Vielen Dank im Voraus.

BEARBEITEN: Also habe ich meine minimax -Funktion neu geschrieben, so dass sie jetzt alle möglichen Board-Zustände in einer .txt-Datei mit Hilfe der Konsole (cmd: ./NAME_OF_FILE & gt; DEST_NAME.txt im entsprechenden Ordner) druckt. Der Code ist der folgende:

%Vor%

Mein nächster Schritt ist, die Tafel mit der maximalen score jeder Bewegung an der entsprechenden Position auszudrucken.

%Vor%

EDIT 2: Ich habe jetzt eine weitere Funktion namens printScoredBoards hinzugefügt, die im Grunde genommen das tun soll, was ich oben in meiner letzten Bearbeitung beschrieben habe, aber es gibt ein Problem damit. Da es immer möglich ist, nach dem 5. Zug zu gewinnen, wenn dein Gegner blöd genug spielt und der minimax alle Möglichkeiten einschließlich der folgenden mit dem folgenden Code ausprobiert, bekomme ich eine gewertete Tafel aller 15er für das leere Brett.

%Vor%

Dies ist, obwohl die Ecken mehr wert sein sollten und das Zentrum am wenigsten wertvoll ist. Kennt jemand zufällig einen Workaround dafür?

BEARBEITEN: Ich habe einen neuen Minimax-Algorithmus eingerichtet und ihn in einem anderen Beitrag gepostet. Sie finden den Beitrag im Bereich "Verknüpft" rechts oder hier . Jetzt mache ich es nur im Mikrocontroller-Code und erstelle eine Funktion, die die beste / zweitbeste Bewegung aller gewerteten Züge auswählt und sie zufällig verteilt, wenn es mehrere Züge mit der gleichen Punktzahl gibt. Dieser Beitrag kann dadurch geschlossen sein.

    
Lithimlin 20.07.2016, 11:34
quelle

1 Antwort

0

Ich denke, der Versuch, den zweitbesten Zug mit einer vollständigen Tiefenanalyse zu bekommen, übertreibt es. Erkunden Sie nicht den gesamten Baum, indem Sie die Tiefe Ihrer Minmax begrenzen (2 Zug voraus erlaubt, zu gewinnen, aber die KI ist immer noch stark), oder verwenden Sie einfach einen zufälligen Zug für eine wirklich unvollkommene KI.

    
Pierre.Sassoulas 20.07.2016 11:49
quelle