資料介紹
最近我用Python做了一個國際象棋程序并把代碼發(fā)布在Github上了。這個代碼不到1000行,大概20%用來實現(xiàn)AI。在這篇文章中我會介紹這個AI如何工作,每一個部分做什么,它為什么能那樣工作起來。你可以直接通讀本文,或者去下載代碼,邊讀邊看代碼。雖然去看看其他文件中有什么AI依賴的類也可能有幫助,但是AI部分全都在AI.py文件中。
AI 部分總述
AI在做出決策前經(jīng)過三個不同的步驟。首先,他找到所有規(guī)則允許的棋步(通常在開局時會有20-30種,隨后會降低到幾種)。其次,它生成一個棋步樹用來隨后決定最佳決策。雖然樹的大小隨深度指數(shù)增長,但是樹的深度可以是任意的。假設(shè)每次決策有平均20個可選的棋步,那深度為1對應(yīng)20棋步,深度為2對應(yīng)400棋步,深度為3對應(yīng)8000棋步。最后,它遍歷這個樹,采取x步后結(jié)果最佳的那個棋步,x是我們選擇的樹的深度。后面的文章為了簡單起見,我會假設(shè)樹深為2。
?
生成棋步樹
棋步樹是這個AI的核心。構(gòu)成這個樹的類是MoveNode.py文件中的MoveNode。他的初始化方法如下:
這個類有五個屬性。首先是move,即它包含的棋步,它是個Move類,在這不是很重要,只需要知道它是一個告訴一個起子往哪走的棋步,可以吃什么子,等等。然后是children,它也是個MoveNode類。第三個屬性是parent,所以通過它可以知道上一層有哪些MoveNode。pointAdvantage屬性是AI用來決定這一棋步是好是壞用的。depth屬性指明這一結(jié)點在第幾層,也就是說該節(jié)點上面有多少節(jié)點。生成棋步樹的代碼如下:
變量moveTree一開始是個空list,隨后它裝入MoveNode類的實例。第一個循環(huán)后,它只是一個擁有沒有父結(jié)點、子結(jié)點的MoveNode的數(shù)組,也就是一些根節(jié)點。第二個循環(huán)遍歷moveTree,用populateNodeChildren函數(shù)給每個節(jié)點添加子節(jié)點:
這個函數(shù)是遞歸的,并且它有點難用圖像表達(dá)出來。一開始給它傳遞了個MoveNode對象。這個MoveNode對象會有為1的深度,因為它沒有父節(jié)點。我們還是假設(shè)這個AI被設(shè)定為深度為2。因此率先傳給這個函數(shù)的結(jié)點會跳過第一個if語句。
然后,決定出所有規(guī)則允許的棋步。不過這在這篇文章討論的范圍之外,如果你想看的話代碼都在Github上。下一個if語句檢查是否有符合規(guī)則的棋步。如果一個都沒有,要么被將死了,要么和棋了。如果是被將死了,由于沒有其他可以走的棋步,把node.move.checkmate屬性設(shè)為True并return。和棋也是相似的,不過由于哪一方都沒有優(yōu)勢,我們把node.pointAdvantage設(shè)為0。
如果不是將死或者和棋,那么legalMoves變量中的所有棋步都被加入當(dāng)前結(jié)點的子節(jié)點中作為MoveNode,然后函數(shù)被調(diào)用來給這些子節(jié)點添加他們自己的MoveNode。
- Arduino超級國際象棋II
- 使用Arduino的國際象棋鬧鐘
- 國際象棋機(jī)器人開源分享
- 一個簡單的國際象棋時鐘
- 用于M5Stack的Arduino大型國際象棋
- Arduino超級國際象棋
- Python的單行命令實例說明 1次下載
- python的12個經(jīng)典實例程序詳細(xì)說明 34次下載
- Python的函數(shù)文件與模塊的程序說明 2次下載
- Flask入門教程之使用Python和Flask開發(fā)一個Web程序 0次下載
- 使用Python和Flask開發(fā)一個Web程序 0次下載
- Flask入門教程使用Python和Flask開發(fā)你的第一個Web程序電子書 0次下載
- 使用用于MCS-51的IAR嵌入式平臺編寫的一個示例程序程序免費下載
- 如何使用Python編程一個石頭剪刀布游戲的小程序 26次下載
- 《Python開發(fā)技術(shù)詳解》-隨書附帶程序 0次下載
- 零基礎(chǔ)入門:如何在樹莓派上編寫和運行Python程序? 1.7k次閱讀
- 寫一個exe程序 1.8k次閱讀
- 利用Python找到下一個“游戲驛站” 1.3k次閱讀
- 一個純Python編寫的輕量級數(shù)據(jù)庫 1.8k次閱讀
- 如何來編寫一個串口收發(fā)程序 4.1k次閱讀
- 用ChatGPT編寫各種腳本 8k次閱讀
- Verilog程序編寫規(guī)范 4.8k次閱讀
- 如何編寫第一個hello world程序 9.7k次閱讀
- 如何使用Python編寫一個桌面軟件系統(tǒng)?步驟有哪些 5.4k次閱讀
- 可以使用手機(jī)編程實現(xiàn)python嗎 1.1w次閱讀
- 基于GD32F103系列處理器設(shè)計的象棋人機(jī)對弈程序 4k次閱讀
- 一個python腳本看透Linux程序對庫的依賴 3.6k次閱讀
- AlphaZero如何快速學(xué)習(xí)每個游戲,如何從隨機(jī)對弈開始訓(xùn)練 7.9k次閱讀
- 如何使用Python編寫能夠從原始文本提取信息的程序 1.1w次閱讀
- 分享一份網(wǎng)友學(xué)習(xí)python時編寫的一個小工具 8k次閱讀
下載排行
本周
- 1新一代網(wǎng)絡(luò)可視化(NPB 2.0)
- 3.40 MB | 1次下載 | 免費
- 2MDD品牌三極管MMBT3906數(shù)據(jù)手冊
- 2.33 MB | 次下載 | 免費
- 3MDD品牌三極管S9012數(shù)據(jù)手冊
- 2.62 MB | 次下載 | 免費
- 4聯(lián)想flex2-14D/15D說明書
- 4.92 MB | 次下載 | 免費
- 5收音環(huán)繞擴(kuò)音機(jī) AVR-1507手冊
- 2.50 MB | 次下載 | 免費
- 624Pin Type-C連接器設(shè)計報告
- 1.06 MB | 次下載 | 免費
- 7MS1000TA 超聲波測量模擬前端芯片技術(shù)手冊
- 0.60 MB | 次下載 | 免費
- 8MS1022高精度時間測量(TDC)電路數(shù)據(jù)手冊
- 1.81 MB | 次下載 | 免費
本月
- 1愛華AIWA HS-J202維修手冊
- 3.34 MB | 37次下載 | 免費
- 2PC5502負(fù)載均流控制電路數(shù)據(jù)手冊
- 1.63 MB | 23次下載 | 免費
- 3NB-IoT芯片廠商的資料說明
- 0.31 MB | 22次下載 | 1 積分
- 4H110主板CPU PWM芯片ISL95858HRZ-T核心供電電路圖資料
- 0.63 MB | 6次下載 | 1 積分
- 5UWB653Pro USB口測距通信定位模塊規(guī)格書
- 838.47 KB | 5次下載 | 免費
- 6技嘉H110主板IT8628E_BX IO電路圖資料
- 2.61 MB | 4次下載 | 1 積分
- 7蘇泊爾DCL6907(即CHK-S007)單芯片電磁爐原理圖資料
- 0.04 MB | 4次下載 | 1 積分
- 8100W準(zhǔn)諧振反激式恒流電源電路圖資料
- 0.09 MB | 2次下載 | 1 積分
總榜
- 1matlab軟件下載入口
- 未知 | 935137次下載 | 10 積分
- 2開源硬件-PMP21529.1-4 開關(guān)降壓/升壓雙向直流/直流轉(zhuǎn)換器 PCB layout 設(shè)計
- 1.48MB | 420064次下載 | 10 積分
- 3Altium DXP2002下載入口
- 未知 | 233089次下載 | 10 積分
- 4電路仿真軟件multisim 10.0免費下載
- 340992 | 191439次下載 | 10 積分
- 5十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
- 158M | 183353次下載 | 10 積分
- 6labview8.5下載
- 未知 | 81602次下載 | 10 積分
- 7Keil工具M(jìn)DK-Arm免費下載
- 0.02 MB | 73822次下載 | 10 積分
- 8LabVIEW 8.6下載
- 未知 | 65991次下載 | 10 積分
電子發(fā)燒友App





創(chuàng)作
發(fā)文章
發(fā)帖
提問
發(fā)資料
發(fā)視頻
上傳資料賺積分
評論