2012-07-20 163 views
2

我想用wxPython中的一個GUI製作一個2球國際象棋程序,它能夠驗證移動並遵循每一個國際象棋規則。0x88國際象棋棋盤代表

現在,我在我的設計開始,並找出我應該使用哪種電路板表示技術。我最近想到了這個明顯的二維數組,但後來我讀了關於0x88 board representation的那個,據推測在查找方面速度更快,並在邏輯上檢查方塊是否在棋盤內。但是,如果我在沒有人工智能的情況下製作程序,則無需檢查是否有人移動了棋盤以外的棋子。

0x88表示是否還有其他優勢,我不知道以及您會推薦哪種方法,即8x8方法或0x88。另外,如果我首先使用8x8表示,然後稍後可能很容易,如果我決定添加AI,請使用0x88表示? 非常感謝您的想法。

+1

今天你不會看到與消費電腦有很大的性能差異。我的*手機*具有足夠的處理能力來下棋 - 並一直打敗我。 – 2012-07-20 17:37:05

回答

1

我同意你的觀點,如果你不是在做AI,那麼微觀優化就沒有太多的理由。

我會提出的一個建議是,如果您正在考慮從8x8切換到0x88(並且通常爲了獲得良好的代碼質量),您應該儘可能多地將函數中的板訪問邏輯抽象出來。例如,編寫並使用

getPieceAtLocation(char file, int rank) 

,並呼籲

Piece p = getPieceAtLocation('e', 2); 

或類似的規定。這樣,如果你決定改變主意,你只需要重寫getPieceAtLocation中的邏輯,而不是改變每個你必須使用它的地方。

1

我不相信你決定使用AI應該對你的董事會代表是否包括檢查廣場是否在Chessboa RD。也就是說,不管它是一臺計算機還是一個正在進行移動的玩家,對於您的底層表示來說,能夠檢測並優雅地處理涉及無效方塊的移動是有利的。個人而言,我相信位板方法 - 我發現這種方法既快速(因爲它依賴於按位操作),而且符合現代64位體系結構的邏輯。最重要的是,無論你決定是否做AI,都不需要重新設計你的代表,所以它也更具前瞻性。

與0x88相比,它更具有內存友好性,每一塊代表一個單一的位,並且它更加友好,板上的部件更少。雖然記憶可能不是現代計算機最關心的問題,但它也是一種沒有真正缺點的特點。

使用位板,一個按位操作可以計算出多個棋子的移動有效性,剩下的棋子只有幾個棋子,這意味着您可以以最快的方式確定數百個可能的棋步(複合了多少移動深度) ,我軼事認爲其運行在0x88附近。

如果你有興趣在一些棋盤相關的代碼,請參閱我的項目THUD!(棋盤遊戲不是很喜歡在playrules棋,但你會如何執行他們完全類似,代表董事會和作品。同樣,有一個AI也設計得很好(多線程,甚至可以),這說明了位面板的可擴展性。如果你有任何問題,我會很樂意親自給他們看。

3

已經提到的「標準」電路板表示(0x88,bitboards等)都有極端優化的目標,具體來說就是在兩個方面進行極端優化:

  1. 讓它走快,速度越快越好
  2. 提供了一個更好的工具箱程序員指導棋樹搜索,從而提高了AI

「標準」董事會表示是唯一的「標準」中的一羣人寫國際象棋程序,並讓他們在網上與其他人和其他電腦進行競爭性競爭。這顯然不是你所追求的,所以我不會建議你使用任何這些方法。

這些「標準」方法在字面上試圖使用位扭曲的技巧來節省1-2個CPU週期。你使用Python的事實使得在這裏和那裏節省幾個週期是完全沒有意義的。 Python很棒,但它並不快。

Python爲你提供了很多好的工具。使用它們。你的程序會很慢,而且沒有什麼問題。它不會「感覺」緩慢,這就是最重要的。如果我是你,我絕對會使用Python,並且我不會再想到在Python中使用任何這些有點混亂的想法。如果你用C語言或彙編語言編寫,那麼有點搗蛋很有趣。在Python中它毫無意義。