zoukankan      html  css  js  c++  java
  • FEN文件格式

    FEN文件格式
     
    黄晨 * 200411月初稿,20062月修订
    ( * 上海计算机博弈研究所,eMailwebmaster@elephantbase.net)
     
    一、FEN的优势
     
      FEN(Forsyth-Edwards Notation)是专门用来表示象棋局面的记录规范,在这个规范下,一个局面可以简单地用一行“FEN格式串”来表示,而不必烦琐地说:“红帅在四路次底线,黑将在5路底线……”。由于它是文本格式的(只牵涉到很有限的几个字母、数字和符号),因此网上传递棋局就非常方便,不用把棋图画在纸上或用文字笨拙地描述了,而是用棋谱编辑软件摆好局面,自动得到FEN格式串,再贴到诸如Web网页、BBS、电子论坛等能够传递文字的网络应用平台上。读者面对FEN格式传,只要借助于棋谱编辑软件,用“赋值”和“粘贴”就可以完全重现局面,使得棋谱交流快速而高效。
     
    二、FEN格式串
     
      国际象棋的FEN格式串是由6ASCII字符串组成的代码(彼此5个空格隔开),这6段代码的意义依次是:
      (1) 棋盘上的棋子,这是FEN格式串的主要部分;
      (2) 轮到哪一方走子;
      (3) 每方及该方的王翼和后翼是否还存在“王车易位”的可能;
      (4) 是否存在吃过路兵的可能,过路兵是经过哪个格子的;
      (5) 最近一次吃子或者进兵后棋局进行的步数(半回合数),用来判断“50回合自然限着”;
      (6) 棋局的回合数。
      中国象棋没有“王车易位”和“吃过路兵”的着法,所以FEN格式串的这两项空缺,以最初局面为例说明:
     
    rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1
     
      (1) 红色区域,表示棋盘布局,小写表示黑方,大写表示红方,其他规则同国际象棋的FEN规范(请参阅《国际象棋译文苑》文摘——关于PGNFEN记谱规范()一文)。这里要注意两点,一是中国象棋棋盘有10行,所以要用9个“/”把每一行隔开;二是棋子名称用英文字母表示,国际象棋中没有的棋子是仕()和炮,这里分别用字母A(a)C(c)表示。
      (2) 绿色区域,表示轮到哪一方走子,“w”表示红方,“b”表示黑方。(有人认为红方应该用“r”表示,很多象棋软件确实是这样表示的。ElephantBoard尽管用“w”表示,但识别时采取灵活的办法,即“b”表示黑方,除此以外都表示红方。)
      (3) 深紫色区域,空缺,始终用“-”表示。
      (4) 紫红色区域,空缺,始终用“-”表示。
      (5) 蓝色区域,表示双方没有吃子的走棋步数(半回合数),通常该值达到120就要判和(六十回合自然限着),一旦形成局面的上一步是吃子,这里就标记“0”。(这个参数对于普通局面的意义不大,ElephantBoard的规则处理器并不是根据这一项来判断和棋的,所以总是计为“0”。)
      (6) 棕色区域,表示当前的回合数,在研究中局或排局时,作为研究对象的局面,这一项可以写1,随着局势的发展逐渐增加。
     
    三、FEN文件
     
      FEN格式串有很多载体,通常的做法是把它保存成后缀为“.FEN”的文件。FEN文件是ASCII码文件,可以用任何文本编辑软件来建立和修改,也可以通过象棋棋谱软件来产生。
     
    四、历史局面的表示
     
      这是只在“中国象棋通用引擎协议(UCCI协议)中采用的方法,用来表示历史局面。在UCCI协议中,局面用position fen <fen_string>来传递,由于FEN格式串无法记录历史局面,所以该指令后面必须用moves选项来说明。例如右图局面,发生时,界面向引擎传递局面信息:
    position fen 9/9/3k5/9/9/9/4R4/3A5/8r/4K4 b - - 0 1
      此时引擎走车9进1是没有问题的。然而当它是某个长将局面的延续时,界面向引擎传递的局面信息就必须用moves选项来说明:
    position fen 9/9/3k5/9/9/9/4R4/3A5/4K4/8r b - - 0 1 moves i0i1 e1e0 i1i0 e0e1 i0i1 e1e0 i1i0 e0e1 i0i1 e1e0
      尽管也是右图的局面,但意义已经发生了变化,此时引擎不可能再走车9进1,因为紧接着一步帅五进一,导致局面重复第三次,黑方被判长将作负。

      ElephantBoard向引擎传递局面时,<fen_string>总是最近一次吃过子的局面(或开始局面),后面所有的着法都用moves选项来传递给引擎,这样就包含了判断自然限着和长打的历史信息,这些信息可由引擎来处理。

    转自:http://www.elephantbase.net/protocol/cchess_fen.htm

  • 相关阅读:
    Linux 实用指令(5)--组管理和权限管理
    Linux 实用指令(4)
    Linux用户管理 (3)
    Oracle如何用单字段或多字段进行查重
    SQL中的左连接与右连接,内连接有什么不同
    Markdown语法--整理
    应用程序无法正常启动0xc000007b
    Linux开机、重启和用户登录注销(2)
    Linux vi和vim编辑器(1)
    SecureCRT 64位 破解版和安装,以及解决乱码问题
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470244.html
Copyright © 2011-2022 走看看