作者DreamYeh (天使)
看板FCK-GARDEN
标题POS格式转换
时间Wed Mar 26 12:04:38 2008
----------------------------
POS格式是最直接的记谱方式,也是黑石和Renlib使用的格式
,但在网路都找不到其格式内容。
如果不知道其记载格式,当然无法达成记谱转换功能,在PTT
上看到好谱,想要记在自己电脑,或想用黑石帮忙分析也没办法
,只能自己慢慢键入。这是很费人工的事情。
那我们要怎麽知道他的记载格式是怎麽样呢?很简单!去解
码就好了!解这个码花不到我们五分钟时间,让我们一探究竟。
首先我们开启Renlib,然後打一谱瑞星变化到第十一手。我
会选瑞星变化是因为它为大家所熟析,且定式固定。现在让我们
将他存成*.pos档,然後用Utral Edit32等软体去开启它。
我们很快将之转换为16进位码一探究竟,可以清楚看到这些
代码:
0B70618E538F62606F458071
依照目前棋盘上情况,我们可以得到他的每个数值都代表一
个座标转换:
0B //What's your steps
70 //it's H8
61 //it's H9
8E //it's H6
53 //it's I10
8F //it's I6
62 //it's I9
----------------------------
要解析他们是怎麽转换的,事实上比解一个数学问题还要容
易。
我们取出两组数字观察:观察8E以及8F,他们在棋盘座标上
差一个水平位移。而在 POS上,两个数值差 1,我们可以大胆假
设:
POS数值相对应棋盘水平座标的关系为+1/每格
再从70以及61,他分别棋子第一步跟第二步,这两个在棋盘
上只差一个垂直位移,而在POS数值上差了(0x61-0x70)=-15 ,
我们可以大胆假设:
POS数值相对应棋盘水平座标的关系为-15/每格
15是个有趣的数字,他代表着五子棋盘的棋盘格数。
现在我们可以假设POS Value = -15y+x + Shift
其中x,y分别代表现在某子的棋盘座标。
为什麽还要有一个 Shift呢?因为我们不希望POS结果是
一个负数嘛!其实如果你数位概念够清楚,你也可以发现,
甚至也不需要这个Shift,因为那只是一个2的补数计算而已
。
但我们为了更普及化的概念,先假设有这个Shift好了。
现在我们计算第一个点的座标,是H8 即x=8 x=8
Shift -15*8 + 8 = 0x70 -> Shift=224
是的,我们已经得知Shift为224。对数字敏感的人很快
可以发现他等於225-1,225是什麽?就是15^2嘛!也就是棋
盘上所有点的数量。熟知数位的人马上可以知道这不是乱定
,而是一个电脑换算的补数概念。
好,现在我们得到公式了:
POS数值=224-15y+x
现在让我们小心求证!我们同样计算前面几个点!
ok...H9 is 224-15*9+8 = 97 = 0x61 -> 正确
H6 is 224-15*6+8 =142 = 0x8E -> 正确
I10 is 224-15*10+9= 83 = 0x53 -> 正确
I6 is 224-15*6+9 =143 = 0x8F -> 正确
I9 is 224-15*9+9 = 98 = 0x62 -> 正确
後面几个点,就靠大家验算了。我们已经得知该数值转换
的计算公式!
现在,让我们将之变成程式:假设
Step代表每一步的座标。如Step[0]=H8 Step[1]=H9....
char Buf[225];
Buf[0] = Length (Step);
for(index++)
{
int x = Step[inde][0]-64; //A->1 B->2 C->3...
int y = Step[index][1]*10+Step[index][2];
Buf[inde+1] = 224-15y+x ;
}
完毕,轻易做到BBS格式和POS格式转换。
--
— 请多指教喔!!
/\●/\ ))
(( / /▲\ \
\\
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.73.246.60
1F:推 ythsu1106:推 220.139.141.31 03/26 12:34
2F:推 ccy1209:超过五分钟了~~~XD 140.124.44.151 03/26 15:09
3F:推 minolala:推 ;) . 218.168.176.30 03/26 22:14
4F:推 fatbird:快推 免得人家以为我看不懂.. 211.21.245.131 03/27 10:24
5F:推 musicring:为什麽你这麽强140.117.160.148 03/27 22:35