?? 數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤.htm
字號:
<!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>數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤</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=數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_files/background.gif>
<DL>
<DIV align=center>
<CENTER>
<DT><FONT size=3>《對弈程序基本技術(shù)》專題</FONT> </CENTER></DT></DIV>
<DT>
<DIV align=center>
<CENTER></DIV>
<DT><FONT face=隸書 size=6>旋轉(zhuǎn)的位棋盤</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> 【編者的點(diǎn)評:這篇文章誤導(dǎo)了我近半年,而事實(shí)證明 </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> 并不算是成功的引擎,現(xiàn)在互聯(lián)網(wǎng)上已經(jīng)找不到它的資料了。我在這里提醒讀者用懷疑的眼光來看本文</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> “位棋盤”可以記錄的最有用的棋盤狀況之一就是“棋盤上哪些格子受到某一特定棋子的攻擊”。幸運(yùn)的是,這樣的計(jì)算耗時不多。對于那些活動能力不強(qiáng)的棋子,這可以說非常容易<FONT
face="Times New Roman">(</FONT>請看上節(jié)“位棋盤”<FONT face="Times New Roman">)
</FONT>。原因是:當(dāng)馬,國王或兵在特定格子上時,無論周圍情況怎樣變化,所攻擊的格子數(shù)目不變。你不用管那些格子上是否有棋子或者周圍是否有特殊情況。
</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="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_files/struct_rotation1.gif" width=192></TD>
<TD align=middle><IMG height=192
src="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_files/struct_rotation2.gif" width=192></TD>
<TD align=middle><IMG height=192
src="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_files/struct_rotation3.gif"
width=192></TD></TR></TBODY></TABLE>
<DL>
<DT> 但是對于車,象和皇后,事情就不那么簡單了。例如,車攻擊橫線方向和豎線方向上的格子,直到在這兩個方向遇到第一個有棋子的格子為止<FONT
face="Times New Roman">(</FONT>包括這個有棋子的格子<FONT
face="Times New Roman">)</FONT>;如果沒有遇到有棋子的格子,則到棋盤邊界為止。也就是說,車所在橫線和豎線上的棋子分布情況不同,受到這個車攻擊的格子的數(shù)量也不一樣。因?yàn)槊織l橫線或豎線都有<FONT
face="Times New Roman">8</FONT>個格子,每個格子又有<FONT
face="Times New Roman">2</FONT>種狀態(tài)(有棋子或者沒有棋子),所以每條橫線或豎線都會有<FONT
face="Times New Roman">2<SUP>8</SUP>(256)</FONT>種棋子分布狀態(tài)。
<DT>
<DT><FONT face=楷體_GB2312 size=4><STRONG>用旋轉(zhuǎn)的位棋盤計(jì)算受車攻擊的格子</STRONG></FONT>
<DT>
<DT> 如何獲得整個棋盤上受到某個車攻擊的格子呢?最簡單的方法是:先計(jì)算出一個位棋盤記錄車所在橫線上受其攻擊的格子,在計(jì)算出另一個位棋盤記錄車所在豎線上受其攻擊的格子,最后用“邏輯或”把這兩個位棋盤“結(jié)合”到一起。
</DT></DL>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD align=middle>
<TABLE border=0>
<TBODY>
<TR>
<TD align=middle><IMG height=192
src="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_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="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_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="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_files/struct_rotation6.gif"
width=192></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<DL>
<DT> 整個操作的關(guān)鍵在于“預(yù)先計(jì)算”。對于<FONT
face="Times New Roman">64</FONT>格中的每一格,都預(yù)先計(jì)算出當(dāng)車在這一格時,不同情況下橫線上受到攻擊的格子<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>。當(dāng)要尋找某一情況下受車攻擊的格子時,用橫線<FONT
face="Times New Roman">(</FONT>或豎線<FONT
face="Times New Roman">)</FONT>上的“棋子分布狀態(tài)”作索引從預(yù)先計(jì)算出來的位棋盤數(shù)組中取得。
<DT> 所以,第一步:預(yù)先計(jì)算出數(shù)組<FONT
face="Times New Roman">rank_attacks[64][256]</FONT>和<FONT
face="Times New Roman">file_attacks[64][256]</FONT>。
<DD>
<DD>/* 車或后橫向移動的預(yù)先計(jì)算 */
<DD>for (棋盤上的每一格)(0-63) {
<DD> for (每行的棋子分布狀態(tài))(0-255) {
<DD> 計(jì)算該狀態(tài)下被占的格子
<DD> 計(jì)算從這個格子朝左走的著法
<DD> 計(jì)算從這個格子朝右走的著法
<DD> rank_attacks[格子][橫線狀態(tài)] = attack_board;
<DD> }
<DD>}
<DD>/* 車或后縱向移動的預(yù)先計(jì)算 */
<DD>for (棋盤上的每一格)(0-63) {
<DD> for (每條縱線的棋子分布狀態(tài))(0-255) {
<DD> 計(jì)算該狀態(tài)下被占的格子
<DD> 計(jì)算從這個格子朝上走的著法
<DD> 計(jì)算從這個格子朝下走的著法
<DD> file_attacks[格子][縱線狀態(tài)] = attack_board;
<DD> }
<DD>}
<DT>
<DT> 第二步:索引<FONT
face="Times New Roman">rank_attacks[64][256]</FONT>,數(shù)組的第一個索引號為車所在格的編號。第二個索引號為車所在行上的“棋子分布狀態(tài)”。
<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="數(shù)據(jù)結(jié)構(gòu)——旋轉(zhuǎn)的位棋盤_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>。第二個索引號是棋盤上第六行的棋子分布狀態(tài)。
<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>,所以這串?dāng)?shù)據(jù)的順序正好和棋盤相反,跟黑方看上去的順序相同。】</FONT>
<DT> 要分離出上面這個數(shù)字,我們需要對位棋盤執(zhí)行一個“位移<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>行的任意格子上則不需要執(zhí)行位移;若在第<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>需要右移的位數(shù)</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>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -