Ich habe ein Schachspiel in C mit den folgenden Strukturen implementiert:
move - was eine Bewegung von (a, b) nach (c, d) auf einem Spielbrett [8] [8] (Schachbrett) darstellt
Züge - das ist eine verkettete Liste von Zügen mit Kopf und Schwanz.
Variablen: playing_color ist "W" oder "B". minimax_depth ist eine Minimaxtiefe, die zuvor festgelegt wurde.
Hier ist mein Code der Minimax-Funktion mit Alpha-Beta-Beschneidung und der getMoveScore-Funktion, die das Ergebnis der Bewegung im Minimax-Baum einer bestimmten minimax_depth, die vorher gesetzt wurde, zurückgeben soll.
Ich benutze auch die getBestMoves-Funktion, die ich hier auch auflisten werde, sie findet grundsätzlich die besten Bewegungen während des Minimax-Algorithmus und speichert sie in einer globalen Variablen, so dass ich sie später verwenden kann.
>Ich muss hinzufügen, dass alle Funktionen, die in den drei Funktionen aufgeführt sind, die ich hier hinzufügen werde, ordnungsgemäß funktionieren und getestet wurden, , so dass das Problem entweder ein logisches Problem des alphabetaMax-Algorithmus oder die Implementierung von ist getBestMoves / getMoveScore.
Das Problem ist hauptsächlich, dass, wenn ich meine besten Züge in der Tiefe N bekomme (die auch nicht richtig berechnet werden) und dann ihre Punktzahl mit der getMoveScore Funktion in der gleichen Tiefe überprüfe, bekomme ich verschiedene Punkte, die nicht stimmen passe nicht zum Ergebnis dieser besten Züge an . Ich habe Stunden damit verbracht, das zu debuggen und konnte den Fehler nicht sehen, ich hoffe, dass irgendjemand mir einen Tipp geben könnte, das Problem zu finden.
Hier ist der Code:
%Vor%Wie Eugene betont hat, füge ich hier ein Beispiel hinzu: Ссылка
Ich bin momentan der weiße Spieler, ich habe nur König-K und Dame-Q, die gegenteilige Farbe hat König-K und Turm-R. Offensichtlich ist mein bester Zug hier, einen Turm zu essen oder wenigstens einen Check zu machen. Bewegungen der Teile werden getestet und sie funktionieren gut. Obwohl ich die Funktion get_best_moves in Tiefe 3 anrufe, erhalte ich in dieser Tiefe viele unnötige Bewegungen und negative Werte. Vielleicht ist es jetzt ein bisschen klarer. Danke!
Ohne den gesamten Code zu debuggen, ist mindestens EINES der Probleme die Tatsache, dass Ihre Scoreverifizierung mit einem Minimax-Algorithmus funktionieren könnte, aber nicht mit einem Alpha-Beta. Folgendes Problem:
Die Funktion getMoveScore () muss mit einem offenen AB-Fenster beginnen.
GetBestMoves () ruft jedoch getMoveScore () mit einem bereits geschlossenen AB-Fenster auf.
Im Fall von getBestMoves können also Zweige gelöscht werden, die in getMoveScore () nicht bereinigt werden, daher ist die Punktzahl nicht genau, und das ist der Grund (oder mindestens EINER von ihnen), warum diese Werte abweichen können.
Tags und Links algorithm c chess minimax alpha-beta-pruning