Có những cách dễ dàng để làm điều này. Tôi sẽ trình bày ngắn gọn cho bạn một cách nhanh chóng để làm điều đó với python, sử dụng mô-đun python-Chess . Nếu các nhận xét trong mã là không đủ, vui lòng yêu cầu làm rõ hoặc các phần mở rộng có thể của mã:
Để giới thiệu một ví dụ hoạt động, tôi đã chơi một trò chơi giữa Adams và Kasparov , bạn có thể tải xuống PGN từ siêu liên kết. Và động cơ của chúng tôi là Stockfish mới nhất có sẵn được lấy từ trang web chính thức .
Hãy gọi nó là 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])
Hãy thử nghiệm nó với trò chơi PGN đã nói ở trên, lệnh của chúng tôi là:
python PGNeval.py adams_kasparov_2005.pgn
Và đây là đầu ra tôi nhận được:
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