缘起与下载地址
围棋住手是胡晓奇开发的软件,效果还是不错的,可惜是收费的。他的网页(http://www.go-assistant.com/)有不少名句细节,破值得学习,但是“围棋助手”所用的sgf格式并不是标准的sgf格式(虽然“围棋助手”存成的文件后缀也是.sgf,但其实不是标准的sgf格式,为区别计,下文中称其为hgf格式)只能用围棋助手、而不能用别的打谱软件(比如multigo)打开,所以写了这个转化器,今天想了老半天终于想起了自己网页http://athos3.8u8.com的密码,遂上传了,欢迎下载http://athos3.8u8.com/hgf2sgf.zip(文件为zip格式,请用winzip解开)。
控件问题
转换器是用vb编写的,用到了vb标准控件comdlg32.ocx,如果没有的话,解决办法是:
一、不要点“Open”和“Save”两个按钮,而是直接把文件路径敲进去,这个石权宜之计;
二、彻底解决的办法
Step1.下载ComDlg32.ocx,放在C:\\Winnt\\System32目录下
Step2.进Dos Command Prompt,敲:
C:
cd C:\\winnt\\system32
regsvr32 comdlg32.ocx
转换例子
参见这个贴子,这里有一些围棋助手提供的棋谱,诛仙贴出了用这个转换器转换后的结果。
关于hgf格式的说明
sgf格式的标准简单说是这样的:
( --开始
;B[aa] ——黑棋
;W[bb] ——白棋
( --变化1开始
;B[cc] ……
;W[dd]
) --变化1结束
( --变化2开始
;B[ee]
;W[ff]
) --变化2结束
) --结束
也就是说,所有的变化必须再一个序列的最后并列。
hgf格式的文件则是这样的:
( --开始
;B[aa] ——黑棋
;W[bb] ——白棋
( --变化1(参考图)开始
;B[cc] ……
;W[dd]
) --变化1结束
--变化2(主变化)开始
;B[ee]
;W[ff]
--变化2结束
) --结束
也就是说,相对sgf格式,最后一个变化hgf认为是主变化,并省去了括号,这就导致了围棋助手的棋谱不能被别的通用sgf格式棋谱阅览器直接阅读。
代码
我是用vb做的,界面上有两个文本框,三个按钮,下面是程序源代码。
Private Sub Command1_Click()
CommonDialog1.ShowOpen
Text1.Text = CommonDialog1.FileName
End Sub
Private Sub Command2_Click()
CommonDialog1.ShowSave
Text2.Text = CommonDialog1.FileName
End Sub
Private Sub Command3_Click()
Dim strInput As String
Dim strOutput As String
Dim lngInputDepth As Long
Dim lngSibling(10000) As Long
Dim lngMore(10000) As Long
Dim L As Long
Dim LFile As Long
Dim LFileLen As Long
Dim LIn As Long
Dim LInLen As Long
Dim LOut As Long
Dim LOutLen As Long
Dim chrIn As Byte
Dim chrIn1 As Byte
Dim chrIn2 As Byte
Dim bufIn() As Byte
Dim bufOut() As Byte
Dim intFlag As Integer
Dim blHot As Boolean
Open Text1.Text For Binary As #1
Open Text2.Text For Binary As #2
ReDim bufIn(LOF(1) * 2) As Byte
ReDim bufOut(LOF(1) * 2) As Byte
LIn = 0
LFile = 0
While LFile < LOF(1)
Get #1, , chrIn
LFile = LFile + 1
If chrIn = 13 Then
Get #1, , chrIn
LFile = LFile + 1
If chrIn <> 10 Then
bufIn(LIn) = 13
LIn = LIn + 1
bufIn(LIn) = chrIn
LIn = LIn + 1
End If
ElseIf chrIn = 32 Or chrIn = 9 Then
Else
bufIn(LIn) = chrIn
LIn = LIn + 1
End If
Wend
LInLen = LIn
lngInputDepth = 0
lngSibling(lngInputDepth) = 0
lngMore(lngInputDepth) = 0
blHot = False
LIn = 0
LOut = 0
While LIn < LInLen
chrIn = bufIn(LIn)
If chrIn = 59 _
And (bufIn(LIn + 1) = 66 Or bufIn(LIn + 1) = 87) _
And bufIn(LIn + 2) = 91 _
And blHot = True Then
blHot = False
lngMore(lngInputDepth) = lngMore(lngInputDepth) + 1
bufOut(LOut) = 40
LOut = LOut + 1
bufOut(LOut) = bufIn(LIn)
LOut = LOut + 1
LIn = LIn + 1
ElseIf chrIn = 40 Then
lngInputDepth = lngInputDepth + 1
lngSibling(lngInputDepth) = 0
lngMore(lngInputDepth) = 0
blHot = False
bufOut(LOut) = bufIn(LIn)
LOut = LOut + 1
LIn = LIn + 1
ElseIf chrIn = 41 Then
lngInputDepth = lngInputDepth - 1
lngSibling(lngInputDepth) = lngSibling(lngInputDepth) + 1
blHot = True
bufOut(LOut) = bufIn(LIn)
LOut = LOut + 1
LIn = LIn + 1
For L = 0 To lngMore(lngInputDepth + 1) - 1
bufOut(LOut) = 41
LOut = LOut + 1
Next L
Else
bufOut(LOut) = bufIn(LIn)
LIn = LIn + 1
LOut = LOut + 1
End If
Wend
LOutLen = LOut
For LOut = 0 To LOutLen - 1
Put #2, , bufOut(LOut)
Next LOut
Close #1
Close #2
End Sub
今后的工作
做得有点粗糙,还有一些可以更完善的地方,仅列举如下,欢迎完善这个小小的程序。
一、hgf格式的棋谱自己定义了“把某步棋设为1”这样的功能,multigo也有,这个地方的转换我没做……
二、最好可以做成整个目录自动转换的功能……
三、以后也许hgf格式会有新的定义等……
版权
一、所谓hgf格式,我并没有拿到正式的说明,只是猜测而已,所以不保证转换完全等价,转换效果估计也不如注册版的“围棋助手”,也不保证以后hgf格式是否会变化。
二、此程序是以“as is”形式散发,即,我对程序的传播及使用后果不承诺任何责任,你用他来做什么一切后果由你自己负责。
三、版权是copyright形式。所谓copyright,简单说,可以自由使用我的代码,但不得将此代码用于商业用途,如果要用于商业用途,请和我联系,付钱;具体对copyright的定义请参考Internet上已有的正式文件。
附注
这篇文章已经被在下加入了自己的“个人文集”,以方便各位查阅。
鸣谢
感谢tandem,提供了程序的图标。 |