主说,“看哪,他们成为一样的人民,都说同一种言语,如今既做起这事来,以后他们所要做的,就没有不成功的了。” ——《圣经》创世纪第十一章, 第六条
1、介绍
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. Ne5Bh7 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. Qa7Qxc2 28. Qxb7 Qc5+ 29. Kh1 Rc7 30. Qb8+ Rc8 31. Qg3 g5 32. Rae1 Rh6 33. Qf3 Qe734. hxg5 Rh8 35. Qb3 Rc6 36. Rd1 Qc7 37. Qd3 Rg8 38. Qf3 1-0 如果是包含不止一个对局的PGN文件,实际上就是单个完整这样的PGN棋局以文本方式顺序隔行写在同一个PGN文件里。 出处:Chess world 的 PGN Archive 译者:michael 转自:http://www.xqbase.com/protocol/pgnfen1.htm