[英]How can I avoid recursion between move generation and check validation in python chess implementation?
[英]Python Chess Implementation
我正在開始國際象棋的實施工作,在陷入困境之前,如果您不介意的話,我想征求社區的意見,因為我已經走到了死胡同哈。 我正在努力找出將碎片與坐標相關聯的最佳方法。
現在,我有一個列表列表,其中包含各個部分,其中每個列表代表一個板。
對於坐標,我使用了這個列表理解
coordinates = [[(i,j) for i in range(0,8)] for j in range(0,8)]
這給了我一張這樣的桌子
[(0, 0), (1, 0), (2, 0), (3, 0), (4, 0), (5, 0), (6, 0), (7, 0)]
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1), (7, 1)]
[(0, 2), (1, 2), (2, 2), (3, 2), (4, 2), (5, 2), (6, 2), (7, 2)]
[(0, 3), (1, 3), (2, 3), (3, 3), (4, 3), (5, 3), (6, 3), (7, 3)]
[(0, 4), (1, 4), (2, 4), (3, 4), (4, 4), (5, 4), (6, 4), (7, 4)]
[(0, 5), (1, 5), (2, 5), (3, 5), (4, 5), (5, 5), (6, 5), (7, 5)]
[(0, 6), (1, 6), (2, 6), (3, 6), (4, 6), (5, 6), (6, 6), (7, 6)]
[(0, 7), (1, 7), (2, 7), (3, 7), (4, 7), (5, 7), (6, 7), (7, 7)]
關於如何將棋子與他們的坐標相關聯以找到潛在的動作,有什么強烈的想法嗎? 一開始我在想字典,但是你有多個相同類型的棋子(例如兩個馬),並且隨着棋盤的發展,我認為這不是理想的選擇。
一如既往的感謝。
有趣的是,我剛剛一直在為此工作! 之前,我寫過國際象棋AI,但是使用javascript編寫,但是今天我已經將代碼轉換成Python,以便與更大的項目一起使用,因此在我的腦海中有了新的知識。
最初,在JS版本中,我將board
有效地存儲為每塊8x8
strings
array
(實際上,這是在對象內部以及其他數據(例如Castling)的對象,但這並不重要)。
但是,由於通過reference
傳遞array
方式,這種使用array
方法(Python中的list
)會導致問題。 問題在於,將板狀態傳遞給negamax
算法意味着要考慮每一個move
,都必須復制整個array
(以JS negamax
),才能停止將其move
到原始板狀態。
我通過將板狀態存儲為在Python中immutable
strings
來解決此問題。 我建議您開始使用lists
盡管它們更容易訪問和更改值,即使在您進行優化時,它們最終可能會導致速度變慢(復制它們)。
存儲board
狀態的實際竅門是為每塊使用一個character
,並使用upper
和lowercase
表示white
和black
一面。 我從廣泛使用偷來的技術FEN notation
,它原來是兩個真正有用的displaying
和做operations
板上的狀態 !
要了解我的意思,您可以使用以下命令初始化開始狀態:
state = ["RNBQKBNR", "PPPPPPPP", " ", " ", " ", " ", "pppppppp", "rnbqkbnr"]
state = [list(r) for r in state]
然后您可以使用以下命令輕松創建display
功能:
def display(state):
for r in reversed(state):
print(''.join(r))
那么每當要顯示給定狀態時,都可以調用display(state)
,該display(state)
為:
rnbqkbnr
pppppppp
PPPPPPPP
RNBQKBNR
希望這可以幫助您! 您可以在github
上查看我對國際象棋AI的完整實現的代碼: Python和javascript :)
好的,它是這樣的:您有64個單元格,通常用字母和數字進行協調。 將每個單元格命名為數字,以便單元格能夠協調一致:“ a1”為11,h5為85,依此類推。
現在開始:
如您所知,我最近獨自創建了一個(如果您介意的話,基於JS)哈哈。
祝好運!
正如有人提到的,最明顯的簡單實現是列表的列表,例如在我的實現中,這個邏輯創建了板,然后使用add()
方法將片段添加到它:
https://github.com/akulakov/pychess/blob/7176b168568000af721e79887981bcd6467cfbc0/chess.py#L141
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.