當前位置:成語大全網 - 新華字典 - python版本五子棋

python版本五子棋

機器博弈是人工智能領域的重要分支,它的研究對象多以復雜的棋牌類智力遊戲為主,已經得到解決的棋類遊戲,幾乎全部都應歸功於機器博弈近半個世紀的發展。計算機解決問題的優勢在於能把不易解析的問題,借助於現代計算機的運算速度優勢枚舉出所有的合理情形而得解;然而,博弈問題的復雜程度決定了它不能過度依賴機器的計算能力。許多待解決的或已經解決的棋類,其狀態空間復雜度或博弈樹復雜度量級都太過龐大,所以我們需要添加約束,並且采用合理的算法進行優化。

五子棋問題是人工智能中的壹個經典問題。當今世界,AlphaGo已經執圍棋之牛耳,五子棋領域卻鮮少有人問津。本文根據課堂所學知識結合文獻、博客,基於兩種開發語言實現了壹個智能對戰的AI五子棋遊戲平臺。

本文所做工作如下:

(1) 五子棋界面實現;

(2) 智能判定棋盤走勢;

(3) 改進了棋盤掃描方式;

(4) 改良了系統評分表評估方式;

(5) 實現了基於點評分表估值找出最佳落子方式。

五子棋AI問題的最大問題是如何實現智能對弈,即當人落子之後,算法如何解讀當前的棋盤並且對其進行分析解讀,得到電腦方的最佳落子點。其次還有壹個問題是如何判斷勝利,這可以作為前面棋盤局勢判定的壹個子問題,也可以看做是壹個單獨的問題,不過這個問題總體來說較為簡單,所以不做詳細說明。

五子棋的整體知識構建包含以下部分:

(1) 棋盤局面表示法

(2) 棋局勝利判定

(3) 棋型知識庫

(4) 智能博弈流程

對於問題(1),采用數組表示法。棋盤中的各交叉點有三種狀態,不妨令 0表示空(未放置棋子) ,-1 表示有黑子 ,1 表示有白子,數組表示法的基本思想是:以交叉點對應的數組索引值來表達物理位置 ,以交叉點對應的元素值表達狀態(空、 黑子、 白子)。令 V = {0 ,1 ,-1} ,棋盤 的第 i 個交叉點的狀態 Si ∈V ,任何棋局都可以表示成壹個 n ×n 的二元組。

對於問題(2), 采用數組表示法時,想知道任意兩個元素 Si 和Sj 是否***線,要通過 i 和 j 之間的數值規律來判斷。從這方面看,數組表示法是壹種原始、低效的表示方法,但是對於評分表算法來說其性能損失是可以接受的。要判斷是否有壹方已經勝利,只需要對整個棋盤判定當前落子點的縱、橫、正斜、反斜四個方向的最長延伸出四個位置看是否能連成壹條同色直線即可。具體的操作可以視為:從落子點出發,向兩個方向延伸,如果遇到同色,那麽計數器加壹,遇到非同色(空白或者異色)則停止在該方向的延伸,壹個計數器記下該方向上的兩頭的連續同色棋子數。等到四個方向都探索完畢,如果四個計數器中有壹個計數器達到了5,那麽即可判斷出已經有五子連珠了,此局結束。

問題(3)棋型知識庫主要包括各種既定的棋盤形式,有如下幾種:

? 活四 :有兩個連五點(即有兩個點可以形成五),圖中白點即為連五點。當活四出現的時候,整個局勢已經無法阻止連五了,活四的歸屬方壹定能取得勝利;

? 沖四 :有壹個連五點,如下面三圖,均為沖四棋型。圖中白點為連五點。 相對比活四來說,沖四的威脅性就小了很多,因為這個時候,只要跟著防守在那個唯壹的連五點上,沖四就沒法形成連五。

? 活三 :可以形成活四的三,如下圖,代表兩種最基本的活三棋型。圖中白點為活四點。活三棋型是進攻中最常見的壹種,因為活三之後,如果對方不以理會,將可以下壹手將活三變成活四,而活四是無法防守的。所以,面對活三的時候,需要非常謹慎對待。在沒有更好的進攻手段的情況下,必須對其進行防守,以防止其形成可怕的活四棋型。

? 眠三: 只能夠形成沖四的三,如下各圖,分別代表最基礎的六種眠三形狀。圖中白點代表沖四點。眠三的棋型與活三的棋型相比,危險系數下降不少,因為眠三棋型即使不去防守,下壹手它也只能形成沖四,而對於單純的沖四棋型,是可以很簡單的防守住的。

? 活二 :能夠形成活三的二,如下圖,是三種基本的活二棋型。圖中白點為活三點。

? 眠二 :能夠形成眠三的二。圖中四個為最基本的眠二棋型,細心且喜歡思考的同學會根據眠三介紹中的圖2-13找到與下列四個基本眠二棋型都不壹樣的眠二。圖中白點為眠三點。

對於上述的棋型,我們主要考慮的是活四、沖四、活三、眠三這幾種主要的進攻棋型的防守與構成,整體棋型遵從以下原則:優先考慮數目,同等數目的情況下考慮是活是眠。評分表算法的設計整體偏向於防守。

對於問題(4),當下棋型的評估分析,算法嚴格遵從以下流程:

當人類方落下壹子,算法啟動,掃描全局,得到人類棋子的集合和電腦棋子的集合。全局掃描之後,對當前局勢進行排序、計算。對每個集合的每個空白點位置打分,打分依據是根據這個點周圍四個方向上的同色連續棋子的數量。按照這些最後得到的評分,得出最大值。得到人類方和電腦方的兩個最大值之後,進行比較,如果人類方局勢較好(分數較高),則算法將下壹次落子位置設置為人類方得分最高的點,盡力降低人類方的下壹步得分;如果電腦方的分數較高,那麽則直接在使得分數最高的點落子即可。

本次課程設計,壹***設計了兩個版本,壹個Java版本,為19X19的棋盤,配備簡單的消息提示,基於AWT實現GUI,開發工具IntelliJ IDEA 2018.1

另壹個版本是使用Python設計,核心算法相同,但是受限於圖片源文件,為15X15棋盤,基於pygame實現GUI,開發工具是:JetBrains PyCharm 2018.2.4 x64

因為近期時間較為緊迫,所以《人工智能》這門課我選擇了較為簡單的五子棋問題進行課程設計。在本次課程設計中,我的編碼能力、調試能力、算法解讀實現能力、函數優化能力等各方面有了長足的進步。在本次的設計過程中也出現了幾個問題,下面對這些問題進行壹個簡單的描述:

(1) 對棋盤局勢的判斷力不夠,因為只是簡單的對當前的棋盤局勢進行判斷,基本等同於壹個粗通規則而且天賦不高的五子棋選手。如果對手很細心,而且熟練經營各種布局策略,那麽基本這個算法就會被鉆研出習慣,從而被輕易針對,而且針對方案百試不爽;

(2) 判斷棋局形式的時候對邊界的評分算法跟中心區域的評分算法壹致,無法有效提前識別邊界,降低邊界空白點的權重;

(3) 用戶圖形界面需要改進,另外可以增設PK模式以及選色、選擇棋盤大小功能等;

後續可以嘗試用博弈樹算法嘗試與當前算法進行比較。評分表算法犧牲了更高的精度,以求迅速的得出最佳落子點;而博弈樹可以通過提前落子進行全局預判進行更全方位的對人類方的圍追堵截。

另外,可以通過在課堂上學到的知識,比如BFS、DFS、A*算法、決策樹算法 等應用於五子棋的智能決策中。

《人工智能》這門課讓我對於圖、知識表示、智能決策等各個方面有了更好地認識與體驗,課堂設計內容充實有趣,讓我受益匪淺,希望今後可以更加深入這個方面,並且將課堂上學到的知識應用於實踐之中。