中国象棋电子棋谱PGN格式研究
正文
PGN(Portable Game Notation)是棋类游戏过程的文件格式,既然国际象棋以这个规范作为记录棋谱的标准,那么对于中国象棋来说,在还没有一个统一标准的今天,PGN无疑是一个好的选择。PGN文件有以下特点:
(1) PGN文件是文本格式的,可以用任何文本编辑软件建立和修改;
(2) PGN文件分为“标签部分”和“着法部分”,两部分都规范整齐,既方便阅读,也便于棋谱编辑软件产生和解读;
(3) 一个PGN文件允许包含多个棋局,形成简易的棋谱数据库;(很少有这么做的,多半是建成CBL格式)
(4) PGN文件的格式是公开的,现在已经被绝大多数棋谱编辑软件所接受(仅指国际象棋,目前还没有可以产生PGN文件的中国象棋软件(这句话已经失效,大部分打谱软件都可以做pgn格式))。
一个正常的PGN格式如下(注释用 ’ 表示,不标注必须存在可以舍弃)
[Game "Chinese Chess"] ’ 必须存在,缺省值Chinese Chess
[Event "赛事"] ’ 文本内对应汉字为对应定义,如有下同
[Site "地点"]
[Date "时间格式如yyyy.mm.dd"] ’ 这里只接受yyyy.mm.dd
[Time "hh:mm:ss"] ’ 这里只接受hh:mm:ss。
[Round "轮次"]
[Red "红方"] ’ 红方名字
[Black "黑方"] ’ 黑方名字
[Result "*"] ’ 此部分详见开局注释,必须存在
[Title "标题"]
[TimeControl "计时"]
[RedElo "红方积分"]
[BlackElo "黑方积分"]
[RedTeam "红方团队"]
[BlackTeam "黑方团队"]
[Annotator "解说者,如蔴球电子"]
[Creator "创建者,如蔴球电子"]
{注释例子,result中*表示未知结果,1/2-1/2表示和棋,1-0表示红方赢,0-1表示黑方赢。} ’ 开局注释
1. 炮八平五 {红方第一步}
马8进7 {黑方第一步}
......(略)
其他格式如Opening、Variation和ECCO:开局名称、变例和ECCO编号,这些都代表开局的信息,FEN表示开始局面,中局、残局和排局等摆出来的局面,作棋谱记录时通常要规定这个选项,Format:表示记谱方法,可以是Chinese(中文纵线格式)、WXF(WXF纵线格式)和ICCS(ICCS坐标格式),默认为Chinese。其他如EventDate、EventSponsor、Section、Stage、Board、Time等; 时限以TimeControl为标签的多种表示,对局结论,以Termination为标签的多种表示。其他,诸如Annotator、Mode、PlyCount等,请参阅《国际象棋译文苑》文摘——关于PGN和FEN记谱规范(上)一文。(这段话中很多格式并非必须存在的,由于原文章过于古老,很多已经弃用)
棋谱规范(有改动)
这部分是PGN的主要内容,记录了每一回合的着法、评注和结果。对于这部分内容的格式,有以下几个规定:
(1) 棋谱部分必须在标签部分的后面,棋谱部分当中不能插入标签;
(2) 每一回合都由“回合数”、“红方着法”和“黑方着法”三部分组成,回合数后面要跟“.”(句点),三者之间用两个分隔符隔开(回合数后面的句点也不例外),回合之间也用分隔符隔开;
(4) 分割符只能是空格、制表符或换行符,一个着法当中不能有分割符(回合数也一样);
(5) 评注用花括号“{}”表示,评注内可以是除花括号以外的任何字符(包括分割符),评注可以插在任何着法的后面,它和着法之间必须用分割符隔开;
(7) 结果以后只能有评注,不能有着法;如果出现标签,则说明这是下一局棋。
8.红方统一用汉字表示数字,黑方统一用全角数字表示数字。(半角数字只是为了方便举例错误写法)
例如,下列PGN文件的片段是允许的:
51. 兵五平六
{红方这一步长将还不足以判负,
但是下一次就要判负了。}
将4平5
52. 兵六平五 将5平4 53. 兵五平六 0-1 {红方长将判负}
又例如,下列PGN文件的片段是不合理的:
51.
兵五平六 将4平5 // 句点后面应该加空格
53. 兵五{再平六就要判负了}平四 // 评注不能把一个着法拆散。
变着用圆括号“()”表示,变着是以棋谱的形式对棋谱的评注,因此括号里的内容本身也是棋谱,里面还可以嵌套评注(用花括号)和变着(用圆括号)。变着针对的是括号前的着法,例如在下面一段棋谱中,变着指的是“炮2进7”改走“炮2平3”:
7. 车六进八 炮2进7 (7. ... 炮2平3 8. 帅五平六 炮3进5 9. 车六进一 将5进1 10. 炮五退二 {黑方不易驾驭局面})
1. 炮八平五 {红方第一步}
马8进7 {黑方第一步} (1. ... 炮8平5 2. 马八进七 马8进7 3. 车九平八 车9进8 {测试例子})
本人的文章参考了以下网站,谢谢!
https://www.xqbase.com/protocol/cchess_pgn.htm
(2004年11月初稿,2006年2月修订,由于某些说明过老,个人注释用中文括号表示)