引擎接入指南
将你的象棋 AI 接入擂台,与其他引擎一决高下。
只需实现 5 个命令,任何语言都可以。
接入流程
Step 1
理解 UCI 协议
你的引擎可以是编译好的二进制文件,也可以是 .py 或 .js 脚本。平台通过标准输入输出和它对话——就像聊天一样,平台发消息,引擎回复。
Step 2
了解棋盘坐标
UCI 用字母+数字表示位置,走法就是「起点+终点」四个字符。
a b c d e f g h i9 r n b a k a b n r ← 黑方8 · · · · · · · · ·7 · c · · · · · c ·6 p · p · p · p · p5 · · · · · · · · · ← 楚河 ——— 汉界4 · · · · · · · · ·3 P · P · P · P · P2 · C · · · · · C ·1 · · · · · · · · ·0 R N B A K A B N R ← 红方
Step 3
编写你的引擎
选一个你熟悉的语言,从模板开始。核心就是读取 stdin、回复 stdout。
python
#!/usr/bin/env python3
"""最简象棋引擎 — 随机走子"""
import sys, random
INIT_FEN = "rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1"
def main():
for line in sys.stdin:
cmd = line.strip()
if cmd == "uci":
print("id name MyEngine")
print("id author Me")
print("uciok")
sys.stdout.flush()
elif cmd == "isready":
print("readyok")
sys.stdout.flush()
elif cmd.startswith("position"):
pass # 解析局面(你的棋盘逻辑)
elif cmd.startswith("go"):
# 在这里实现你的搜索算法
# 这里用固定走法演示
print("info depth 1 score cp 0")
print("bestmove h2e2")
sys.stdout.flush()
elif cmd == "quit":
break
if __name__ == "__main__":
main()直接上传 .py 文件
平台支持直接上传 .py 脚本,无需编译或打包。上传后平台会自动用 python3 运行你的脚本。 也可以本地测试:
python3 my_engine.pyStep 4
本地测试
上传前先在终端里手动测试,确保引擎能正常对话。
bash
# 启动引擎,手动输入命令测试 ./my_engine # 输入: uci # 期望看到: id name ... 和 uciok isready # 期望看到: readyok position fen rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1 go wtime 300000 btime 300000 winc 3000 binc 3000 # 期望看到: bestmove xxxxx quit
如果每个命令都能正确响应,你的引擎就可以上传了。
UCI 命令速查
uci平台 → 引擎
引擎初始化,回复 id name/author 和 uciokisready平台 → 引擎
检查就绪,回复 readyokposition fen <FEN>平台 → 引擎
用 FEN 设置当前局面(本平台每步都发完整 FEN,不用 startpos/moves)go wtime X btime Y winc Z binc W平台 → 引擎
开始思考,参数为双方剩余时间和每步加秒(毫秒)info depth D score cp S pv ...引擎 → 平台
(可选)搜索信息:深度、评估值(厘兵)、主要变化线bestmove <move>引擎 → 平台
返回最佳走法(如 h2e2),必须是合法走子quit平台 → 引擎
退出引擎