如何基于Stockfish 15与Python 3.10判断浏览器象棋游戏是否结束
判断国际象棋游戏结束状态的解决方案(基于Stockfish 15 + Python 3.10)
一、利用Stockfish Python库的内置方法直接判断
如果使用python-stockfish库(Python与Stockfish的官方绑定),可以直接调用引擎提供的状态判断方法,覆盖所有游戏结束场景:
from stockfish import Stockfish # 初始化Stockfish引擎,替换为你的Stockfish 15可执行文件路径 stockfish = Stockfish(path="./stockfish15") # 设置当前棋局的FEN字符串(每走一步后更新) stockfish.set_fen_position("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1") # 逐一判断游戏结束状态 if stockfish.is_checkmate(): print("将死,游戏结束") elif stockfish.is_stalemate(): print("逼和,游戏结束") elif stockfish.is_insufficient_material(): print("双方子力不足以将死,判定和棋") elif stockfish.is_fifty_moves(): print("触发五十步无吃子/兵移动规则,判定和棋") elif stockfish.is_repetition(): print("出现三次重复局面,判定和棋")
二、直接调用Stockfish命令行解析输出
如果未使用Python绑定库,直接通过子进程调用Stockfish命令行,可以发送指令并解析返回结果中的关键词:
import subprocess # 启动Stockfish进程 stockfish_proc = subprocess.Popen( ["./stockfish15"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True ) # 设置当前局面(替换为实际走棋后的FEN) stockfish_proc.stdin.write("position fen rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1\n") stockfish_proc.stdin.flush() # 发送显示局面指令 stockfish_proc.stdin.write("d\n") stockfish_proc.stdin.flush() # 读取并解析输出 while True: line = stockfish_proc.stdout.readline() if not line: break if "Checkmate" in line: print("将死,游戏结束") elif "Stalemate" in line: print("逼和,游戏结束") elif "Insufficient material" in line: print("子力不足和棋") elif "50-move rule" in line: print("五十步规则和棋")
三、辅助状态跟踪补充判断
部分和棋规则(如三次重复局面)可以结合本地状态跟踪来强化判断:
- 维护一个列表存储每一步的FEN字符串,每次走棋后检查当前FEN是否已出现3次
- 维护计数器,每次发生吃子或兵移动时重置为0,否则递增,达到50则触发和棋
内容的提问来源于stack exchange,提问作者Luca
相关产品推荐
相关产品推荐

