python博弈树实现AI五子棋小游戏
运行比较慢,后续优化。
完整项目代码可从 https://github.com/hfq0219/wuziqi.git 下载。
功能有选择先后手和先手禁手规则。
运行效果:


#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
#wuziqi.py
#Author:fengqi
from graphics import *
import time
###
num = [[0 for a in range(16)] for a in range(16)]
dx = [1,1,0,-1,-1,-1,0,1] #x,y方向向量
dy = [0,1,1,1,0,-1,-1,-1]
is_end = False
go_first = 1 #先手标志
start = 1 #轮换下棋标志
ai = 1 #AI下棋标志
L1_max=-100000 #剪枝阈值
L2_min=100000
list=[] #保存已画棋子
RESTART_FLAG = False
QUIT_FLAG = False
###
win = GraphWin("五子棋",550,451)
aiFirst = Text(Point(500,100),"")
manFirst = Text(Point(500,140),"")
notice = Text(Point(500,290),"") #提示轮到谁落子
notice.setFill('red')
last_ai = Text(Point(500,330),"") #AI最后落子点
last_man = Text(Point(500,370),"") #玩家最后落子点
QUIT = Text(Point(500,20),"退出")
QUIT.setFill('red')
RESTART = Text(Point(500,60),"重玩")
RESTART.setFill('red')
#数据初始化,把棋盘上的棋子和提示清空
def init():
global is_end,start,go_first,RESTART_FLAG
is_end=False
start=1
go_first=1
RESTART_FLAG=False
QUIT_FLAG=False
for i in range(16):
for j in range(16):
if(num[i][j]!=0):
num[i][j]=0
for i in range(len(list)):
list[-1].undraw()
list.pop(-1)
aiFirst.setText("AI 先手")
manFirst.setText("我先手")
notice.setText("")
last_ai.setText("")
last_man.setText("")
#画棋盘
def drawWin():
win.setBackground('yellow')
for i in range(0,451,30):
line=Line(Point(i,0),Point(i,450))
line.draw(win)
for j in range(0,451,30):
line=Line(Point(0,j),Point(450,j))
line.draw(win)
Rectangle(Point(460,5),Point(540,35)).draw(win)
Rectangle(Point(460,45),Point(540,75)).draw(win)
Rectangle(Point(460,85),Point(540,115)).draw(win)
Rectangle(Point(460,125),Point(540,155)).draw(win)
Rectangle(Point(452,275),Point(548,305)).draw(win)
Rectangle(Point(452,307),Point(548,395)).draw(win)
aiFirst.draw(win)
manFirst.draw(win)
notice.draw(win)
last_ai.draw(win)
last_man.draw(win)
QUIT.draw(win)
RESTART.draw(win)
#判断该点是否在棋盘范围内
def inBoard(x,y):
if(x>=0 and x<=15 and y>=0 and y<=15): return True
else: return False
#判断该点是否可落子,即是否在棋盘内且没有落子
def downOk(x,y):
if(inBoard(x,y) and num