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

📄 数据结构——旋转的位棋盘.htm

📁 象棋程序设计全资料集(介绍编写象棋程序的方法思路)
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0056)http://www.elephantbase.net/computer/struct_rotation.htm -->
<HTML><HEAD><TITLE>数据结构——旋转的位棋盘</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb_2312-80">
<META content="MSHTML 6.00.3790.536" 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> </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>
  <DT>  
  <DT><FONT color=#ff0000>  【编者的点评:这篇文章误导了我近半年,而事实证明 </FONT><FONT 
  face="Times New Roman" color=#ff0000>James Swafford</FONT><FONT color=#ff0000> 
  的 </FONT><FONT face="Times New Roman" color=#ff0000>Galahad</FONT><FONT 
  color=#ff0000> 并不算是成功的引擎,现在互联网上已经找不到它的资料了。我在这里提醒读者用怀疑的眼光来看本文</FONT><FONT 
  face="Times New Roman" color=#ff0000>(</FONT><FONT 
  color=#ff0000>包括我的注解</FONT><FONT face="Times New Roman" 
  color=#ff0000>)</FONT><FONT color=#ff0000>。】</FONT> 
  <DT>  “位棋盘”可以记录的最有用的棋盘状况之一就是“棋盘上哪些格子受到某一特定棋子的攻击”。幸运的是,这样的计算耗时不多。对于那些活动能力不强的棋子,这可以说非常容易<FONT 
  face="Times New Roman">(</FONT>请看上节“位棋盘”<FONT face="Times New Roman">) 
  </FONT>。原因是:当马,国王或兵在特定格子上时,无论周围情况怎样变化,所攻击的格子数目不变。你不用管那些格子上是否有棋子或者周围是否有特殊情况。 
  </DT></DL>
<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=middle>马在<FONT face="Times New Roman">D5</FONT>格可以攻击到的格子</TD>
    <TD align=middle>国王在<FONT face="Times New Roman">D5</FONT>格可以攻击到的格子</TD>
    <TD align=middle>黑棋的兵在<FONT 
face="Times New Roman">D5</FONT>格可以攻击到的格子</TD></TR>
  <TR>
    <TD align=middle><IMG height=192 
      src="数据结构——旋转的位棋盘_files/struct_rotation1.gif" width=192></TD>
    <TD align=middle><IMG height=192 
      src="数据结构——旋转的位棋盘_files/struct_rotation2.gif" width=192></TD>
    <TD align=middle><IMG height=192 
      src="数据结构——旋转的位棋盘_files/struct_rotation3.gif" 
width=192></TD></TR></TBODY></TABLE>
<DL>
  <DT>  但是对于车,象和皇后,事情就不那么简单了。例如,车攻击横线方向和竖线方向上的格子,直到在这两个方向遇到第一个有棋子的格子为止<FONT 
  face="Times New Roman">(</FONT>包括这个有棋子的格子<FONT 
  face="Times New Roman">)</FONT>;如果没有遇到有棋子的格子,则到棋盘边界为止。也就是说,车所在横线和竖线上的棋子分布情况不同,受到这个车攻击的格子的数量也不一样。因为每条横线或竖线都有<FONT 
  face="Times New Roman">8</FONT>个格子,每个格子又有<FONT 
  face="Times New Roman">2</FONT>种状态(有棋子或者没有棋子),所以每条横线或竖线都会有<FONT 
  face="Times New Roman">2<SUP>8</SUP>(256)</FONT>种棋子分布状态。 
  <DT>  
  <DT><FONT face=楷体_GB2312 size=4><STRONG>用旋转的位棋盘计算受车攻击的格子</STRONG></FONT> 
  <DT>  
  <DT>  如何获得整个棋盘上受到某个车攻击的格子呢?最简单的方法是:先计算出一个位棋盘记录车所在横线上受其攻击的格子,在计算出另一个位棋盘记录车所在竖线上受其攻击的格子,最后用“逻辑或”把这两个位棋盘“结合”到一起。 
  </DT></DL>
<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=middle>
      <TABLE border=0>
        <TBODY>
        <TR>
          <TD align=middle><IMG height=192 
            src="数据结构——旋转的位棋盘_files/struct_rotation4.gif" width=192></TD>
          <TD align=middle><FONT 
            face="Times New Roman"><STRONG>OR</STRONG></FONT></TD>
          <TD align=middle><IMG height=192 
            src="数据结构——旋转的位棋盘_files/struct_rotation5.gif" width=192></TD>
          <TD align=middle><FONT 
            face="Times New Roman"><STRONG>=</STRONG></FONT></TD>
          <TD align=middle><IMG height=192 
            src="数据结构——旋转的位棋盘_files/struct_rotation6.gif" 
        width=192></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<DL>
  <DT>  整个操作的关键在于“预先计算”。对于<FONT 
  face="Times New Roman">64</FONT>格中的每一格,都预先计算出当车在这一格时,不同情况下横线上受到攻击的格子<FONT 
  face="Times New Roman">(</FONT>共<FONT 
  face="Times New Roman">256</FONT>种情况<FONT 
  face="Times New Roman">)</FONT>和不同情况下竖线上受到攻击的格子<FONT 
  face="Times New Roman">(</FONT>也是<FONT face="Times New Roman">256</FONT>种<FONT 
  face="Times New Roman">)</FONT>。当要寻找某一情况下受车攻击的格子时,用横线<FONT 
  face="Times New Roman">(</FONT>或竖线<FONT 
  face="Times New Roman">)</FONT>上的“棋子分布状态”作索引从预先计算出来的位棋盘数组中取得。 
  <DT>  所以,第一步:预先计算出数组<FONT 
  face="Times New Roman">rank_attacks[64][256]</FONT>和<FONT 
  face="Times New Roman">file_attacks[64][256]</FONT>。 
  <DD>  
  <DD>/* 车或后横向移动的预先计算 */ 
  <DD>for (棋盘上的每一格)(0-63) { 
  <DD> for (每行的棋子分布状态)(0-255) { 
  <DD>  计算该状态下被占的格子 
  <DD>  计算从这个格子朝左走的着法 
  <DD>  计算从这个格子朝右走的着法 
  <DD>  rank_attacks[格子][横线状态] = attack_board; 
  <DD> } 
  <DD>} 
  <DD>/* 车或后纵向移动的预先计算 */ 
  <DD>for (棋盘上的每一格)(0-63) { 
  <DD> for (每条纵线的棋子分布状态)(0-255) { 
  <DD>  计算该状态下被占的格子 
  <DD>  计算从这个格子朝上走的着法 
  <DD>  计算从这个格子朝下走的着法 
  <DD>  file_attacks[格子][纵线状态] = attack_board; 
  <DD> } 
  <DD>} 
  <DT>  
  <DT>  第二步:索引<FONT 
  face="Times New Roman">rank_attacks[64][256]</FONT>,数组的第一个索引号为车所在格的编号。第二个索引号为车所在行上的“棋子分布状态”。 

  <DT>  请看下面这个例子: </DT></DL>
<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=middle>车在<FONT face="Times New Roman">E6</FONT>格可以攻击到的格子</TD></TR>
  <TR>
    <TD align=middle><IMG height=256 
      src="数据结构——旋转的位棋盘_files/struct_rotation7.gif" 
width=256></TD></TR></TBODY></TABLE>
<DL>
  <DT>  第一个索引号是<FONT face="Times New Roman">E6</FONT>格的编号。在我的程序里,它的编号是<FONT 
  face="Times New Roman">20</FONT>。第二个索引号是棋盘上第六行的棋子分布状态。 
  <DD><FONT face="Times New Roman">0 1 0 1 0 0 1 0</FONT> 
  <DT>  <FONT color=#0000ff>【编者注:在</FONT><FONT face="Times New Roman" 
  color=#0000ff>James Swafford</FONT><FONT color=#0000ff>的程序里,由于</FONT><FONT 
  face="Times New Roman" color=#0000ff>A8</FONT><FONT 
  color=#0000ff>格编号为</FONT><FONT face="Times New Roman" 
  color=#0000ff>0</FONT><FONT 
  color=#0000ff>,所以这串数据的顺序正好和棋盘相反,跟黑方看上去的顺序相同。】</FONT> 
  <DT>  要分离出上面这个数字,我们需要对位棋盘执行一个“位移<FONT 
  face="Times New Roman">(shift)</FONT>”和一个“逻辑与”指令。在我的程序中,<FONT 
  face="Times New Roman">A8</FONT>格的编号为<FONT 
  face="Times New Roman">0</FONT>。如果车在第<FONT 
  face="Times New Roman">8</FONT>行的任意格子上则不需要执行位移;若在第<FONT 
  face="Times New Roman">7</FONT>行则要右移<FONT 
  face="Times New Roman">8</FONT>位;在第<FONT 
  face="Times New Roman">6</FONT>行要右移<FONT 
  face="Times New Roman">16</FONT>位;以此类推。 </DT></DL>
<TABLE width="100%" border=0>
  <TBODY>
  <TR>
    <TD align=middle>需要右移的位数</TD></TR>
  <TR>
    <TD align=middle>
      <TABLE border=1>
        <TBODY>
        <TR>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>0</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>0</STRONG></FONT></TD></TR>
        <TR>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>8</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>8</STRONG></FONT></TD></TR>
        <TR>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#ffffff><FONT 
            face="Times New Roman"><STRONG>16</STRONG></FONT></TD>
          <TD align=middle bgColor=#000000><FONT face="Times New Roman" 
            color=#ffffff><STRONG>16</STRONG></FONT></TD></TR>
        <TR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -