C++实现qq围棋.wgs棋谱文件转换为.sgf通用棋谱

qq围棋棋谱文件是.wgs格式的,用multigo打不开,据说stonebase可以打开,又不想安装太多软件,就想着把wgs转换为sgf棋谱。

一、首先要分析wgs棋谱文件。

用UltraEdit打开一个wgs棋谱,如下:

image

参考 kiseigo的博文(http://blog.sina.com.cn/s/blog_4c8bb86b010009cd.html),已经知道从 70h行10列开始是对局,70h行8列开始2个字节保存的是总手数,由低位到高位,如上图 70行8列开始是 32 00,则总手数16进制为 00 32,转换为10进制则为:3x16+2=50手。

剩下的信息就得自己分析了,忙了一天,仍然只能分析出部分信息,对局时间,胜负信息没有找到。下面是我分析的结果:

qq棋谱文件(.wgs)分析(用UltraEdit打开,(xxh,x)表示位置):
1、(00h,a)~(10h,f)表示执黑棋手姓名,共22字节;
2、(30h,a)~(40h,f)表示执白棋手姓名,共22字节;
3、棋手姓名前面六个字节,保存的是qq号信息,从低位到高位,直接转换为十进制;
比如黑棋qq号保存在(00h,4)~(00h,9)字节内,信息为
E9 03 E4 41 00 00
则表示的qq号是 00 00 41 E4 03 E9 所表示的十进制数,即 1105462249
4、棋盘大小 在wgs文件中,棋盘路数信息保存在 60h行,5列,第101字节处
5、手数保存在 (70h,8)~(70h,9);
6、对局从(70h,a)开始;

7、wgs用 01 00表示 脱先  pass一手;

8、wgs用坐标表示棋盘上的点,以左上角为原点,横向坐标为列坐标,纵向坐标为行坐标;

9、每一手棋用两个字节表示其坐标,第一个(high)表示列,第二个(low)表示行。表示列的字节,棋盘坐标从1开始计算,则列计算公式为:列=(dec)high/4+1;行=low+1;其中dec表示将high转换为10进制,加1是因为wgs中坐标从0开始;

 

二、分析sgf棋谱

打开Multigo,和Gnu Go随便下一盘棋,然后用notepad++打开sgf棋谱:

 

 

对照棋谱复盘,很容易发现如下信息:

1、sgf也是以坐标表示棋盘,左上角为原点,向右向下依26个英文字母的顺序,即a,b,c,d…,共19个字母。

2、CA[gb2312]表示字符集,编程的时候直接写入文件就好;

3、SZ[9]表示棋盘大小,这里是9路;

4、AP[MultiGo:4.4.4]表示的是打谱软件,可以不用管;

5、DT[2012-07-14 19\:36\:03]表示的是对弈时间,wgs中没有找到对应信息;

6、PB[black]表示黑棋(Black)姓名;

7、PW[white]表示白棋(White)姓名;

8、RE[白胜4.25子]表示对局结果,wgs中没有找到对应信息;

9、B[gc]表示黑棋行棋的坐标;

10、W[cg]表示白棋行棋的坐标;

更加详细的说明可以在http://floss.zoomquiet.org/data/20051105182812/index.html

http://www.red-bean.com/sgf/index.html找到。

基于以上分析,开始写代码。

三、代码实现

 

注:代码未简化,会输出调试信息。

 

四、总结

通过这个小程序,熟悉了一些文件操作方法。但程序还存在很多问题,不能完全解读wgs文件是一大障碍,sgf还好,都不用找资料,直接多打几个谱就看出来了。还有代码没有使用函数或者面向对象的方法,导致代码有点乱,以后的目标就是要解读wgs文件,完善程序。有可能的话加上界面,时这个小工具更加实用。

附:写代码时用到的一些小工具
1、由16进制机内码得到汉字

2、由wgs文件16进制坐标计算10进制坐标

3、十六进制转十进制

4、十进制转十六进制

项目主页:https://github.com/annProg/wgs2sgf

One thought on “C++实现qq围棋.wgs棋谱文件转换为.sgf通用棋谱

  1. Pingback: QQ围棋棋谱转换程序wgs2sgf V1.1发布 | 知行近思

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注