分享

五子棋协议(初稿)

 淡墨凝芳 2016-03-17
对输入输出协议没经验,但在编写程序的过程中,这一点又很重要。网上搜了很久,没有找到五子棋协议。就连LIB格式,也是凤毛麟角。 更纠结的是,按照RENLIB的读写方法,没能完全正确地读出目前某些很有名气的软件的文档。 因此,自己写了一个。望有经验的大侠帮忙指点指点。 现在先贴出第一部分:输入输出协议。其他部分正在完善中。   五子棋协议 引言 在编写五子棋程序过程中,文件格式和引擎与界面的协调统一很伤脑筋。为了今后自己编写程序的规范,参考UCI协议,对格式和传输作了初步规范,撰写了AGI协议(Amoyman Gobang Interface): (1)阿麦系列程序都遵循AGI协议; (2)根据该协议编写五子棋引擎可以被协议编写的界面调用; (3)根据该协议编写五子棋界面可以调用协议编写的引擎。 AGI协议包含四个部分: 1、AGI协议,用于引擎与界面的信息传输; 2、开局库格式,压缩的独立局面,供引擎调用; 3、对局谱格式,XML格式记录的对局棋谱,供界面调用; 4、棋谱格式,含注释、评价的有序局面,供界面调用。 第一部分 AGI协议 一、AGI协议的特点 (1)引擎程序是可执行文件,与界面程序通过“标准输入”和“标准输出”(即C语言中的stdin和stdout)来通讯。 (2)输入和输出是以“行方式”来完成的,界面发给引擎的每条指令都必须以“回车”(即C语言中的'\n')结束,界面接收引擎的反馈也一样。 (3)引擎启动的第一条指令必须是AGI指令,让引擎进入AGI协议状态。 (4)无论是否在思考,引擎都必须随时接收指令,界面程序可以随时中断引擎的工作或改变引擎的思考方式。每条指令都以特定的关键字开头,关键字和参数之间用空格分隔。 (5)界面必须随时接收引擎的反馈信息,每条反馈信息也都以特定的关键字开头,关键字和参数之间用空格分隔。 (6)在引擎搜索前,界面要与引擎确定“当前局面”。当前局面可以是新定义的局面,也可以是在前一局面经过指定的着法后生成的局面。 (7)引擎接收到“GO”指令后开始思考(搜索),但在PONDER状态为ON时,可以自动进行后台思考。 (8)如果对局是计时的,每次思考时界面都必须指定剩余时间(毫秒),引擎仅仅根据剩余时间来决定思考策略。 (9)当引擎完成一个局面的搜索,得到一步最佳着法后,并不改变“当前局面”,只是把这个着法反馈给界面,由界面来确定下一步,并把确定的着法告诉引擎。 (10)引擎可以自带开局库,也可以由界面指定开局库。 二、棋盘格式 AGI协议中,棋盘采用网格式坐标来表示棋盘上的点,坐标以16进制数表示,横向从1到F,纵向从0到E。左上角为01,右下角为EF,天元为78,四个星点坐标分别为34、3C、B4、BC。 局面格式以黑白相间的方式表示已有的局面,同一色的棋子与顺序无关。如:长星开局,可以表示为78695A,也可以表示为5A6978。在界面中,对局面格式给定的局面不标注着法序号。 着法格式以黑白相间的落子点来顺序表示。如:花月开局,表示为786869。着法格式由于有先后顺序,在界面中,在选择显示序号时,标注着法的序号。 三、输入和输出协议 输入协议就是界面向引擎发送指令的协议,协议内容通常由一系列指令集组成;输出协议则规定了引擎反馈给界面的信息,以及这些信息具体的含义。为描述方便,指令以红色表示,反馈以蓝色表示。输入输出协议不区分大小写,即:AGI与agi为同一指令。在以下的描述中,大写为保留字,小写为具体内容。 1、AGI 这是引擎启动后,界面需要给引擎发送的第一条指令,通知引擎现在使用的是AGI协议。 2、ID NAME name [AUTHOR author] 这是AGI指令的反馈信息,显示引擎名称、版本号和作者。 3、OPTION OWNBOOK TRUE|FALSE PONDER TRUE|FALSE 这是AGI指令的反馈信息,表示是否自带开局库、是否后台思考。 4、AGIOK 这是AGI指令的最后一条反馈信息,表示引擎已经进入AGI协议通讯的状态。 5、SETRULE FORBIDDEN|UNFORBIDDENFIRSTCHANGE|THIRDCHANGE FIVETWINE|FIVEMULITY 设置规则:有禁手/无禁手,一手交换/三手交换/无交换,五手二打/五手多打(山口规则)/五手一打 FORBIDDEN|UNFORBIDDEN,采用禁手/无禁手规则,默认禁手规则 FIRSTCHANGE|THIRDCHANGE,一手交换、三手交换,默认无交换 TIVETWINE|FIVEMULITY,五手二打、五手多打,默认五手一打 6、SETOPTION OWNBOOK ON|OFF [PONDER ON|OFF] 设置引擎参数,参数包括自带开局库和后台思考(在有自带开局库和后台思考功能时,开关这些功能。默认状态为开启)。该指令无需反馈。 7、ISREADY 检测引擎是否处于“就绪”状态,如果引擎发送回READYOK信息,则说明引擎已经就绪,界面可以向引擎发出其他指令。 8、READYOK 这是ISREADY的反馈信息,仅仅表示引擎可以接收指令了。即使引擎在思考,接收到ISREADY指令后也会返回READYOK。 9、POSITION [STATU statu] [MOVES moves] 设置“当前局面”,STATU指定未确定先后次序的着法,缺省表示空棋盘,MOVES指定确定先后次序的着法。 10、GO [SEARCH moves] [PONDER] [TIME millseconds|INFINITE] 让引擎对当前局面进行思考。 (1)SEARCH moves,只让引擎在这几步中选择一步; (2)PONDER,让引擎进行后台思考(即对手在用时,引擎的时钟不起作用),后台思考状态下无需要反馈BESTMOVE; (3)TIME millseconds|INFINITE,剩余思考时间(毫秒),INFINITE为无限制搜索,直到叫停或全部搜索点都终结。 11、INFO ... 引擎报告思考状态 (1)DEPTH depth,搜索深度; (2)PV pv,最佳线路; (3)SCORE score,引擎对当前局面的评分; (4)NPS nps,引擎速度,每秒搜索的节点数; (5)SEARCH moves,当前局面的搜索着法; (6)WIN moves,已发现的胜利着法; (7)LOSE moves,已发现的失败着法。 12、STOP 中断引擎的思考,若处于前台思考状态,立即反馈思考结果。 13、DOMOVE move 在当前局面下进行增加move着法,并把结果作为当前局面。 14、BESTMOVE move|CHANGE PONDER move 引擎思考结束后(不管是否被STOP中断)显示的结果(CHANGE为交换),PONDER指为对手思考的结果,通常引擎会提供此信息。 15、QUIT 让引擎退出运转,无论引擎思考与否。 16、BYE 对QUIT的反馈,表示引擎已经退出。 四、举例 在下面的例子中,输入部分(从界面到引擎)用红色表示,输出部分(从引擎到界面)用蓝色表示。 AGI ID NAME Amoyman 1.0 ID AUTHOR Amoyman KUA OPTION OWNBOOK TRUE PONDER TRUE AGIOK SETOPTION OWNBOOK ON SETOPTION PONDER OFF SETRULE FORBIDDEN ISREADY READYOK POSITION MOVES 78685A69 GO SEARCH 67596A6BINFINITE INFO SEARCH 67596A6B INFO DEPTH 1 INFO DEPTH 1 SCORE 3 PV 6789 INFO DEPTH 2 INFO NPS 786000 …… STOP BESTMOVE 67 PONDER 89 DOMOVE 67 GO INFINITE INFO …… STOP BESTMOVE 89 PONDER 79 QUIT BYE  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多