2016-07-30 44 views
0

好的我已經閱讀了很多網絡上的東西,其中大部分使用沒有unsigned int的Java。我正在研究具有unsigned int的Objective-C。建立一個使用魔術棋盤的國際象棋...我怎麼知道運動是否有效

讓我們考慮以下情況。

板是這樣的:

enter image description here

A1是在左下角和是最顯著位和H8是在右上角,是最顯著位。

我已經構建了棋盤上所有位置的所有棋子的位移掩碼。

假設下面的簡單情況:

  1. 遊戲將開始。所有作品都在他們的初始位置。
  2. 用戶嘗試將G1上的騎士移動到E2

顯然這個動作是不可能的,因爲在E2上有一個棋子。

如何發現運動是否有效?

好吧我所有作品的位掩碼是這樣的:

1111111111111111000000000000000000000000000000001111111111111111

和我對騎士的可能運動在G1位掩碼是

00000000 
00000000 
00000000 
00000000 
00000000 
00000X0X 
0000X000 
00000000 

或位

0000000000001000000001010000000000000000000000000000000000000000

如果我AND這兩個

1111111111111111000000000000000000000000000000001111111111111111 0000000000001000000001010000000000000000000000000000000000000000

我得到

0000000000001000000000000000000000000000000000000000000000000000

我所知道的是,有一塊在這一點,但我沒有看到這是如何告訴我如果這是一個有效的舉動或沒有。

另一個問題是:假設這個舉動會讓我的國王受到攻擊。很顯然,這一舉措在技術上是可行的,但在騎士的移動規則下是不可能的,因爲我不能採取讓我的國王受到攻擊的舉動。

如何獲取這些信息?謝謝

+0

你只會得到僞有效的移動,這意味着它可能在那裏移動。無論結果的位置是否有效,都必須單獨檢查。要麼通過驗證所得位置的國王狀態,要麼通過等待對手奪取你的國王並將減號CheckMate分配給那個。 –

+0

注意:[同樣的問題](http://chess.stackexchange.com/questions/15043/building-a-chess-using-magic-bitboard-how-do-i-know-if-the-movement-is -valid)在chess.se上。 – Myridium

回答

0

如果你只有一個位圖所有塊然後你根本沒有任何方式知道你是否試圖將騎士移動到對手的一塊或你自己的。你將不得不使用單獨的白色塊和黑色塊。

在考慮其他棋子的位置之前,您已經擁有騎士所有可能棋步的位掩碼K。只需按位AND與白色棋子的NOT不同:M = K && !W

現在據我所知,騎士移動危害其國王的唯一方法是如果騎士先前阻止對手的攻擊。具體來說,只有當它阻止了一名白嘴鴉或一名主教的攻擊。這隻有當騎士位於國王位置的八個主要方向之一時纔有可能。因此,請檢查一下,看看在八大基本方向之一中是否存在從國王到騎士的直線暢通的路線。如果沒有,那麼這個舉動不可能危及國王,所以你不需要再做任何檢查。如果有的話,然後循環穿過M的位置來檢查國王是否會在他們每個人後面受到威脅。

在騎士的特殊情況下,因爲它是以L形行進的,所以它不可能從阻止這種攻擊的位置移動到阻止它的另一個位置。因此,在騎士的特殊情況下,您應該執行以下操作:

  1. 檢查是否存在從國王到騎士的不間斷直線。如果沒有,請執行4.
  2. 檢查沿着這條線路是否有對手的白嘴鴉或主教,他們唯一阻礙拿國王的就是你想要移動的騎士。如果不是,則轉到4.
  3. 如果你已經達到了這一點,那麼移動騎士將導致檢查。它不能移動。設置M = 0並繼續執行該程序。
  4. 設置M = K && !W並繼續該程序。

我應該注意到,這是假設國王沒有開始檢查而寫的。必要時進行調整。

+0

完美!!!!!!!!!!! – SpaceDog