簡體   English   中英

Python 國際象棋實現

[英]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 ,並使用upperlowercase表示whiteblack一面。 我從廣泛使用偷來的技術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的完整實現的代碼: Pythonjavascript :)

好的,它是這樣的:您有64個單元格,通常用字母和數字進行協調。 將每個單元格命名為數字,以便單元格能夠協調一致:“ a1”為11,h5為85,依此類推。

現在開始:

  1. 向上:(單元格值)+1,向下:(單元格值)-1,右側:(單元格值)+ 10,左側:(單元格值)-10,
  2. 診斷:左上:(像元值)-9,右上:(像元值)+ 11,下-左:(像元值)-11,下右:((像元值)+ 9,
  3. 對於騎士:(像元值)+ 21,(像元值)-21,(像元值)+ 12,(像元值)-12,(像元值)+ 8,(像元值)-8,(像元值)+ 19,(單元格值)-19。

如您所知,我最近獨自創建了一個(如果您介意的話,基於JS)哈哈。

祝好運!

正如有人提到的,最明顯的簡單實現是列表的列表,例如在我的實現中,這個邏輯創建了板,然后使用add()方法將片段添加到它:

https://github.com/akulakov/pychess/blob/7176b168568000af721e79887981bcd6467cfbc0/chess.py#L141

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM