⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 数据结构——位棋盘.htm

📁 象棋程序设计全资料集(介绍编写象棋程序的方法思路)
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<!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 + -