You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:35:38