本文目錄一覽:
如何用python turtle畫一個中國象棋的棋盤?
#繪製棋盤,每個格子50
import turtle
t=turtle.Pen()
bs=50
#畫直線
def line(x,y,z):
t.penup()
t.goto(x,y)
t.pendown()
t.fd(z)
#兩點直線
def any(a,b,c,d):
t.penup()
t.goto(a,b)
t.pendown()
t.goto(c,d)
#畫L型
def typeL(x,y):
t.penup()
t.goto(x-bs*0.25, y+bs*0.075)
t.pendown()
t.goto(x-bs*0.075, y+bs*0.075)
t.goto(x – bs*0.075, y + bs*0.25)
t.penup()
t.goto(x – bs*0.25, y – bs*0.075)
t.pendown()
t.goto(x – bs*0.075, y – bs*0.075)
t.goto(x – bs*0.075, y – bs*0.25)
t.penup()
t.goto(x+bs*0.25, y+bs*0.075)
t.pendown()
t.goto(x+bs*0.075, y+bs*0.075)
t.goto(x + bs*0.075, y + bs*0.25)
t.penup()
t.goto(x + bs*0.25, y – bs*0.075)
t.pendown()
t.goto(x + bs*0.075, y – bs*0.075)
t.goto(x + bs*0.075, y – bs*0.25)
#畫半L型
def typehL(x,y,z):
if(z==’l’):
t.penup()
t.goto(x-bs*0.25, y+bs*0.075)
t.pendown()
t.goto(x-bs*0.075, y+bs*0.075)
t.goto(x – bs*0.075, y + bs*0.25)
t.penup()
t.goto(x – bs*0.25, y – bs*0.075)
t.pendown()
t.goto(x – bs*0.075, y – bs*0.075)
t.goto(x – bs*0.075, y – bs*0.25)
if(z==’r’):
t.penup()
t.goto(x + bs*0.25, y + bs*0.075)
t.pendown()
t.goto(x + bs*0.075, y + bs*0.075)
t.goto(x + bs*0.075, y + bs*0.25)
t.penup()
t.goto(x + bs*0.25, y – bs*0.075)
t.pendown()
t.goto(x + bs*0.075, y – bs*0.075)
t.goto(x + bs*0.075, y – bs*0.25)
#畫橫線
p=bs*4.5
while(p=-bs*4.5):
line(-bs*4,p,bs*8)
p=p-bs
any(bs*4,bs*4.5,bs*4,-bs*4.5)
any(-bs*4,bs*4.5,-bs*4,-bs*4.5)
t.right(90)
q=-bs*3
while(qbs*4):
line(q,bs*4.5,bs*4)
q=q+bs
q=-bs*3
while(qbs*4):
line(q,-bs*0.5,bs*4)
q=q+bs
#畫斜線
any(-bs,-bs*4.5,bs,-bs*2.5)
any(bs,-bs*4.5,-bs,-bs*2.5)
any(-bs,bs*4.5,bs,bs*2.5)
any(bs,bs*4.5,-bs,bs*2.5)
#畫L型
typeL(-bs*2,-bs*1.5)
typeL(0,-bs*1.5)
typeL(bs*2,-bs*1.5)
typeL(-bs*2,bs*1.5)
typeL(0,bs*1.5)
typeL(bs*2,bs*1.5)
typeL(-bs*3,-bs*2.5)
typeL(bs*3,-bs*2.5)
typeL(-bs*3,bs*2.5)
typeL(bs*3,bs*2.5)
typehL(-bs*4,-bs*1.5,’r’)
typehL(bs*4,-bs*1.5,’l’)
typehL(-bs*4,bs*1.5,’r’)
typehL(bs*4,bs*1.5,’l’)
turtle.done()
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*算法、決策樹算法 等應用於五子棋的智能決策中。
《人工智能》這門課讓我對於圖、知識表示、智能決策等各個方面有了更好地認識與體驗,課堂設計內容充實有趣,讓我受益匪淺,希望今後可以更加深入這個方面,並且將課堂上學到的知識應用於實踐之中。
求解用python 編寫五子棋怎樣編寫判斷輸贏的函數,應該從哪方面考慮呢?最好有代碼,,,,謝謝
你都做到這個程度了,當然就是高手了。 把棋子位置放在一個數據里。然後做一個路徑搜索算法。只搜索8個方向,如果某個方向有5個子連在一起就贏了。
這是個笨方法,還有很多優化的地方,比如上一次搜索後,建立一個路徑數組。下一次,只需要檢驗上一次結果,並將新的棋子放進路徑里就可以了。 這樣就效率很高了。
具體的你自己研究。這個對你來說應該輕鬆啦。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/275848.html