sgfsgf围棋棋谱下載如何在手机打开呐

如何挪动SGF棋谱中一个子的位置?【围棋吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:190,313贴子:
如何挪动SGF棋谱中一个子的位置?
例如100手的一个棋谱,你录入完发现黑31点错位置了。 好像STONEBASE可以修改棋子坐标吧,MULTIGO好像不行。
重新点工具,点新窗口试走,就可以了。
呵呵,我的意思是,白32-白100的都保留,只黑31改变。貌似您的方法不行吧。
啊。31-100都保留,那不球行。
直接编辑SGF明码文件倒是简单得很,也许这就是了解SGF文件格式的意义吧,呵呵
贴吧热议榜
使用签名档&&
保存至快速回贴&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&&|&
位置:&&&&&&&&&&&&&&&&&游戏信息
子栏目导航
SgfReader(围棋SGF棋谱阅读器)绿色版
运行环境:&Win9x/NT/2000/XP/2003
(载入中...)
文件大小:&541&K
软件类别:&国产软件
软件语言:&简体中文
授权方式:&免费版
添加时间:&
软件等级:&★★★★★
软件作者:&佚名
下载次数:&日:&总:
::软件简介::
一个轻便的围棋SGF棋谱阅读器
::下载地址::
::本类热门::
?&?&?&?&?&?&?&?&?&?&
::相关文章::
::相关下载::
::相关搜索::
::下载说明::
*&为了达到最快的下载速度,推荐使用网际快车下载本站软件。
*&如果您发现该软件不能下载,请通知或点击【】,谢谢!
*&未经本站明确许可,任何网站不得非法盗链及抄袭本站资源;如引用页面,请注明来自本站,谢谢支持!qq围棋棋谱转换sgf打开软件|QQ围棋wgs棋谱转sgf工具wgs2sgf下载V1.4最新免费版__西西软件下载
西西软件园多重安全检测下载网站、值得信赖的软件下载站!
相关软件 /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /中文/ /中文/顶好评:50%踩坏评:50%请简要描述您遇到的错误,我们将尽快予以修正。轮坛转帖HTML方式轮坛转帖UBB方式
728KB/中文/6.7
53.2M/中文/7.6
230KB/中文/2.8
14KB/中文/2.7
1.1M/中文/2.5
2.9M/中文/3.9
5.2M/中文/5.7
QQ围棋wgs棋谱转sgf工具wgs2sgf是一款QQ棋谱棋谱批量转换工具,QQ围棋棋谱不能用multigo打开,很不方便,于是写了个wgs转sgf的命令行小工具,可以将wgs格式转换为sgf格式,目前已经能够转换大部分对局信息,包括对局双方昵称、qq号,段位、评测段位、让子、贴目、胜负、对局日期等。用法说明:1. 简单方式将wgs棋谱文件拖到 wgs2sgf.exe 上即可在wgs棋谱旁生成一个sgf棋谱文件。2. 批处理方式点击 wgs2sgf.bat ,将生成两个目录qqgo_sgf、qqgo_wgs分别保存wgs棋谱和转换后的sgf棋谱。3. 命令行方式wgs2sgf 源文件or: wgs2sgf *.wgs(使用通配符)or: wgs2sgf [选项]示例: wgs2sgf -qqqqgo.wgs可用选项:-v 显示版本信息-qq转换QQ号 (默认不转换QQ号,因此上述用法 1、2将不转换QQ号)-help 显示此帮助信息更新说明:特性及漏洞修复* wgs文件已经大部分解析,因此wgs2sgf 1.4进行了重构* 修复贴目缺陷* 新增让子信息* 新增对局结果(点目)信息* 修复对局日期缺陷* 修复QQ号读取BUG* 新增段位信息(包括评测段位)* 修复让子棋处理缺陷
安卓官方手机版
IOS官方手机版
QQ围棋wgs棋谱转sgf工具wgs2sgf V1.4最新免费版
下载帮助西西破解版软件均来自互联网, 如有侵犯您的版权, 请与我们联系。  这是本人(liigo)独立实现的SGF格式围棋棋谱文件解析器,本文介绍其实现细节。网络上肯定可以找到完善的开源的SGF解析器,这是毋庸置疑的,我不直接使用它们,也不参考它们的实现代码,而是自己独立编码实现,是有原因的,因为我想自己重复发明轮子,并且认为这样更有助于提高我的编码能力。(关于我的“一定要学会重复发明轮子”的不成熟的论调,今后我将会专门撰文表述。)
  我(liigo)开发的这个SGF解析器,采用基于事件的简单API,类似于XML解析器中的SAX(Simple API for XML)。这种解析器的核心是:由用户事先提供一系列回调函数,解析器在解析的过程中,依次调用相关的回调函数并传入相应参数,用户程序在回调函数中做出相应的处理。此类解析器属于轻量级的解析器,解析速度快,占用内存少,结构清晰易于实现,只是相对来说不如基于DOM的解析器方便使用。
  SGF格式,Smart Game Format,被设计用来记录多种游戏类棋谱的通用格式,在围棋领域被发扬光大,是用于描述围棋棋谱的最重要也最通用的形式。它是纯文本的、基于树(TREE)的结构,便于识别、存储和传输。其格式简洁实用,也非常易于编程解析。SGF格式官方规范网址为:。(说到,不得不赞叹一下,它只需用一幅图就可以完整还原一盘棋从始至终的风云变幻;作为对比,象棋一幅图只能描述对弈中某一时刻的场景。)
  SGF的主要结构由树(GameTree)、节点序列(Sequence)、节点(Node)、属性(Property)等组成。其中“属性”为最重要的基本单位,它由属性标识(PropIdent)和属性值(PropValue)组成。由分号“;”分隔的多个属性,称为节点。多个节点顺序排列称为节点序列。由括号“(”“)”括起来的节点序列,称为树,树中可包含子树。SGF的EBNF定义如下(参见):
Collection = GameTree { GameTree }
= "(" Sequence { GameTree } ")"
= Node { Node }
= ";" { Property }
= PropIdent PropValue { PropValue }
= UcLetter { UcLetter }
= "[" CValueType "]"
CValueType = (ValueType | Compose)
= (None | Number | Real | Double | Color | SimpleText | Text | Point
| Move | Stone)
  以下是一个简单的有一定代表性的SGF文本,先让大家有一个感性认识:
(;FF[4]GM[1]SZ[19]FG[257:Figure 1]PM[1]
PB[Takemiya Masaki]BR[9 dan]PW[Cho Chikun]
WR[9 dan]RE[W+Resign]KM[5.5]TM[28800]DT[,19]
EV[21st Meijin]RO[2 (final)]SO[Go World #78]US[Arno Hollosi]
;B[pd];W[dp];B[pp];W[dd];B[pj];W[nc];B[oe];W[qc];B[pc];W[qd]
(;B[qf];W[rf];B[rg];W[re];B[qg];W[pb];B[ob];W[qb]
(;B[mp];W[fq];B[ci];W[cg];B[dl];W[cn];B[qo];W[ec];B[jp];W[jd]
;B[ei];W[eg];B[kk]LB[qq:a][dj:b][ck:c][qp:d]N[Figure 1]
;W[me]FG[257:Figure 2];B[kf];W[ke];B[lf];W[jf];B[jg]
(;W[mf];B[if];W[je];B[ig];W[mg];B[mj];W[mq];B[lq];W[nq]
(;B[lr];W[qq];B[pq];W[pr];B[rq];W[rr];B[rp];W[oq];B[mr];W[oo];B[mn]
(;W[nr];B[qp]LB[kd:a][kh:b]N[Figure 2]
;W[pk]FG[257:Figure 3];B[pm];W[oj];B[ok];W[qr];B[os];W[ol];B[nk];W[qj]
;B[pi];W[pl];B[qm];W[ns];B[sr];W[om];B[op];W[qi];B[oi]
(;W[rl];B[qh];W[rm];B[rn];W[ri];B[ql];W[qk];B[sm];W[sk];B[sh];W[og]
;B[oh];W[np];B[no];W[mm];B[nn];W[lp];B[kp];W[lo];B[ln];W[ko];B[mo]
;W[jo];B[km]N[Figure 3])
(;W[ql]VW[ja:ss]FG[257:Dia. 6]MN[1];B[rm];W[ph];B[oh];W[pg];B[og];W[pf]
;B[qh];W[qe];B[sh];W[of];B[sj]TR[oe][pd][pc][ob]LB[pe:a][sg:b][si:c]
N[Diagram 6]))
(;W[no]VW[jj:ss]FG[257:Dia. 5]MN[1];B[pn]N[Diagram 5]))
(;B[pr]FG[257:Dia. 4]MN[1];W[kq];B[lp];W[lr];B[jq];W[jr];B[kp];W[kr];B[ir]
;W[hr]LB[is:a][js:b][or:c]N[Diagram 4]))
(;W[if]FG[257:Dia. 3]MN[1];B[mf];W[ig];B[jh]LB[ki:a]N[Diagram 3]))
(;W[oc]VW[aa:sk]FG[257:Dia. 2]MN[1];B[md];W[mc];B[ld]N[Diagram 2]))
(;B[qe]VW[aa:sj]FG[257:Dia. 1]MN[1];W[re];B[qf];W[rf];B[qg];W[pb];B[ob]
;W[qb]LB[rg:a]N[Diagram 1]))
  熟悉编写文本解析器的程序员朋友应该都清楚,根据EBNF定义,编写对应的解析器,是相当简单和直观的,貌似只是一项翻译性的工作。本人实现SGF解析器,再次印证了这个观点,大部分情况下,我只是按部就班地将EBNF翻译为C语言代码而已,呵呵。
  我首先设计了“SGFParseContext”结构,用于保存解析器工作期间的相关数据:
typedef struct _tagSGFParseContext
void* pUserD
PFN_ON_TREE pfnOnT
PFN_ON_TREE_END pfnOnTreeE
PFN_ON_NODE pfnOnN
PFN_ON_NODE_END pfnOnNodeE
PFN_ON_PROPERTY pfnOnP
char idBuffer[16];
char* valueB
int valueBufferS
  相应的还有初始化和清理SGFParseContext结构的函数,initSGFParseContext, cleanupSGFParseContext,皆不是本解析器的关键,略过不提。
  接着我(liigo)设计了五个回调函数的函数原形:
typedef void (*PFN_ON_TREE) (SGFParseContext* pContext, const char* szTreeHeader, int treeIndex);
typedef void (*PFN_ON_TREE_END) (SGFParseContext* pContext, int treeIndex);
typedef void (*PFN_ON_NODE) (SGFParseContext* pContext, const char* szNodeHeader);
typedef void (*PFN_ON_NODE_END) (SGFParseContext* pContext);
typedef void (*PFN_ON_PROPERTY) (SGFParseContext* pContext, const char* szID, const char* szValue);
  这五个回调函数,将分别在解析器解析到“树开始”“树结束”“节点开始”“节点结束”“遇到属性”时,由解析器调用。解析器调用每个回调函数时,都会传入必需的参数,供回调函数即时取用。
  下面正式开始解析工作。整个解析器被分为 parseProperty, parseNode, parseNodeSequence, parseGameTree, parseSGF 几大部分顺序解析,属于至底向上的分析实现模式。这几大部分,也分别对应着SGF的EBNF定义中的某一项。所有解析函数都接收参数 const char* szCollection, int fromPos,之前的解析函数将决定后续解析函数的起始解析位置。
  第一步,解析属性(parseProperty)。此处关键的是要定位到属性值(szValue)开始和结束符号“[”和“],两者之间的是属性值,“[”之前的则是属性标识(szID)。由于[和]之间可能存在转义字符“/”,不能简单地搜索字符“]”,必须花相当篇幅的代码处理转义字符(我用局部变量in_escape记录转义状态并进行分别处理)。此外要为提取出的属性标识和属性值分配足够的存储空间,以便传递到用户回调函数,前者不会太长使用静态分配,后者变长则使用动态分配(同时自动预分配存储空间,缓存,避免频繁申请内存)。代码如下:
//Property: id[value]
int parseProperty(SGFParseContext* pContext, const char* szCollection, int fromPos)
const char* szFromP
int nIDBufferSize = sizeof(pContext-&idBuffer) - 1;
assert(szCollection && fromPos &= 0);
szFromPos = szCollection + fromP
lindex = findchar(szFromPos, -1, '[');
assert(lindex & 0 && lindex & nIDBufferSize);
if(lindex & 0 && lindex & nIDBufferSize)
memcpy(pContext-&idBuffer, szFromPos, lindex);
pContext-&idBuffer[lindex] = '/0';
if(isTextPropertyID(pContext-&idBuffer))
//parse the text or simple-text value, consider the '/' escape character
const char* s = szFromPos + lindex + 1;
int in_escape = 0;
int valuelen = 0;
getEnoughBuffer(pContext, 1024);
pContext-&valueBuffer[0] = '/0';
assert(c);
if(!in_escape)
if(c == '//')
in_escape = 1;
else if(c == ']')
getEnoughBuffer(pContext, valuelen + 1);
pContext-&valueBuffer[valuelen++] =
//ignore the newline after '/'
if(c != '/r' && c != '/n')
getEnoughBuffer(pContext, valuelen + 1);
pContext-&valueBuffer[valuelen++] =
char nc = *(s+1);
if((c=='/r' && nc=='/n') || (c=='/n' && nc=='/r'))
in_escape = 0;
getEnoughBuffer(pContext, valuelen + 1);
pContext-&valueBuffer[valuelen] = '/0';
if(pContext-&pfnOnProperty)
pContext-&pfnOnProperty(pContext, pContext-&idBuffer, pContext-&valueBuffer);
return (s - szCollection + 1);
int rindex = findchar(szFromPos, -1, ']');
int nNeedBufferSize = rindex - lindex - 1;
assert(rindex &= 0);
getEnoughBuffer(pContext, nNeedBufferSize);
memcpy(pContext-&valueBuffer, szFromPos + lindex + 1, nNeedBufferSize);
pContext-&valueBuffer[nNeedBufferSize] = '/0';
if(pContext-&pfnOnProperty)
pContext-&pfnOnProperty(pContext, pContext-&idBuffer, pContext-&valueBuffer);
return (fromPos + rindex + 1);
return -1;
  第二步,解析节点(parseNode)。分号“;”跟后面N个属性,一个while循环调用parseProperty()逐个解析属性即可:
//Node: ; {property}
int parseNode(SGFParseContext* pContext, const char* szCollection, int fromPos)
const char* szFromPos = szCollection + fromP
assert(fromPos &= 0);
//assert(szFromPos[0] == ';');
if(pContext-&pfnOnNode)
pContext-&pfnOnNode(pContext, szFromPos);
if(szFromPos[0] == ';')
fromPos++; szFromPos++;
fromPos += skipSpaceChars(szFromPos, NULL);
if(szCollection[fromPos] == '/0' || findchar(";)(", -1, szCollection[fromPos]) &= 0)
fromPos = parseProperty(pContext, szCollection, fromPos);
szFromPos = szCollection + fromP
return fromP
  第三步,解析节点序列(parseNodeSequence)。节点的顺序排列,至少有一个节点,后面可能还有0个或多个节点。仍然是一个while循环搞定:
//NodeSequence: node{node}
int parseNodeSequence(SGFParseContext* pContext, const char* szCollection, int fromPos)
const char* szFromPos = szCollection + fromP
assert(fromPos &= 0);
//assert(szFromPos[0] == ';');
fromPos = parseNode(pContext, szCollection, fromPos);
fromPos += skipSpaceChars(szFromPos, NULL);
szFromPos = szCollection + fromP
if(szFromPos[0] != ';')
if(pContext-&pfnOnNodeEnd)
pContext-&pfnOnNodeEnd(pContext);
return fromP
  第四步,解析树(parseGameTree)。树是一个嵌套结构,最外层是一对括号“(”“)”,里面是N个节点序列或N个嵌套的子树。仍然用一个while循环搞定,遇到“(”则递归调用parseGameTree()解析树或其子树,否则调用parseNodeSequence()解析节点序列。代码如下:
//GameTree: ( {[NodeSequence]|[GameTree]} )
//old GameTree: ( NodeSequence {GameTree} )
int parseGameTree(SGFParseContext* pContext, const char* szCollection, int fromPos)
const char* szFromPos = szCollection + fromP
assert(fromPos &= 0);
assert(szFromPos[0] == '(');
pContext-&treeIndex++;
if(pContext-&pfnOnTree)
pContext-&pfnOnTree(pContext, szFromPos, pContext-&treeIndex);
fromPos++; szFromPos++;
fromPos += skipSpaceChars(szFromPos, NULL);
c = szCollection[fromPos];
if(c == '(')
fromPos = parseGameTree(pContext, szCollection, fromPos);
fromPos = parseNodeSequence(pContext, szCollection, fromPos);
szFromPos = szCollection + fromP
fromPos += skipSpaceChars(szFromPos, NULL);
c = szCollection[fromPos];
if(c == ')')
if(pContext-&pfnOnTreeEnd)
pContext-&pfnOnTreeEnd(pContext, pContext-&treeIndex);
pContext-&treeIndex--;
return (fromPos + 1);
  第五步,最后一步了,解析整个SGF文本内容(parseSGF)。这是对外公开的核心接口。N个树的顺序排列,好办呀,循环调用parseGameTree()顺序解析各个树不就OK了?代码如下:
//SGFCollection: GameTree {GameTree}
int parseSGF(SGFParseContext* pContext, const char* szCollection, int fromPos)
const char* szFromPos = szCollection + fromP
assert(fromPos &= 0);
assert(szFromPos[0] == '(');
pContext-&treeIndex = -1;
fromPos = parseGameTree(pContext, szCollection, fromPos);
fromPos += skipSpaceChars(szFromPos, NULL);
szFromPos = szCollection + fromP
if(szFromPos[0] != '(')
return fromP
  测试代码:
int main(int argc, char *argv[])
SGFParseContext C
//initSGFParseContext(&Context, onTree, onTreeEnd, onNode, onNodeEnd, onProperty, NULL);
initSGFParseContext(&Context, onTree2, onTreeEnd2, onNode2, onNodeEnd2, onProperty2, NULL);
//test parse property:
s = "AB[cdef]X[xyz]";
printf("/ntest parse property: ----- /n");
x = parseProperty(&Context, s, 0);
x = parseProperty(&Context, s, 8);
s = "C[ab//]cd]";
x = parseProperty(&Context, s, 0);
//test parse node:
s = ";A[a]BB[bb]C[]";
printf("/ntest parse node: ----- /n");
x = parseNode(&Context, s, 0);
s = ";A[a];BB[bb]C[]";
x = parseNode(&Context, s, 0);
x = parseNodeSequence(&Context, s, 0);
//test parse tree:
printf("/ntest parse tree: ----- /n");
s = "(;A[a](;C[c](X[x])Z[z]);D[d](;E[e](F[ff])))";
x = parseGameTree(&Context, s, 0);
//parse real sgf file:
int len = 0;
void* data = NULL;
FILE* pfile = fopen("d://x.txt", "r");
printf("/n---------- test parse real sgf file: -------- /n");
fseek(pfile, 0, SEEK_END);
len = ftell(pfile);
assert(len & 0);
fseek(pfile, 0, SEEK_SET);
data = malloc(len);
assert(data);
fread(data, 1, len, pfile);
parseSGF(&Context, data, 0);
fclose(pfile);
pfile = NULL;
printf("/n----- any key to exit: ----- /n");
fflush(stdout);
scanf("%c", &c);
  总结:整个SGF解析器结构比较清晰,只要按照EBNF定义,按部就班地逐步处理即可,不是特别复杂。但由于牵涉到文本、指针、递归,有许多细节需要注意。各位朋友不妨评估一下,自己需要花费多久可以写出类似这样一个SGF解析器?如果时间充裕,也不妨真的动手写一下,看看是否眼高手低呢?所谓的“重复发明轮子”,并非绝对的毫无意义,至少可以锻炼我的动手能力。
  另外,有一个设计上的取舍,不知是较好还是较坏。所有的回调函数,目前都有一个 SGFParseContext* pContext ,而此前相同位置的参数是 void* pUserData。是后来考虑到回调函数可能需要访问SGFParseContext中的相关数据(如在PFN_ON_NODE中读取treeIndex),为了方便用户使用才引入pContext参数(用户也可以通过pUserData自行传入pContext,终究是多了一步)。目前的做法,似乎暴露了解析器内部结构(SGFParseContext),又似乎增强了回调函数的稳定性和扩展性(即使不改变函数原形也能通过pContext提供额外参数)。
  虽然这个SGF解析器已应用到开源软件“M8围棋谱”()中,并初步达到了实用目的,但并不能保证该解析器已达到工业强度,其实有不少情况尚未测试到,必然会有疏忽错漏之处,诚请各位朋友批评指正。
  另注,考虑到与现有SGF格式文件的兼容性,对SGF规范中的EBNF稍做了一定扩展。
  完整源代码请参见:
人机博弈 围棋程序GNU GO 所有版本源码及使用方法
GNU Go是免费的带源代码的人机对弈软件,棋力在九级左右。和其它GNU 软件一样, 它遵从 GNU 公用许可证GPL。你可免费获得它的源代码,并可自由使用和修改。 但GNU GO只提供字符界面,更多...
http://www.dpxq.com/hldcg/search/view_u_42882.html
http://www.dpxq.com/hldcg/search/view_u_42885.ht...
纯Javascript+css开源围棋软件eidogo
嵌入式SGF查看和编辑器 EidoGo Player (SGF viewer and editor) 是一款开源(AGPLv3许可)纯javascript+css编写、在浏览器内运行的围棋打谱、编辑软...
使用xetex直接由围棋棋谱文件创建pdf书籍
【转载请注明出处】本人是一个围棋爱好者,这几天心血来潮,看到xe(la)tex能够对中文字体提供原生的支持,不由试了试,看能否由sgf(Smart Go Format)文件直接生成pdf文档。由sgf...
xfgsdfgnjdfjd
没有更多推荐了,sgf棋谱格式简介
其实我也是一知半解,只是在围棋宝典的不断升级中,才逐步了解到一点基本知识。
目前最通用的围棋棋谱格式是sgf格式,绝大多数围棋软件在使用它。如果有棋友发给你棋谱,多半是xxx.sgf这样的文件名。当然还有很多私有格式,例如弈城(Tygem)是gib,天顶(Zenith)是zgf(这2种棋谱通过围棋宝典《棋力提高》内的《本地棋谱》均可直接打开),弈典(Stonebase)的sdb格式(貌似只能在弈典内打开,但可以转为sgf),等等。
sgf是Smart Game Format的简拼,大致翻译是“灵活的游戏格式”;所谓“灵活”,应该是说它最初的目的是为了可以记录所有棋类游戏(Board Game)的棋谱,包括国际象棋、跳棋等。
它存储的内容是文本,因而便于移植到不同的平台,同时还意味着短小精悍。
(;GM[1]SZ[19]HA[0]KM[3又3/4子]AP[MultiGo:4.4.4]DT[]PB[柯洁]BR[9P]PW[朴廷桓]WR[9P]GN[柯朴十番棋第1局]PC[北京]RE[B+R]
;B[pd];W[dd])
声明:棋谱内容都是即兴打的,柯朴十番棋并不存在,更不会在今天举行。
上述这个仅100多个字符的文本就是一张棋谱,为了演示,它只有2手(即使几百步的棋谱,也不过几K大小),它在围棋宝典里显示如下:
接下来解析那段文本,为方便起见,把例子再复制到这里:
(;GM[1]SZ[19]HA[0]KM[3又3/4子]AP[MultiGo:4.4.4]DT[]PB[柯洁]BR[9P]PW[朴廷桓]WR[9P]GN[柯朴十番棋第1局]PC[北京]RE[B+R]
;B[pd];W[dd])
首先,整张棋谱以左括号 ( 开始,以右括号 ) 结束。这对()内可能还有成对的(),会在后边解释。
然后,前边一段算是文件头,记录了该谱的一些基本信息(棋友有兴趣可以看一下,没兴趣跳到后边看),下边列出了一些常用的标记:
GM(即game)表示游戏种类,1代表围棋;
SZ(即size)表示棋盘尺寸,本谱是19路棋盘;如果是13路、9路,修改这里就好;
HA(Handicap)表示让子数,0表示分先;
KM(komi)表示贴目(帖子),本谱为黑贴3又3/4子;
AP(application)表示形成棋谱的应用,本谱电脑软件猫踢狗(MultiGo);
DT(date)表示比赛日期,本谱是日;
PB(player black)表示黑方姓名;BR(black rank)表示黑方段位;
PW(player white)表示白方姓名;WR(white rank)表示白方段位;
GN(game name)表示比赛名称,有的棋谱则喜欢用EV(event)来记录比赛名称;
PC(place)表示比赛地点,本谱是北京;
RE(result)表示比赛结果,本谱是黑中盘胜(B+R代表,具体规则不在本文展开);
等等;以上信息很多可以不录入,例如不录入HA(让子)就可以认为是分先,不录入SZ(棋盘尺寸)就可以认为是19路棋盘,这里是为了作介绍。
以上信息的重要部分一般显示在棋盘周围。例如宝典会在棋谱最初、最末的注解里打印:(黑)柯洁 VS 朴廷桓 黑中盘胜。如果要看全部的详细信息,可以找到相关按钮,就会列出全部。
最后,算是正文了,按先后次序记录了棋步序列(以分号;开始每一步,B即Black表示黑子,W即White表示白子)
;B[]表示黑方某步落子,坐标为pd(右上角星位);
;W[]表示白方某步落子,坐标在dd(左上角星位)。
关于这种诸如pd, dd这样的奇怪坐标,反正是程序内部的,棋友不太需要了解。
以上信息是棋步,需要直接显示在棋盘上。
至于棋子上是否显示手数是可在软件里设置的。
对于爱好者来说,有解说、有变化图的棋谱比一张只有棋步序列的棋谱帮助要大些;所以对于棋谱来说,解说、变化图是很重要的。
注解在sgf里是怎样记录的呢?很简单,就是在相应棋步后跟上C[注解的内容],这样的东东(C即comment,注解的意思)。
让我们暂时忽略本文开始那张棋谱的有些繁杂的文件头,只关注棋步序列,把前边的棋谱改为这样:
(;B[pd]C[柯洁第一手就下了必胜的右上角星位;如果他下在×位则白棋有利。]MA[nf]
;W[dd]C[朴廷桓第2手则下在了必败的左上角星位;于是他主动认输了。如果他下在○位则劣势不大。]CR[cc])
上边这一段,就是一张带有注解的棋谱啦。
声明:注解内容随便写的,仅为作介绍。
在宝典里它这样显示:
上图:第1步的解说在第1步显示在棋盘上时,在棋盘下方显示(显示位置由软件决定)。
这里,棋盘上的×是根据此步对应的标记MA[](MA=mark)来显示其位置的;这种标记有助于对解说一目了然(不用在注解里指出坐标)。
上图:第2步的解说在第2步显示在棋盘上时,在棋盘下方显示(显示位置由软件决定)。
这里,棋盘上的○是根据此步对应的标记CR[](CR=circle)来显示其位置的;这种标记有助于对解说一目了然(不用在注解里指出坐标)。
类似的标记还有方块SQ(squre)、三角TR(triangle),甚至还有把文字(包括汉字)直接打印在棋盘上的标记LB(label)。
可以想象一下,一张200步的棋谱,若有30步有注解,一步步按前进按钮,很难找全这些注解;而且你将不得不一直盯着棋盘下的文字区以免错过注解文字,注意力不能集中于棋盘上的棋局进程。
针对这个问题,宝典在屏幕最下方(便于手指够到)设计了《注》和《解》两个按钮,意思很明显:按《解》就表示直接跳到下一个有注解的棋步,按《注》就表示直接蹦到上一个有注解的棋步。当然,有的棋谱没有注解,按它们就直接跑到棋谱尾部或开头了。
顺便提一句:棋盘周围粗现了坐标,这个并非在棋谱里的信息,是由软件自行计算出来。坐标系有好几种,有带英文大写字母I的,有不带的,这个就不在本文展开了。
有注解很好,若有变化图对棋友学棋就更好了。
变化图是怎么形成的呢?
很简单:以最常见的电脑围棋软件猫踢狗制作棋谱为例:
1、录谱人把需要添加变化的棋步(例如第2步)退一步(点一下工具栏里的后退按钮,红圈所标)
2、此时白2消失,录谱人把棋子摆在变化的位置就好(假设变化图从小目开始,就在左上小目落子)。
此时,此谱若在宝典里看,就会在显示第1步时,自动在左上出现A, B两个字母(即白2有2个变化,若须摆更多变化也可),可以点击它们分别进入对应的变化图,进一步学习。
可以想象一下,200步的棋谱,有30步有变化图,如果一步步按前进,很难找全变化图,你可能会错过不少围棋专家为你辛辛苦苦做的变化图。
针对这个问题,宝典在屏幕最下方(便于手指够到的)设计了《变》和《化》两个按钮,意思很明显:按《化》就表示直接跳到下一个有变化图的棋步,按《变》就表示直接蹦到上一个有变化图的棋步。当然,有的棋谱是没有变化图,按它们就直接跑到棋谱尾部或开头了。
希望大家擅用这些按钮,提高学习效率。向大家推荐一个“练习场所”:《棋力提高》的《名人名局》的《吴清源名局细解》里,例如第1局,里边有大量注解和变化图,大家用这些按钮体验一下。
顺便提一句,宝典还可以跳步(设置为5、10、15等步长),在棋盘下的齿轮里即可设置。设置后,《注》和《解》将变成跳步按钮。这个设置适合那些没有注解、变化的棋谱。
在sgf文件里,变化图是这样存储的:
在sgf最外边总的()内,每个变化图就是一对()内的一段内容,同一层级的变化图就是并列的()排在一起;变化图内可能还有变化图,一级级嵌套就是了。
关于sgf格式简介就写到这里。非常钦佩制定sgf标准的人,他对围棋做出的贡献是建设性的,相当于围棋届仓颉。另外,电脑围棋软件猫踢狗的开发者也很厉害,目前是电脑上最常用的棋谱编辑软件。
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点

我要回帖

更多关于 sgf棋谱 的文章

 

随机推荐