資源簡介
使用python寫的基于兩層博弈樹的五子棋AI。加入了阿爾法貝塔剪枝。
python版本:3+,應該可以在命令行里直接跑。
電腦執黑,玩家執白。無禁手。
因為只有兩層博弈樹,請大家不要嫌他菜哈哈哈,僅供大家學習參考。
由于寫得比較匆忙,代碼寫的十分丑陋,望海涵!
代碼片段和文件信息
#?-*-?coding:?utf-8?-*-
from?tkinter?import?*
from?tkinter?import?messagebox
import?time
root=Tk()
root.title(‘五子棋‘)
SIZE=17
win_flag=0#-1是人贏1是電腦贏
w=Canvas(rootwidth=SIZE*30height=SIZE*30background=‘orange‘)
w.pack()
for?num?in?range(1SIZE):
????w.create_line(num*3030num*30(SIZE-1)*30width=2)
for?num?in?range(1SIZE):
????w.create_line(30num*30(SIZE-1)*30num*30width=2)
color_flag=1?#下一步要下黑子
STEP=0?#為0則表示還沒落第一個子
matrix?=?[[0?for?i?in?range(SIZE+2)]?for?i?in?range(SIZE+2)]?#外面pading了一圈
#matrix_copy?=?[[0?for?i?in?range(SIZE+2)]?for?i?in?range(SIZE+2)]?#外面pading了一圈
min_x=0?#當前棋子最左的范圍
min_y=0
max_x=0
max_y=0
def?fresh_outline_rectangle(xy):?#刷新棋子外接矩形范圍
????global?min_x
????global?max_x
????global?min_y
????global?max_y
????global?STEP
????if?(STEP?==?0):#下第一顆棋
????????min_x?=?x
????????min_y?=?y
????????max_x?=?x
????????max_y?=?y
#????????STEP?=?1
????else:
????????if(x ????????????min_x=x
????????elif(x>max_x):
????????????max_x=x
????????if(y ????????????min_y=y
????????elif(y>max_y):
????????????max_y=y
#????w.create_rectangle(30*min_x30*min_y30*max_x30*max_yfill=‘blue‘outline=‘blue‘)
????????
#?棋型的評估分數
shape_score?=?{?(010):5???????????#單子
????????????????(011-1):10???????#死2
????????????????(-1110):10???????#死2
????????????????(0110):20????????#活2
????????????????(-11110):20?????#死3
????????????????(0111-1):20?????#死3
????????????????(01110):45??????#活3
????????????????(-111110):60???#死4
????????????????(01111-1):60???#死4
????????????????(011110):120???#活4
????????????????(0111110):300?#成5
????????????????(011111-1):300
????????????????(-1111110):300
????????????????(-111111-1):300
????????????????(-1111111-1):300
????????????????(-11111111-1):300
????????????????}
def?evaluate_each(list_adlist_xwlist_zelist_cq):??#對一個節點的估值
????score_ad=shape_score.get(tuple(list_ad)0)?#默認為0
????score_xw?=?shape_score.get(tuple(list_xw)0)
????score_ze?=?shape_score.get(tuple(list_ze)0)
????score_cq?=?shape_score.get(tuple(list_cq)0)
????rank=[score_adscore_xwscore_zescore_cq]?
????rank.sort()
????rank.reverse()
????score?=?rank[0]+rank[1]?#當前節點的最大評分值
????return??score
def?get_list(mx?mycolor):?#從當前節點搜索?出來4個列表(四個方向)這里colorflag是局部變量
????######################list_ad
????global?matrix
????list1?=?[]
????tx?=?mx
????ty?=?my
????while?(matrix[tx][ty]?==?color):
????????list1.append(1)?#1表示是己方棋子,-1是地方棋子
????????tx?=?tx?+?1?#右
????????ty?=?ty
????if?(matrix[tx][ty]?==?-color?or?tx?==?0?or?ty?==?0?or?tx?>=?SIZE?or?ty?>=?SIZE):
????????list1.append(-1)
????else:
????????list1.append(0)
????list1.pop(0)?#刪除自己?防止在合并的時候重復計算
????list2?=?[]
????tx?=?mx
????ty?=?my
????while?(matrix[tx][ty]?==?color):
????????list2.append(1)
????????tx?=?tx?-?1
????????ty?=?ty
????if?(matrix[tx][ty]?==?-color?or?tx?==?0?or?ty?==?0?or?tx?>=
- 上一篇:requests 中文文檔
- 下一篇:Python最小距離法
評論
共有 條評論