3.3 字符串表示局面
数组表示局面,在程序处理起来是比较方便,但也有空间的浪费。因为棋子在开局时最多,32个,用10×9矩阵也有58个位置是空的,16×16矩阵则有224位置浪费。虽然计算机内存对这点空间耗费也算不了什么,但是如果数据在网络上传输,受带宽及网络数据流量影响,应该尽量压缩传输的数据长度。在机器对弈时,常常采用字符串作为公共数据结构,在网络上传输。
在国际象棋中,采用FEN格式字符串来表示局面。
FEN就是“福斯夫-爱德华兹记号法”(Forsyth-Edwards Notation),这是一种使用ASCII码字符描述国际象棋局面的标准。FEN是建立在19世纪由报社记者S·D·福斯夫设计的记录局面的标准基础上的。后来为了适合象棋软件的需要,由爱德华兹对此做了少许修改。一份标准的局面记号对需要大量交换共享局面数据的国际象棋程序设计等工作具有尤其重要的作用(象棋百科全书网站,《国际象棋译文苑》文摘——关于PGN和FEN记谱规范(下))
在国内,由黄晨引入FEN格式串表示中国象棋局面,目前有很多中国象棋博弈引擎采用FEN格式串。
FEN是专门用来表示象棋局面的记录规范,在这个规范下,一个局面可以简单地用一行“FEN格式串”来表示,而不必烦琐地说:“红帅在四路次底线,黑将在5路底线……”。由于它是文本格式的(只牵涉到很有限的几个字母、数字和符号),因此网上传递棋局就非常方便,不用把棋图画在纸上或用文字笨拙地描述了,而是用棋谱编辑软件摆好局面,自动得到FEN格式串,再贴到诸如Web网页、BBS、电子论坛等能够传递文字的网络应用平台上。读者面对FEN格式串,只要借助于棋谱编辑软件,用“赋值”和“粘贴”就可以完全重现局面,使得棋谱交流快速而高效。(象棋百科全书网站,黄晨,中国象棋计算机应用规范(三) FEN文件格式)
FEN串如何表示国际象棋读者可以自行参考资料,这里主要讲FEN串如何表示中国象棋局面。
3.3.1 棋子表示
每一个棋子用一个字符表示,如表3-3所示。
表3-3 每一个棋子的字符表示
你也许会问,为什么马不用H(horse),象不用E(Elephant)表示?这主要为了与国际象棋相对应,FEN最开始就是为表示国际象棋而设计的。
3.3.2 棋盘表示
局面表示的方法如下:
● 把棋盘分行十行来看待,从上往下为第0,1,…,9行,每一行用一个字符串表示。
● 棋盘共9列,所以每行最多有9个字符。如果交叉点上有棋子,则用棋子对应字符表示,如果没有棋子,则用数字表示出相邻连续的空位数。
● 一行末尾是空位,而相邻下一行开始也是空位,则相邻两行的空位要分开计数,不得连续。
● 局面的FEN字符串由每行字符串相连而成,相邻行字符串由“/”分隔开。
● 所有字符、数字、/ 间均不得有空格。
如中国象棋开局的FEN串为:
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR
第0行全是棋子,所有由9个字符构成;第1行一个棋子也没有,所有用数字9表示;第2行两个炮,中间是5个空位,表示成字符串为1c5c1;第3行为5个兵和4个空位,则为p1p1p1p1p。
3.3.3 走方表示
轮到哪一方走棋,也用字符表示。红方用“w”,黑方用“b”。
FEN格式串中走方表示方法:
● 在棋盘字符串的尾部加上一个空格和表示走方的字符。
修改上面中国象棋开局的FEN串,引入走方。因为中国象棋开局始终是红方先行,更改后的FEN串如下
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w
3.3.4 走棋步数
FEN串还有两个内容,一个是未吃子步数,当超过规定步数双方均未吃子要判和。另一个是自然回合数,就是从开始到现在的走棋步数。一回合是双方各走一步棋。
再次修改开局的FEN串,表示如下:
rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - -0 1
走法后的两个“-”没有实际意义,主要是与国际象棋保持一致。
倒数第2个数表示未吃子步数。最后一个数表示自然回合数。