关于国际象棋PGN和FEN记谱规范
1、PGN介绍
PGN就是“可移植式棋局记号法”(Portable Game Notation),是一种以ASCII文本文件表示国际象棋棋局数据的标准设定。PGN设计成使人们很容易进行阅读和编写,电脑程序很容易进行解析和产生。定义和传播PGN的目的,是为了促进公开对局数据的共享交流,包括来自全世界的棋手(不管有无组织)、出版人和电脑国际象棋研究的。
PGN不是万能;也没有什么标准无所不能。它被希望作为数据交换的一种通用可移植式表示法,就是给予国际象棋应用群体能够从PGN本身导入导出来快速方便地处理对局数据的。对它的要求是:简洁明了、可在不同平台工作、多数人们和多种处理程序都能理解运用和产生,也就是说“同一种语言”、公开而不加密、易于扩展和升级、国际化、以及具有继承性。【译注:因为是编译,所以译文的小标题编号与原文并不对应了,以下均是】
2、一个标准的PGN对局
虽然初看上去它似乎比较冗长,但实际上PGN相当简单。以下是一个范例,而它具有的重要特征将在后文中展开描述:
[Event 'F/S Return Match']
[Site 'Belgrade, Serbia JUG']
[Date '1992.11.04']
[Round '29']
[White 'Fischer, Robert J.']
[Black 'Spassky, Boris V.']
[Result '1/2-1/2']
1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 8. c3 O-O 9. h3 Nb8 10. d4 Nbd7 11. c4 c6 12. cxb5 axb5 13. Nc3 Bb7 14. Bg5 b4 15. Nb1 h6 16. Bh4 c5 17. dxe5 Nxe4 18. Bxe7 Qxe7 19. exd6 Qf6 20. Nbd2 Nxd6 21. Nc4 Nxc4 22. Bxc4 Nb6 23. Ne5 Rae8 24. Bxf7+ Rxf7 25. Nxf7 Rxe1+ 26. Qxe1 Kxf7 27. Qe3 Qg5 28. Qxg5 hxg5 29. b3 Ke6 30. a3 Kd6 31. axb4 cxb4 32. Ra5 Nd5 33. f3 Bc8 34. Kf2 Bf5 35. Ra7 g6 36. Ra6+ Kc5 37. Ke1 Nf4 38. g3 Nxh3 39. Kd2 Kb5 40. Rd6 Kc5 41. Ra6 Nf2 42. g4 Bd3 43. Re6 1/2-1/2
3、结构
一个PGN数据文件是从零到很多盘PGN棋局的顺序性集合。空文件也是合法的PGN数据文件,虽然有点不太常规。
一个PGN棋局由两部分组成。第一是“标签对部分”,第二是“棋谱部分”。标签对部分用于识别棋局,有着标准的参数;棋谱则用“标准代数记谱法”表示,也将在后文加以描述。
3-1 标签对部分
标签对部分由一系列空的或更多的“标签对”组成。而标签对则由左右方括号、象征符号、字符串符号组成。象征符号是标签的名字,而字符串符号就是如之一起的标签值,它们的表示法都有一定标准。在一个标签对部分里不能出现同一个标签名多于一次以上。标签名是分大小写的,所有用于档案储存的标签名都是以大写字母开头【译注:一时不熟悉PGN的不要被这些术语名词吓倒,相对于十分详尽的原文,译文已尽量大大简略了。实际只要对照上面那个标准PGN棋局看下去,看到那些方括号了吧?就是标签对部分,很容易明白的】。
七个标签项
这是最基本七个标签项目,实际上输入时,顺序不一定这样严格,而且还可能根据需要进行扩展和增加。这七个基本标签项依顺序是:【译注:注意PGN规范不支持中文字符,下面“//”之后的中文只是本文加的解释说明】
1) Event 比赛名。比如:
[Event 'FIDE World Championship'] //国际棋联世界锦标赛
[Event 'Casual Game'] //即兴比赛
[Event '?'] //比赛名不详
2) Site 比赛地点。比如:
[Site 'New York City, NY USA'] //美国纽约
[Site 'Beijing, China'] //中国北京
3) Date 该局开始时日期,使用当地时间。比如:
[Date '2001.01.01'] //一看就懂了吧!
[Date '1993.??.??'] //1993年但月、日不详
注意日期的格式是:年.月.日
4) Round 该局在比赛中的轮次。比如:
[Round '1']
[Round '3.1'] //第3大轮的第1小轮 ,以“.”分开;有更小的轮次则类似表示下去
[Round '?'] //轮次不详
5) White 白方棋手名字。有一定的书写规则,不同民族的人的姓名不好一概而论,但至少看懂是不难的。电脑棋手则在名字后加上版本信息。比如:
[White 'Tal, Mikhail N.'] //米哈依尔·N·塔尔
[White 'Kasparov, Garry'] //加里·卡斯帕罗夫
6) Black 黑方棋手名字,与白方的规则没有区别。
7) Result 该局结果。比如:
[Result '0-1'] //黑胜
[Result '1-0'] //白胜
[Result '1/2-1/2'] //和棋
[Result '*'] //可能还在进行,可能该局作废,可能其它原因,反正结果不详
3-2 棋谱部分
包括棋步、回合数、可选的评注、以及棋局终止符。不合法的棋步不能出现在棋谱部分中,不过可以出现在注释中。
使用“标准代数记谱法”,以一个大写英文字母表示棋子:P=兵,N=马,B=象,R=车,Q=后,K=王 。但兵往往不需要用字母表示,一般省略。以小写字母“x”表示吃子,兵吃子与其他棋子吃子的表示法有少许区别。注意某方假如有不止一只棋子可以走到特定某一格的话,为了区别究竟是哪一只在走,有一套规定的表示法,但这与通常见到的书上的棋谱表示法类似……
短王车易位以“O-O”、长易位以“O-O-O”表示,注意这里是大写字母“O”,而不是数字“零”。
吃过路兵没有什么特殊表示法。至于兵的升变,以“=”后面紧接升变棋子的符号来表示。
一步棋带将军的就在后面加个“+”,将死就是用“#”表示。举个复杂点的棋谱写法,比如:fxg1=Q#,意思就是黑方f2上的兵吃掉g1格的某白子,升变为后,并且将死白方。
表示某着棋质量的有六种后缀:'!', '?', '!!', '!?', '?!', 以及 '??' ,意思都跟书上棋谱的默认意义类似。
必须要有一个棋局结束标记,那就是总是在棋谱最后的那个:1-0、或0-1、或1/2-1/2,表示结果,注意是数字“零”而不是字母“O”;如果结果不详则注个星号* 。这里的棋局结束标记必须要与前面Result标签对符合,但注意棋局结束标记不用引号引起来。【译注:如果要严格详细定义PGN标签和棋谱的规范表示法,那真是可以写成一篇很长很“罗嗦”的文章,其实如果不是有心钻研甚至有心于程序设计,那么只要找几个PGN文件看看,基本上就了解学会了。】
4、补充标签项
补充标签项不是必须的,实际上来自不同地方的PGN棋谱往往不一样。
4-1 棋手相关信息
1) WhiteTitle 白方头衔,例如FM、IM、GM
2) WhiteElo 白方国际等级分,指国际棋联的ELO等级分
3) WhiteNA 白方email或其它网上地址
4) WhiteType 白方类型,human指人类;program指软件(电脑)
黑方写法雷同;如果这些补充信息欠奉,则用“-”表示。
4-2 赛事相关信息
1) EventDate 赛事开始日子,与标签对里的Date不同,这是指整个赛事的开始日
2) EventSponsor 赛事赞助者
3) Section 区域,比如公开还是保留
4) Stage 阶段,比如预赛还是决赛
5) Board 台数,也就是表示团体赛或车轮战中的第几台(盘)
6) Time 以“小时:分钟:秒钟”表示该局开始的当地时间
4-3 开局信息
1) Opening 以字符串表示传统的开局名称
2) Variation 变例名,以后将有提炼
3) SubVariation 分支变例名
4) ECO “开局百科”(Encyclopedia of Chess Openings)里定义的开局编号
5) NIC 著名的“New in Chess”数据库里定义的开局编号
4-4 时限
以TimeControl作为标签名,有6种不同表示,举例:
1) [TimeControl '?'] //时限不知道
2) [TimeControl '-'] //无限时
3) [TimeControl '40/9000'] //9000秒内(即2个半小时)走满40步
4) [TimeControl '300'] //每方300秒包时制对局,也就是5分钟快棋
5) [TimeControl '4500+60'] //用于“加时制”对局,这里是4500秒(90分钟)基础时限,然后每走一步往加60秒
6) [TimeControl '*180'] //每步限时的“沙漏制”时限,这里星号后面的数字是秒数,即每一步都要在180秒之内走完
其实还可以定义额外的时限表示法。
4-5 开始局面
默认的开始局面,当然就是对局最初的原始局面。不过假如对局规定是从某一局面开始的,就会用到如下标签项。
1) SetUp 如果数值是1,表示该局开始局面是“摆”出来的
2) FEN 以“福斯夫-爱德华兹记号法”(Forsyth-Edwards Notation) 表示开始局面,关于FEN的表示法,下一篇再来解释
4-6 对局结论
以Termination标签名表示Result标签项没有能披露的额外信息
1) [Termination 'abandoned'] //该局放弃
2) [Termination 'adjudication'] //结果由第三方宣判
3) [Termination 'death'] //哦……
4) [Termination 'emergency'] //出现无法预料的情况
5) [Termination 'normal'] //常规结束
6) [Termination 'rules infraction'] //失利方违规
7) [Termination 'time forfeit'] //失利方超时
8) [Termination 'unterminated'] //没有结束
4-7 其它
这是不好归入以上各类的标签项。
1) Annotator 评注者(们)的名字
2) Mode 这是下该局的方式,比如OTB代表棋盘上,PM代表通过书面邮件,EM代表通过电子邮件,ICS指在网上站点下的,TC代表通过通常的长途电讯
3) PlyCount 表示该局的步数,严格来说是指“半”步数
5、文件名和目录
就是以“.pgn”作为文件后缀,例如:worldcup.pgn。
至于文件名和目录,如果要以严格档案式命名法来命名,可以有很多清规戒律,不过一般用途就不用那么严格了,只要好记好理解,按一般电脑文件命名的方法就行了,只是要注意在不同操作系统平台上尽量通用。总之如果是个人或小范围用途的就很随意,只有后缀是规定的。
6、PGN软件
编译注:这个……不用译了,因为原文写作时间比较早,所举的处理PGN文件的软件都很“古老”了,实际上今天免费的工具winboard就很好用,而且不用太细节关注PGN的严格语法。关于winboard的英文帮助文件和使用教程,以后有机会再译。
原文根本上是一篇关于PGN及相关技术的严格定义规范性手册或者指南,本译文只是抽取它的最重要部分进行编译。如果一般了解运用PGN,特别对于仅是用来打谱、收集和交流棋局的,足够了。不过知道上述一些定义,使用起来会得心应手得多。
但是,想写程序的,则就要认真去读原文了。
还有关于FEN等国际象棋记谱格式,也很常用到,将在下一篇继续编译。
最后,放一个标准PGN格式的单文件内容,对照来看,一看就会。PGN文件不兼容中文字体,“//”后面的中文实际上是加上去的注释说明,原文件里没有的。PGN实际上就是文本文件,可以用记事本或其它字处理工具直接打开,打开单个文件就是如下这样的。远不是所有提到的标签项都包括,但那七个基本标签都有:
[Event 'CHN-RUS Summit Men'] //赛事名,中国-俄罗斯最高对抗赛男子组
[Site 'Shanghai'] //地点,上海
[Date '2001.09.10'] //该局日期
[Round '4'] //第4轮
[White 'Ye Jiangchuan'] //白方叶江川
[Black 'Dreev, Alexey'] //黑方A·德里耶夫
[Result '1-0'] //对局结果白胜
[Opening 'Caro-Kann: classical, 6.h4'] //开局名,卡罗-卡恩防御:经典变例,6.h4
[ECO 'B19'] //ECO开局编号为B19
[NIC 'CK.11'] //'New In Chess'编号
[WhiteElo '2677'] //白方国际ELO等级分
[BlackElo '2690'] //黑方国际ELO等级分
[PlyCount '75'] //双方共走了75步(不是回合)
[EventDate '2001.09.07'] //赛事开始日期
1. e4 c6 2. d4 d5 3. Nd2 dxe4 4. Nxe4 Bf5 5. Ng3 Bg6 6. h4 h6 7. Nf3 e6 8. Ne5
Bh7 9. Bd3 Bxd3 10. Qxd3 Nd7 11. f4 c5 12. Be3 Qa5+ 13. Bd2 Qa4 14. d5 Ne7 15.
dxe6 Nxe5 16. fxe5 fxe6 17. Bc3 Rd8 18. Qe2 h5 19. O-O a6 20. Ne4 Nf5 21. Nd6+
Nxd6 22. exd6 Qg4 23. Qf2 Qg6 24. Be5 Bxd6 25. Bxd6 Rxd6 26. Qxc5 Rc6 27. Qa7
Qxc2 28. Qxb7 Qc5+ 29. Kh1 Rc7 30. Qb8+ Rc8 31. Qg3 g5 32. Rae1 Rh6 33. Qf3 Qe7
34. hxg5 Rh8 35. Qb3 Rc6 36. Rd1 Qc7 37. Qd3 Rg8 38. Qf3 1-0
如果是包含不止一个对局的PGN文件,实际上就是单个完整这样的PGN棋局以文本方式顺序隔行写在同一个PGN文件里。
PGN是用来储存对局的,除此之外为了适应国际象棋其它相关要求,还有其它的数据表示标准,最重要的两个是FEN和EPD 。译文主要说说FEN的格式。
1、FEN
FEN就是“福斯夫-爱德华兹记号法”(Forsyth-Edwards Notation),这是一种使用ASCII码字符描述国际象棋局面的标准。FEN是建立在19世纪由报社记者S·D·福斯夫设计的记录局面的标准基础上的。后来为了适合象棋软件的需要,由爱德华兹对此做了少许修改。
一份标准的局面记号对需要大量交换共享局面数据的国际象棋程序设计等工作具有尤其重要的作用。【译注:实际上,对于一般学棋拆棋,哪怕是娱乐,也很有用,后文将简单举例说明】
1-1 结构描述
一个FEN记录使用长度可不同的一行来表示,由六个区域组成。单纯的FEN记录文件后缀应该是“.fen”,比如:kk-1.fen。
FEN描述了:棋子位置、轮走棋方、易位可行性、吃过路兵目标格、半步计数、以及总回合数。所有这一切用一行文字符号表示就行了而且非常容易读。
看看一个FEN的六个区域及其含义,先举一个谁都太熟悉了的局面的FEN文件:
这就是每盘常规对局的最初局面,一个子都没有动。
译文以不同颜色表示了这个FEN中的六个不同区域,它们是:
1) 棋子位置数值区域(Piece placement data) 红色那段
就是表示双方棋子各在棋盘哪个格子上的。规则是从第8横线开始顺次数到第1横线(白方在下,从上数到下),从a线开始顺次数到h线;白方棋子以大写字母“PNBRQK”表示,黑方棋子以小写“pnbrqk”表示,这是英文表示法,每个字母代表的意义与常规规定相同。数字代表一个横线上的连续空格,反斜杠“/” 表示结束一个横线的描述。
上面的那pppppppp,就是表示黑方在第7横线上排有8只兵;后面那4个数字8,就是表示从第6到第3横线,双方一个棋子都不在,是空格;7个反斜杠“/”将第一区域分成8段,因为棋盘有8条横线;其它的照着图完全可以类推。
2) 轮走棋方(Active color) 深绿色那段
表示目前局面该谁走棋。小写“w”表示白方走棋;小写“b”表示黑方走棋;显然起初局面肯定是白先,所以上面就是“w” 。
3) 易位可行性(Castling availability) 紫色那段
这表示在当前局面下每一方有没有潜在的各种王车易位的可行性(目前不一定行,但以后有可能行)。如果谁都没有,就用“-”表示;大写“K”表示白方有短易位的可行性,大写“Q”表示白方有长易位的可行性;对应的小写“k”和“q”代表黑方短和长易位的可行性。书写顺序必须是先大写后小写、先短易位后长易位,并且之间不能有空格。
4) 吃过路兵目标格(En passant target square) 紫红色那段
如果没有,就用“-”表示。如果有,就用具体完成吃过路兵的那个格子坐标来表示,显然对于白兵被吃只可能在第3横线,对于黑兵被吃只可能在第6横线。而且,这个标记是且只是在该局面紧接的上一步棋是某方刚走兵推进两格的情况下出现。
5) 半回合计数(Halfmove clock) 浅蓝色那段
用一个非负数表示自从上一次动兵或吃子之后目前走了的半回合数。这个是为了适应50步和棋规则而定。【译注:但是在winboard的FEN输出中,这个值好象总是0】
6) 回合数(Fullmove number) 棕色那段
当前要进行到的回合数。不管白还是黑,第一步时总是以1表示,以后黑方每走一步数字就加1。
1-2 举例
好了,举例说明:
假如从开局开始,走了1. e4 e5 2. Nf3 Nc6 3. Bc4 Nf6 4. Ng5 d5 5. exd5 Nxd5 6. Nxf7 Kxf7 7. Qf3+ Qf6 8. Bxd5+ Be6 9. Bxc6 bxc6 10. Qxc6 Bd6 11. Nc3 Rhd8
这个写成FEN就是
1) 第一区域
第8横线r2r4,全是黑子(小写),从左到右依次是:黑车r、2个连续空格、黑车r、然后4个连续空格,这横线8个格子都说明了;
第1横线R1B1K2R,全是白子(大写),从左到右依次是:白车R、1个空格、白象B、1个空格、白王K、两个空格、白车R,刚好8个格子;
其它类推,要说明的是第6横线和第4横线
第6横线就是2Qbbq2,从左到右依次是:2个空格、白后Q(注意这是大写!)、黑象b、黑象b、黑后q、2个空格,刚好8个;第4横线,空空如也,所以就是用“8”表示,表示8个连续空格。
2) 第二区域
因为这时轮到白方走棋,所以就是“w”。
3) 第三区域
黑方的王已经动过所以失去易位可行性;白方的王则可以,以“KQ”表示。
4) 第四区域
上一着没有兵推进两格,所以不存在吃过路兵目标格,用“-”表示。
5) 第五区域
WinBoard总是输出“0” ……不过这个标记作用有限。
6) 第六区域
黑方已走完第11回合,所以现在是第12回合。
1-3 其它
其实,使用打谱软件比如winboard或chessbase,无论输入还是输出FEN记录和文件都是自动式的,很方便,了解它的规则只是为了深入一些应用或遇到问题时自己可以解决。另外,在网上之间传递棋局,不用把棋图画在纸上或用文字笨拙地描述了,不用说“王在e1, 后在XX,……”等等。写成FEN格式,或者干脆使用winboard等直接输出FEN文件,然后发过去甚至让对方直接“粘贴-复制-再粘贴”,几秒钟对方就可以完全重现该局面。
(只这张图是我做的,其他都是转的,因为群里有人问就找了这份资料分享一下)
《国际象棋译文苑》文摘