跳转到内容

国际象棋/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 表示法最初很流行,但它现在主要被 位板 系统所取代。

华夏公益教科书