2011-06-24 45 views
3

我在玩棋盤代表棋盤並檢查合法移動。我堅持的是計算滑動片攻擊中源和目標方格​​之間的佔用率。 我不想通過查找來做到這一點,所以我想弄清楚是否有可能在沒有查找的之間的方塊上得到一個蒙版。例如,在下面的板子上有C4一個魯克:獲取位面板的佔用位掩模


8 0 0 0 0 0 0 0 0 
7 0 0 0 0 0 0 0 0 
6 0 0 0 0 0 0 0 0 
5 0 0 0 0 0 0 0 0 
4 0 0 R 0 0 0 0 0 
3 0 0 0 0 0 0 0 0 
2 0 0 0 0 0 0 0 0 
1 0 0 0 0 0 0 0 0 
    a b c d e f g h 

給出一個棋盤,代表空方(或佔用廣場,無論是更容易)和僞有效舉措Rf4表示(魯克可以從C4移動到f4),如何爲方塊d4-e4(不包括源和目的方塊)獲取遮罩?

我認爲,一旦這是清楚的比豎直移動將是容易的,並且可以通過使用旋轉的棋盤來計算對角移動。

編輯:位板用ulong/unsigned int64表示,每個8位數據包代表實際電路板的等級/行。

+1

如果你無論如何要對位棋盤,不要浪費時間重複產生它們。只有1953種方法可以在棋盤上選擇兩根繩子。你可以輕鬆地將它們存儲在一個數組中。 –

回答

3

我打算在這裏做一些假設:電路板存儲爲64位數字,每個8字節塊代表一行。行中的每一位代表一列(a..h)。你有起始和結束位置作爲基於零的座標。即:start = "C4" = [2,3]; end = "F4" = [5,3]

對於隨列水平移動,可以計算出移動距離:d = (F4-C4 = 3)。減1以排除目的地,則d-1位的「蹤跡」t是t = (1<<(d-1))-1。移動源塊附近的路徑以獲取掩碼M:M = t<<(start.row*8 + start.column+1)

這相當於 M = ((1<<d)-2)<<(start.row*8 + start.column)

對於水平移動的其他方式:

d = (C4-F4 = -3) 
t = (1<<(-d-1))-1 
M = (t<<dest.column+1) 
//-or- 
M = ((1<<-d)-2)<<(dest.row*8 + dest.column) 

對於垂直增加移動:

d = (C7-C4 = 3) 
t=(1<<8) 
(d-1) times: { t |= (t<<8)} 
M = t << (start.row*8 + start.column) 

對於垂直遞減移動:

d = (C4-C7 = 3) 
t=(1<<8) 
(d-1) times: { t |= (t<<8)} 
M = t << (dest.row*8 + start.column) 

對於垂直移動,可以通過存儲最大「垂直軌跡」VT = 0x0101010101010101 = 72340172838076673替換d上的循環。然後掩蓋實際移動的正確位數。

這會減少暗示爲M = (VT & ((1<<(d*8)) - 2)) << (row*8+column)

您可能可以爲對角線移動做類似的事情。從最大對角線路徑DT = 0x0102040810204080開始,應用一個掩碼將其減少到d設置位,並根據哪個更接近邊沿切換到開始或結束位置。這需要仔細測試以確保沒有邊緣情況纏繞在錯誤的行中。

編輯以排除源和目標,並修復一次性錯誤

+0

謝謝你的回答!我今晚會嘗試一下,併發布結果。 – kateroh

+0

一個問題:爲什麼這樣做?這隻適用於人類玩家的動作嗎?對於AI移動來說,先計算非阻塞移動似乎更容易,然後選擇最佳移動,而不是從所有可能移動中移出,然後測試它是否被阻止。 – AShelly

+0

我正在做它的驗證遊戲中寫入的動作。在某些符號中,您必須找出移動到目的地的棋子的源平方。例如,在某些符號中,你可能只需要Rf4就可以從c4移動到f4。如果你有一個以上的車,你將不得不使用驗證來找出哪一個可以移動到f4。無論如何,通過對你的公式進行一些微小的調整,我得到了正確的掩碼爲2之間的廣場。將很快進行基準測試併發布結果。謝謝! – kateroh

1

在進行一些前期計算和爲片段移動生成所有可能的掩膜(一定的可能性)之前,我期望在運行時構建掩膜最有可能像時間一樣昂貴'查找每個方塊'的方法。

+0

這就是爲什麼問題是如果有可能在給定兩個方塊的情況下在飛行中計算面罩並且讓我們說一個方向(東/西) – kateroh

+0

這絕對是可能的 - 但最有可能不會比替代的,更簡單的方法便宜。 –

+0

預先計算所有可能性肯定更便宜。 –

0

獲取方向(DX,DY)/ DX

在這種情況下,該單位向量(1,0)

然後遞增當前位置與矢量反覆,直到你到達目的地。正在增加/分配相應的矩陣單元。

+0

似乎它不會比從EmptySquares位板上逐位查找更好。 – kateroh