• 沒有找到結果。

資料結構實作

4 3 ◎ 1 0 9 8 7 6 5 14 13 12 11 10 19 18 17 16 15 24 23 22 21 20 圖 12 實際盤面呈現狀況

由於使用 32 位元表示,在編譯器裡編輯程式時,必須使用十六進位表示法 才容易觀察變數內容。舉例來說,若角行位於圖 12 中 2 號位置,原本應該表 示為 0000 0000 0000 0000 0000 0000 0000 0100,但切換至十六進位後,則以 0x00000004 作記錄。

取得 BitBoard 表示法後,本論文將透過無負號的 32 位元整數(unsigned integer),來儲存每一種兵種在棋盤上的狀況。將雙方在盤面上的王將(玉將)、

飛車、角行、金將、銀將和步兵以及在盤面下被雙方吃入的子對應到代表的數 字。倘若我們要了解其中一方棋子例如我方或者敵方在盤面當中所佔的位置 (red / black / occupied),只要將其目標作 or 運算即可。

4.2 王將、金將、銀將、步兵走步生成

針對一般的兵種來說,走步的生成相當的固定,如圖 13 由每個兵種相對應的遮罩 針對位元一個一個生成。

範例 金 13 的遮罩 走步 1 生成 金 13 的遮罩 走步 2 生成

金 13 的遮罩 走步 3 生成 金 13 的遮罩 走步 4 生成

圖 13 金走步生成步驟示意

針對我方棋子執行以下的動作:

(1).從所有我方的棋子當中,依照王將→龍王→龍馬→飛車→角行→金將→銀將

→步兵的順序找出可移動的第一顆子。

(2).針對該棋子在資料庫當中找出其相對應兵種在該位置能行走到的位置,可能 是吃子或是走子,我們給予這些位置一個數值,也就是一個對應的走步遮罩,針對 吃子和對方的棋子做 AND 運算,若是走子則是針對棋盤上的空格做運算。

遮罩當中取消掉。

(4).重複動作(3)直到該棋子可被生成的走步皆完成了,便將這顆可以移動的棋 子從我方的遮罩當中消除,回到動作(2),找下一顆可以移動的棋子。直到所有棋 子皆生成對應的走步,該棋子為止,也就是重複的格子都已經被取出了的意思。

雖然走步生成是每一次呼叫搜尋必會發生一次的函數,但是透過這樣的方式可 以非常快速的使用 bitboard 來生成走步,在這中間的運算使用的也只有 AND / OR / XOR 運算而已,實際上不需要耗費太多時間。

4.3 飛車、角行、龍王、龍馬走步生成

針對飛車與角行,這兩個特別的兵種我們要生成走步的時候就會相對耗時 間。由於飛車的走步是十字方向皆可以走,而角行則可以往斜方向任意移動。

在這個部分我們試著切割棋盤,以達到生成走步的效果。

遮罩範例 單行遮罩 單列遮罩 部分遮罩(1) 部分遮罩(2)

飛車 上 下 左 右

角行 右上 左上 右下 左下

圖 14 飛車與角行走步生成示意

左上、右下、左下,再針對各個方向取最高或者最低位元取得可到達的點,並生成一

static U32 車 GenWalkable(intsrc, U32 empty){

a1=使用行看可行步;(上、下) a2=使用列看可行步;(左、右)

return a1|a2;

}

static U32 角 GenWalkable(intsrc, U32 empty){

a1=往右上看可行步;

a2=往右下看可行步;

a3=往左上看可行步;

a4=往左下看可行步;

return a1|a2|a3|a4;

}

表 7 車、角走步產生程式碼

4.4 Bitboard 與棋盤之間的轉換

使用 Bitboard 的時候常常需要在棋盤編號和 32 位元的 unsigned integer 做變換,

若將 Bitboard 的值直接轉換為整數這就不是我們所想要的,所以我們必須透過轉換 來做 perfect hash 使得 0 ~ 31 位置所對應的 bitboard 數值都可以在對應後獲得相對 應的數字。

舉例來說:

表 8 中的 Index 指的是盤面上所代表的數字,我們透過乘法和位移的方式取得一個 perfect hash 的資料,藉此能夠快速的在 bitboard 和一般的棋盤上面做轉換。

index32[32]={31, 0, 1, 5, 2, 16, 27, 6, 3, 14, 17, 19, 28, 11, 7, 21, 30, 4, 15, 26, 13, 18, 10, 20, 29, 25, 12, 9, 24, 8, 23, 22}

Int BitHash(U32 x){

Return (x* 0x08ED2BE6)>>27 }

Int GetIndex(U32 mask){

Return index32[Bithash(mask)];

}

表 8 Bitboard 與棋盤之間的轉換程式碼

相關文件