• 大小: 13KB
    文件类型: .py
    金币: 1
    下载: 0 次
    发布日期: 2021-05-17
  • 语言: Python
  • 标签: 五子棋AI  

资源简介

使用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 >=

评论

共有 条评论

相关资源