POS格式轉換
----------------------------
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
推
03/26 12:34, , 1F
03/26 12:34, 1F
推
03/26 15:09, , 2F
03/26 15:09, 2F
推
03/26 22:14, , 3F
03/26 22:14, 3F
推
03/27 10:24, , 4F
03/27 10:24, 4F
推
03/27 22:35, , 5F
03/27 22:35, 5F