📄 数据结构——位棋盘.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://www.elephantbase.net/computer/struct_bitboard.htm -->
<HTML><HEAD><TITLE>数据结构——位棋盘</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.3790.2759" name=GENERATOR></HEAD>
<BODY background=数据结构——位棋盘_files/background.gif>
<DL>
<DIV align=center>
<CENTER>
<DT><FONT size=3>《对弈程序基本技术》专题</FONT> </CENTER></DT></DIV>
<DT>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face=隶书 size=6>位棋盘</FONT><FONT face=Arial
size=6><STRONG>(BitBoard)</STRONG></FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT>作者:<FONT face="Times New Roman">James Swafford (</FONT><A
href="mailto:james_swafford@hotmail.com"><FONT
face="Times New Roman">james_swafford@hotmail.com</FONT></A><FONT
face="Times New Roman">)</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT> </CENTER>
<DIV></DIV>
<DT> 本文将试图回答下面这些有关位棋盘的问题:
<DT>
<DD>什么是位棋盘?
<DD>位棋盘派什么用?
<DD>对位棋盘的基本操作
<DD>如何初始化位棋盘?
<DD>如何更新位棋盘?
<DT>
<DT><FONT face=楷体_GB2312 size=4><STRONG>什么是位棋盘?</STRONG></FONT>
<DT>
<DT> 位棋盘其实就是一个<FONT
face="Times New Roman">64</FONT>位长度的变量,用来记录国际象棋棋盘上的某些布尔值。因为棋盘上有<FONT
face="Times New Roman">64</FONT>格,所以<FONT
face="Times New Roman">64</FONT>位正好对应它的<FONT
face="Times New Roman">64</FONT>格。对于面向过程的编程语言例如<FONT
face="Times New Roman">C</FONT>,你可以象下面这样来定义这个变量类型:
<DT>
<DD>typedef unsigned __int64 BitBoard;
<DT>
<DT> 对于某些别的<FONT face="Times New Roman">C</FONT>编译器,你可能需要使用例如“<FONT
face="Times New Roman">unsigned long long</FONT>”来定义它。
<DT>
<DT><FONT face=楷体_GB2312 size=4><STRONG>位棋盘派什么用?</STRONG></FONT>
<DT>
<DT> 位棋盘的全部作用就是记录国际象棋棋盘上的某些布尔条件。你可能会问:
<DT>
<DD>那是什么类型的“条件”?
<DD>位棋盘是如何“描绘”这种“条件”的?
<DT>
<DT> 一旦你理解这些问题的答案,你就已经开了一个好头。
<DT> 首先,那是什么类型的条件?嗯,就象上面提到的,就是布尔条件。换句话说,布尔条件就是“哪些格子上面符合 <FONT
face="Times New Roman">_____ (</FONT>由你来填空<FONT
face="Times New Roman">)</FONT>的条件。”例如:
<DT>
<DD>“哪些格子上面有棋子?”
<DD>“哪些格子上面有白棋棋子?”
<DD>“哪些格子上面有车?”
<DD>“哪些格子上面有象或皇后”
<DD>“哪些格子受到<FONT face="Times New Roman">F7</FONT>格上的棋子的攻击?”<FONT
face="Times New Roman">(</FONT>不用管格子上是否有棋子或是什么颜色的棋子,译者注。<FONT
face="Times New Roman">)</FONT>
<DD>“如果有马在<FONT face="Times New Roman">F3</FONT>格上,哪些格子会受到它的攻击?”
<DD>
<DT> 你还可以列出许多许多这样的条件……
<DT> 然后,位棋盘如何来“描绘”这种“条件”?就象上面说过的,“位棋盘”就是一个<FONT
face="Times New Roman">64</FONT>位的字。国际象棋棋盘上有<FONT
face="Times New Roman">64</FONT>格。这意味着棋盘上的每一格在位棋盘里都有对应的一位。
<DT> 现在是关键部分——如果位棋盘中对应某一格的“位”是“<FONT
face="Times New Roman">1</FONT>”,那么这一格上的条件就是“真”;如果是“<FONT
face="Times New Roman">0</FONT>”,对应格上的条件就是假。我知道这句话可能让你困惑,让我说得更具体一些。
<DT> 假如我们需要一个记录所有棋子位置的位棋盘“<FONT
face="Times New Roman">AllPieces</FONT>”。“<FONT
face="Times New Roman">AllPieces</FONT>”告诉我们棋盘上哪些格子有棋子,哪些没有。当棋子处于最初位置的时候,“<FONT
face="Times New Roman">AllPieces</FONT>”看上去是这个样子的:
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111 11111111 00000000 00000000 00000000
00000000 11111111 11111111</FONT> </CENTER>
<DIV></DIV>
<DT> 其最高位对应第<FONT face="Times New Roman">63</FONT>格<FONT
face="Times New Roman">(H1</FONT>格<FONT
face="Times New Roman">)</FONT>,最低位对应第<FONT
face="Times New Roman">0</FONT>格<FONT face="Times New Roman">(A8</FONT>格<FONT
face="Times New Roman">)</FONT>。
<DT> 这样显示位棋盘可能更形象一点:
<DIV align=center>
<CENTER></DIV>
<DT>白棋 </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT>黑棋 </CENTER>
<DIV></DIV>
<DT> 那么记录白棋棋子初始位置的位棋盘“<FONT
face="Times New Roman">WhitePieces</FONT>”是什么样子的呢?
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">11111111</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DT> 记录<FONT face="Times New Roman">(</FONT>包括黑棋和白棋的<FONT
face="Times New Roman">)</FONT>皇后和车的初始位置的位棋盘“<FONT
face="Times New Roman">RookQueens</FONT>”是什么样子的呢?
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">10001001</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">10001001</FONT> </CENTER>
<DIV></DIV>
<DT> 好了,在读后续内容之前你必须确定已经理解了上面所讲的东西。假如我们创建了一个位棋盘数组“<FONT
face="Times New Roman">knight[64]</FONT>”,那么“<FONT
face="Times New Roman">knight[0]</FONT>”位棋盘就记录了当马在<FONT
face="Times New Roman">0</FONT>格<FONT face="Times New Roman">(</FONT>即<FONT
face="Times New Roman">A8</FONT>格<FONT
face="Times New Roman">)</FONT>时,棋盘上所有受到它攻击的格子;“<FONT
face="Times New Roman">knight[63]</FONT>”记录了当马在<FONT
face="Times New Roman">63</FONT>格<FONT face="Times New Roman">(H1</FONT>格<FONT
face="Times New Roman">)</FONT>时,棋盘上所有受到它攻击的格子。
<DT> “<FONT face="Times New Roman">knight[0]</FONT>”是这个样子的:
<DIV align=center>
<CENTER></DIV>
<DT>白棋 </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000010</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000100</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT>黑棋 </CENTER>
<DIV></DIV>
<DT> 正如你所看到的,当马在<FONT face="Times New Roman">A8</FONT>格时它仅攻击两个格子:<FONT
face="Times New Roman">10</FONT>格<FONT face="Times New Roman">(C7</FONT>格<FONT
face="Times New Roman">) </FONT>和<FONT face="Times New Roman">17</FONT>格<FONT
face="Times New Roman">(B6</FONT>格<FONT
face="Times New Roman">)</FONT>。现在明白了吗?
<DT> 你可能会发现建立全局数组 <FONT face="Times New Roman">"BitBoard mask[64]"
</FONT>会很有用,<FONT face="Times New Roman">mask[0]</FONT>是这样的:
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000000</FONT> </CENTER>
<DIV></DIV>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">00000001</FONT> </CENTER>
<DIV></DIV>
<DT> <FONT face="Times New Roman">mask[63] </FONT>是这样的:
<DIV align=center>
<CENTER></DIV>
<DT><FONT face="Times New Roman">10000000</FONT> </CENTER>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -