资源简介
使用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最小距离法
评论
共有 条评论