跳轉到內容

國際象棋/0x88

來自華夏公益教科書,開放的書籍,開放的世界

0x88 國際象棋棋盤表示法是一種以方格為中心的表示方法,用於表示一些 國際象棋程式 中的 國際象棋棋盤。數字 0x88(13610,2108,100010002)是 C 語法 中的十六進位制整數。行列位置分別由一個半位元組(十六進位制數字)表示,位間隙簡化了將許多計算轉換為 位運算

在 0x88 棋盤表示法中,佈局被擴充套件到覆蓋一個 8x16 的棋盤,相當於兩個相鄰的國際象棋棋盤的大小。8x16 矩陣中的每個方格都分配一個數字,如棋盤佈局表所示。在這個方案中,每個半位元組代表一個行列,因此 8 位整數 0x42 代表 (4,2) 處的方格 - c4。

對於一個方格,將其數字加 16 會得到上方方格的數字,減 16 會得到下方方格的數字。要從一列移動到另一列,數字增加或減少 1。在十六進位制表示法中,合法的國際象棋位置(A1-H8)始終低於 0x88。這種佈局簡化了國際象棋程式需要執行的許多計算,因為它允許使用位運算而不是比較。

0x88 棋盤佈局
0x00 (A) 0x01 (B) 0x02 (C) 0x03 (D) 0x04 (E) 0x05 (F) 0x06 (G) 0x07 (H) 0x08 0x09 0x0A 0x0B 0x0C 0x0D 0x0E 0x0F
0x07 (8) 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F
0x06 (7) 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F
0x05 (6) 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F
0x04 (5) 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
0x03 (4) 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
0x02 (3) 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F
0x01 (2) 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
0x00 (1) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

代數記譜和轉換

[編輯 | 編輯原始碼]
帶有代數記譜的國際象棋棋盤上的方格

國際象棋棋盤上的每個方格都由一個唯一的座標對標識 - 一個字母(ah)代表列,一個數字(1 到 8)代表行。這種指代方格的方法是 代數記譜 的一部分。要將座標對轉換為 0x88 值,列被視為整數,其中 a 對應於 0,h 對應於 7。

因此,a1 對應於 ,所有 8 位都設定為 b2 對應於 h8 對應於 .

要將 0x88 值轉換為行列座標對

棋盤外檢測

[編輯 | 編輯原始碼]

棋盤外檢測 是國際象棋程式的一項功能,它確定棋子是否在合法棋盤上或棋盤外。在 0x88 中,每個半位元組的最高位表示棋子是否在棋盤上。具體來說,在表示方格的 8 位中,第四位和第八位必須都為 0,棋子才能位於棋盤內。這允許透過位 運算進行棋盤外檢測。如果 $square AND 0x88(或,在二進位制中,0b10001000)非零,則方格不在棋盤上。這種位運算比整數比較需要更少的計算機資源。這使得非法移動檢測等計算更快。

方格關係

[編輯 | 編輯原始碼]

有效 0x88 座標 A 和 B 的差值在距離和方向方面是唯一的,這對於經典的打包三位行列座標來說是不成立的。這使得 曼哈頓距離、可能的棋子攻擊和合法棋子移動的查詢更節省資源。雖然 0..63 範圍內的經典方格座標需要 4K(64*64)大小的表,但 0x88 差值需要 1/16 或 256 大小的表 - 甚至更少 16 個。

新增一個 119(0x77 作為最大有效方格索引)的偏移量,以使 +-119 成為 0..238 範圍(出於對齊原因,大小為 240)。

0x88Diff = 0x77 + A - B

雖然 0x88 表示法最初很流行,但它現在主要被 位板 系統所取代。

華夏公益教科書