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

  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470244.html
Copyright © 2011-2022 走看看