
1、PGN介绍
PGN就是“可移植式棋局记号法”(PortableGameNotation),是一种以ASCII文本文件表示国际象棋棋局数据的标准设定。PGN设计成使人们很容易进行阅读和编写,电脑程序很容易进行解析和产生。定义和传播PGN的目的,是为了促进公开对局数据的共享交流,包括来自全世界的棋手(不管有无组织)、出版人和电脑国际象棋研究的。
PGN不是万能;也没有什么标准无所不能。它被希望作为数据交换的一种通用可移植式表示法,就是给予国际象棋应用群体能够从PGN本身导入导出来快速方便地处理对局数据的。对它的要求是:简洁明了、可在不同平台工作、多数人们和多种处理程序都能理解运用和产生,也就是说“同一种语言”、公开而不加密、易于扩展和升级、国际化、以及具有继承性。【译注:因为是编译,所以译文的小标题编号与原文并不对应了,以下均是】
2、一个标准的PGN对局
虽然初看上去它似乎比较冗长,但实际上PGN相当简单。以下是一个范例,而它具有的重要特征将在后文中展开描述:
[Event"F/SReturnMatch"]
[Site"Belgrade,SerbiaJUG"]
[Date"1992.11.04"]
[Round"29"]
[White"Fischer,RobertJ."]
[Black"Spassky,BorisV."]
[Result"1/2-1/2"]
1.++26.+/2-1/2
3、结构
一个PGN数据文件是从零到很多盘PGN棋局的顺序性集合。空文件也是合法的PGN数据文件,虽然有点不太常规。
一个PGN棋局由两部分组成。第一是“标签对部分”,第二是“棋谱部分”。标签对部分用于识别棋局,有着标准的参数;棋谱则用“标准代数记谱法”表示,也将在后文加以描述。
3-1标签对部分
标签对部分由一系列空的或更多的“标签对”组成。而标签对则由左右方括号、象征符号、字符串符号组成。象征符号是标签的名字,而字符串符号就是如之一起的标签值,它们的表示法都有一定标准。在一个标签对部分里不能出现同一个标签名多于一次以上。标签名是分大小写的,所有用于档案储存的标签名都是以大写字母开头【译注:一时不熟悉PGN的不要被这些术语名词吓倒,相对于十分详尽的原文,译文已尽量大大简略了。实际只要对照上面那个标准PGN棋局看下去,看到那些方括号了吧?就是标签对部分,很容易明白的】。
七个标签项
这是最基本七个标签项目,实际上输入时,顺序不一定这样严格,而且还可能根据需要进行扩展和增加。这七个基本标签项依顺序是:【译注:注意PGN规范不支持中文字符,下面“//”之后的中文只是本文加的解释说明】
1)Event比赛名。比如:
[Event"FIDEWorldChampionship"]//国际棋联世界锦标赛
[Event"CasualGame"]//即兴比赛
[Event"?"]//比赛名不详
2)Site比赛地点。比如:
[Site"NewYorkCity,NYUSA"]//美国纽约
[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,MikhailN."]//米哈依尔·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”,而不是数字“零”。
吃过路兵没有什么特殊表示法。至于兵的升变,以“=”后面紧接升变棋子的符号来表示。
一步棋带将军的就在后面加个“+”,将死就是用“,意思就是黑方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“开局百科”(EncyclopediaofChessOpenings)里定义的开局编号
5)NIC著名的“NewinChess”数据库里定义的开局编号
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-EdwardsNotation)表示开始局面,关于FEN的表示法,下一篇再来解释
4-6对局结论
以Termination标签名表示Result标签项没有能披露的额外信息
1)[Termination"abandoned"]//该局放弃
2)[Termination"adjudication"]//结果由第三方宣判
3)[Termination"death"]//哦……
4)[Termination"emergency"]//出现无法预料的情况
5)[Termination"normal"]//常规结束
6)[Termination"rulesinfraction"]//失利方违规
7)[Termination"timeforfeit"]//失利方超时
8)[Termination"unterminated"]//没有结束
4-7其它
这是不好归入以上各类的标签项。
1)Annotator评注者(们)的名字
2)Mode这是下该局的方式,比如OTB代表棋盘上,PM代表通过书面邮件,EM代表通过电子邮件,ICS指在网上站点下的,TC代表通过通常的长途电讯
3)PlyCount表示该局的步数,严格来说是指“半”步数
5、文件名和目录
就是以“.pgn”作为文件后缀,例如:。
至于文件名和目录,如果要以严格档案式命名法来命名,可以有很多清规戒律,不过一般用途就不用那么严格了,只要好记好理解,按一般电脑文件命名的方法就行了,只是要注意在不同操作系统平台上尽量通用。总之如果是个人或小范围用途的就很随意,只有后缀是规定的。
6、PGN软件
原文根本上是一篇关于PGN及相关技术的严格定义规范性手册或者指南,本译文只是抽取它的最重要部分进行编译。如果一般了解运用PGN,特别对于仅是用来打谱、收集和交流棋局的,足够了。不过知道上述一些定义,使用起来会得心应手得多。
但是,想写程序的,则就要认真去读原文了。
还有关于FEN等国际象棋记谱格式,也很常用到,将在下一篇继续编译。
最后,放一个标准PGN格式的单文件内容,对照来看,一看就会。PGN文件不兼容中文字体,“//”后面的中文实际上是加上去的注释说明,原文件里没有的。PGN实际上就是文本文件,可以用记事本或其它字处理工具直接打开,打开单个文件就是如下这样的。远不是所有提到的标签项都包括,但那七个基本标签都有:
[Event"CHN-RUSSummitMen"]//赛事名,中国-俄罗斯最高对抗赛男子组
[Site"Shanghai"]//地点,上海
[Date"2001.09.10"]//该局日期
[Round"4"]//第4轮
[White"YeJiangchuan"]//白方叶江川
[Black"Dreev,Alexey"]//黑方A·德里耶夫
[Result"1-0"]//对局结果白胜
[Opening"Caro-Kann:classical,6.h4"]//开局名,卡罗-卡恩防御:经典变例,6.h4
[ECO"B19"]//ECO开局编号为B19
[NIC""]//"NewInChess"编号
[WhiteElo"2677"]//白方国际ELO等级分
[BlackElo"2690"]//黑方国际ELO等级分
[PlyCount"75"]//双方共走了75步(不是回合)
[EventDate"2001.09.07"]//赛事开始日期
1.
+13.
+
+29.+
34.
如果是包含不止一个对局的PGN文件,实际上就是单个完整这样的PGN棋局以文本方式顺序隔行写在同一个PGN文件里。

PGN是用来储存对局的,除此之外为了适应国际象棋其它相关要求,还有其它的数据表示标准,最重要的两个是FEN和EPD。译文主要说说FEN的格式。
1、FEN
FEN就是“福斯夫-爱德华兹记号法”(Forsyth-EdwardsNotation),这是一种使用ASCII码字符描述国际象棋局面的标准。FEN是建立在19世纪由报社记者S·D·福斯夫设计的记录局面的标准基础上的。后来为了适合象棋软件的需要,由爱德华兹对此做了少许修改。
一份标准的局面记号对需要大量交换共享局面数据的国际象棋程序设计等工作具有尤其重要的作用。【译注:实际上,对于一般学棋拆棋,哪怕是娱乐,也很有用,后文将简单举例说明】
1-1结构描述
一个FEN记录使用长度可不同的一行来表示,由六个区域组成。单纯的FEN记录文件后缀应该是“.fen”,比如:。
FEN描述了:棋子位置、轮走棋方、易位可行性、吃过路兵目标格、半步计数、以及总回合数。所有这一切用一行文字符号表示就行了而且非常容易读。
看看一个FEN的六个区域及其含义,先举一个谁都太熟悉了的局面的FEN文件:

这就是每盘常规对局的最初局面,一个子都没有动。
译文以不同颜色表示了这个FEN中的六个不同区域,它们是:
1)棋子位置数值区域(Pieceplacementdata)红色那段
就是表示双方棋子各在棋盘哪个格子上的。规则是从第8横线开始顺次数到第1横线(白方在下,从上数到下),从a线开始顺次数到h线;白方棋子以大写字母“PNBRQK”表示,黑方棋子以小写“pnbrqk”表示,这是英文表示法,每个字母代表的意义与常规规定相同。数字代表一个横线上的连续空格,反斜杠“/”表示结束一个横线的描述。
上面的那pppppppp,就是表示黑方在第7横线上排有8只兵;后面那4个数字8,就是表示从第6到第3横线,双方一个棋子都不在,是空格;7个反斜杠“/”将第一区域分成8段,因为棋盘有8条横线;其它的照着图完全可以类推。
2)轮走棋方(Activecolor)深绿色那段
表示目前局面该谁走棋。小写“w”表示白方走棋;小写“b”表示黑方走棋;显然起初局面肯定是白先,所以上面就是“w”。
3)易位可行性(Castlingavailability)紫色那段
这表示在当前局面下每一方有没有潜在的各种王车易位的可行性(目前不一定行,但以后有可能行)。如果谁都没有,就用“-”表示;大写“K”表示白方有短易位的可行性,大写“Q”表示白方有长易位的可行性;对应的小写“k”和“q”代表黑方短和长易位的可行性。书写顺序必须是先大写后小写、先短易位后长易位,并且之间不能有空格。
4)吃过路兵目标格(Enpassanttargetsquare)紫红色那段
如果没有,就用“-”表示。如果有,就用具体完成吃过路兵的那个格子坐标来表示,显然对于白兵被吃只可能在第3横线,对于黑兵被吃只可能在第6横线。而且,这个标记是且只是在该局面紧接的上一步棋是某方刚走兵推进两格的情况下出现。
5)半回合计数(Halfmoveclock)浅蓝色那段
用一个非负数表示自从上一次动兵或吃子之后目前走了的半回合数。这个是为了适应50步和棋规则而定。【译注:但是在winboard的FEN输出中,这个值好象总是0】
6)回合数(Fullmovenumber)棕色那段
当前要进行到的回合数。不管白还是黑,第一步时总是以1表示,以后黑方每走一步数字就加1。
1-2举例
好了,举例说明:
假如从开局开始,走了1.++
这个写成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文件,然后发过去甚至让对方直接“粘贴-复制-再粘贴”,几秒钟对方就可以完全重现该局面。
(只这张图是我做的,其他都是转的,因为群里有人问就找了这份资料分享一下)
《国际象棋译文苑》文摘
出处:Chessworld的PGNArchive
译者:michael
类型:编译