Stockfish Bewertung einer Position von PGN

8

Ich versuche, Stockfishs Bewertung einer Board-Position (im PGN-Format) über die Befehlszeile abzurufen.
Ich weiß, dass es die Board-Position im FEN-Format akzeptiert, aber gibt es eine Möglichkeit, das PGN-Format bereitzustellen?
Wenn nein, wie kann ich das PGN-Format in FEN konvertieren?
Gibt es ein Tool in Python, das mir helfen kann?

Janmejaya Nanda
quelle

Antworten:

6

Ja, dafür gibt es einfache Möglichkeiten. Ich werde Ihnen kurz eine schnelle Möglichkeit zeigen, dies in Python mithilfe des Python-Schach- Moduls zu tun . Wenn die In-Code-Kommentare nicht ausreichen, können Sie um Klarstellungen oder mögliche Erweiterungen des Codes bitten:

Um ein funktionierendes Beispiel zu zeigen, habe ich ein Spiel zwischen Adams und Kasparov genommen . Sie können das PGN über den Hyperlink herunterladen. Und unser Motor ist der neueste verfügbare Stockfisch, der auf der offiziellen Website verfügbar ist .

Nennen wir es PGNeval.py:

import chess
import chess.uci
import chess.pgn
import sys

arguments = sys.argv
pgnfilename = str(arguments[1])

#Read pgn file:
with open(pgnfilename) as f:
    game = chess.pgn.read_game(f)

#Go to the end of the game and create a chess.Board() from it:
game = game.end()
board = game.board()

#So if you want, here's also your PGN to FEN conversion:
print 'FEN of the last position of the game: ', board.fen()

#or if you want to loop over all game nodes:
#while not game.is_end():
    #node = game.variations[0]
    #board = game.board() #print the board if you want, to make sure
    #game = node         

#Now we have our board ready, load your engine:
handler = chess.uci.InfoHandler()
engine = chess.uci.popen_engine('...\stockfish_8_x64') #give correct address of your engine here
engine.info_handlers.append(handler)

#give your position to the engine:
engine.position(board)

#Set your evaluation time, in ms:
evaltime = 5000 #so 5 seconds
evaluation = engine.go(movetime=evaltime)

#print best move, evaluation and mainline:
print 'best move: ', board.san(evaluation[0])
print 'evaluation value: ', handler.info["score"][1].cp/100.0
print 'Corresponding line: ', board.variation_san(handler.info["pv"][1])

Testen wir es mit dem oben genannten Spiel PGN. Unser Befehl lautet:

python PGNeval.py adams_kasparov_2005.pgn

Und hier ist die Ausgabe, die ich bekomme:

FEN of the last position of the game: br3r2/5ppk/p2pp3/4b1BP/N3P3/q4P2/1PnQB3/1K4RR w - - 4 27 best move: Qxc2 evaluation value: -10.87 Corresponding line: 27. Qxc2 Rfc8

Ellie
quelle
1
Gibt es eine Möglichkeit, zu einem beliebigen Knoten eines Spiels zu gelangen (nicht nur zu einem Endknoten)?
Janmejaya Nanda
2
Ja, einfach die Knoten durchlaufen, ich habe eine Möglichkeit hinzugefügt, dies in der Bearbeitung zu tun.
Ellie
1
variationsgibt Ihnen alle untergeordneten Knoten, denen Sie neu zuweisen, gameum bis zum Ende zu durchlaufen. Danke Phonon für deine Hilfe.
Janmejaya Nanda
3
Gern geschehen. Viel Spaß beim Herumspielen mit diesem Modul, es ist gut geschrieben.
Ellie