upload finalchess project

master
bettleChen 1 year ago
parent a160d2b06c
commit 980359e5b2

@ -0,0 +1,791 @@
import random
from chessboard import *
from PIL import Image,ImageTk
import math
import random
import time
Chessimgx=0 #玩家落子的横坐标
Chessimgy=0 #玩家落子的纵坐标
xregretFLAG = [0 for x in range(365)] #悔棋的数组x坐标
yregretFLAG = [0 for y in range(365)] #悔棋的数组y坐标
class Chess:
def __init__(self):
self.ChessData = [[{"Cstate": 0, "Cstep": 0} for j in range(19)] for i in range(19)]#Cstate=0无棋子1有黑棋子2有白棋子Cstep为该棋子落子的步骤
#self.chess_state = [[0 for y in range(19)] for x in range(19)] # 15x15的大小存储棋子的状态,0为没有棋子1为白色棋子2为黑色棋子
#self.chess_step = [[0 for y in range(19)] for x in range(19)] # 15x15的大小存储当前棋子的步骤
self.Currently_step = 0 #棋子当前进行的步数
self.Chessimg = [[0 for y in range(19)] for x in range(19)]
self.Relabel = [[0 for y in range(19)] for x in range(19)] #复盘的标签
# self.promptBoxFlag = [[[0 for z in range(8)] for y in range(15)] for x in range(15)]
self.Score = [[0 for y in range(19)] for x in range(19)] # 初始化计分数组
self.Max_Score = 0
self.Counts = 0
self.New_count = 0
self.Ovalone = 0 #代表棋子
self.WinFLAG = 0 #判断是否取得胜利
self.Gameover = 0 #判断游戏是否结束
self.Depth = 0 #搜索的深度
self.player = 0 #轮到下棋的标志1=下0=不下
self.computer = 0 #轮到下棋的标志1=下0=不下
self.Current_Player = 1 #=1黑方=2白方
self.myColor = 0 # 玩家选择的棋子颜色
self.computercolor = 0 # 电脑的棋子颜色
self.Chess_Mode = 3#对弈方式标志 Chess_Mode=0,人-人对弈; =1, 人-机白对弈; =2,机黑-人对弈)
self.player2color = 0 #玩家2的棋子颜色
self.showHistory=False #当为False时不展示下棋的步骤当为True时展示下棋的步骤
# self.choice = 0
def count_Score(self,x, y, computerColor):
# global sum,count,value
sum = 0
# count = 0
value = [0, 0, 0, 0]
upcount = [0, 0, 0, 0] # 左、上、左斜上、左斜下 棋子数
downcount = [0, 0, 0, 0] # 右、下、右斜向下、右斜向上 棋子数
upflag = [0, 0, 0, 0] # 左、上、左斜上、左斜下 空格数
downflag = [0, 0, 0, 0] # 右、下、右斜向下、右斜向上 空格数
for color in range(1, 3):
self.ChessData[x][y]['Cstate'] = color
# 假设该点为白色棋子
for i in range(x-1, -1, -1): # 计算左边棋子数量 upcount[0]表示左侧同类棋子 用upflag[0] 记录
if self.ChessData[i][y]['Cstate'] == color:
upcount[0] += 1 # 左侧有自己棋子
elif self.ChessData[i][y]['Cstate'] != 0 and self.ChessData[i][y]['Cstate'] != color: # 左侧有对方棋子
upflag[0] = -1
break
elif self.ChessData[i][y]['Cstate'] == 0: # 左侧没有棋子
upflag[0] = 1
if i - 1 >= 0 and self.ChessData[i-1][y]['Cstate'] == 0:
upflag[0] = 2 # 表示有两个空格
else:
break
if i - 2 >= 0 and self.ChessData[i-2][y]['Cstate'] == 0:
upflag[0] = 3 # 表示有三个空格
else:
break
break
for i in range(x + 1, 19): # 计算右边棋子数量 downcount[0]表示右侧同类棋子 用downflag[0] 记录
if self.ChessData[i][y]['Cstate'] == color:
downcount[0] += 1 # 右侧有自己棋子
elif self.ChessData[i][y]['Cstate'] != 0 and self.ChessData[i][y]['Cstate'] != color: # 右侧有对方棋子
downflag[0] = -1
break
elif self.ChessData[i][y]['Cstate'] == 0: # 右侧没有棋子
downflag[0] = 1
if i + 1 < 19 and self.ChessData[i+1][y]['Cstate'] == 0:
downflag[0] = 2 # 表示有两个空格
else:
break
if i + 2 < 19 and self.ChessData[i+2][y]['Cstate'] == 0:
downflag[0] = 3 # 表示有三个空格
else:
break
break
for i in range(y - 1, -1, -1): # 计算方向向上 upcount[1]表示上方同类棋子 用upflag[1] 记录
if self.ChessData[x][i]['Cstate'] == color:
upcount[1] += 1 # 上有自己棋子
elif self.ChessData[x][i]['Cstate'] != 0 and self.ChessData[x][i]['Cstate'] != color: # 上有对方棋子
upflag[1] = -1
break
elif self.ChessData[x][i]['Cstate'] == 0: # 上没有棋子
upflag[1] = 1
if i - 1 >= 0 and self.ChessData[x][i-1]['Cstate'] == 0:
upflag[1] = 2 # 表示上有两个空格
else:
break
if i - 2 >= 0 and self.ChessData[x][i-2]['Cstate'] == 0:
upflag[1] = 3 # 表示上有三个空格
else:
break
break
for i in range(y + 1, 19): # 计算下棋子数量 downcount[0]表示下同类棋子 用downflag[0] 记录
if self.ChessData[x][i]['Cstate'] == color:
downcount[1] += 1 # 下有自己棋子
elif self.ChessData[x][i]['Cstate'] != 0 and self.ChessData[x][i]['Cstate'] != color: # 下有对方棋子
downflag[1] = -1
break
elif self.ChessData[x][i]['Cstate'] == 0: # 下侧没有棋子
downflag[1] = 1
if i + 1 <19 and self.ChessData[x][i+1]['Cstate'] == 0:
downflag[1] = 2 # 表示下有两个空格
else:
break
if i + 2 <19 and self.ChessData[x][i+2]['Cstate'] == 0:
downflag[1] = 3 # 表示下有三个空格
else:
break
break
j=1
for i in range(x - 1, -1, -1): # // 计算左斜向上 upcount[2]表示左斜向上同类棋子 用upflag[2]记录
# for j in range(y - 1, -1, -1):
if y-j>=0 and self.ChessData[i][y-j]['Cstate'] == color:
upcount[2] += 1 # 左斜向上有自己棋子
j+=1
elif y-j>=0 and self.ChessData[i][y-j]['Cstate'] != 0 and self.ChessData[i][y-j]['Cstate'] != color: # 左斜向上有对方棋子
upflag[2] = -1
j += 1
break
elif y-j>=0 and self.ChessData[i][y-j]['Cstate'] == 0: # 左斜向上没有棋子
upflag[2] = 1
if i - 1 >= 0 and y-j-1 >= 0 and self.ChessData[i-1][y-j-1]['Cstate'] == 0:
upflag[2] = 2 # 表示有两个空格
j += 1
else:
j += 1
break
if i - 2 >= 0 and y-j- 2 >= 0 and self.ChessData[i-2][y-j-2]['Cstate'] == 0:
upflag[2] = 3 # 表示有三个空格
j += 1
else:
j += 1
break
j += 1
break
j = 1
for i in range(x + 1, 19): # // 计算右斜向下 downcount[2]表示右斜向下同类棋子 用downflag[2]记录
if y+j<19 and self.ChessData[i][y+j]['Cstate'] == color:
downcount[2] += 1 # 右斜向下有自己棋子
j += 1
elif y+j<19 and self.ChessData[i][y+j]['Cstate'] != 0 and self.ChessData[i][y+j]['Cstate'] != color: # 右斜向下有对方棋子
downflag[2] = -1
j += 1
break
elif y+j<19 and self.ChessData[i][y+j]['Cstate'] == 0: # 右斜向下没有棋子
downflag[2] = 1
if i + 1 < 19 and y+j + 1 < 19 and self.ChessData[i+1][y+j+1]['Cstate'] == 0:
downflag[2] = 2 # 表示有两个空格
j += 1
else:
j += 1
break
if i + 2 < 19 and y+j + 2 < 19 and self.ChessData[i+2][y+j+2]['Cstate'] == 0:
downflag[2] = 3 # 表示有三个空格
j += 1
else:
j += 1
break
j += 1
break
j=1
for i in range(x + 1, 19): # // 计算右斜向上 downcount[3]表示右斜向上同类棋子 用downflag[3]记录
# for j in range(y - 1, -1, -1):
if y-j>=0 and self.ChessData[i][y-j]['Cstate'] == color:
downcount[3] += 1 # 右斜向上有自己棋子
j +=1
elif y-j>=0 and self.ChessData[i][y-j]['Cstate'] != 0 and self.ChessData[i][y-j]['Cstate'] != color: # 右斜向上有对方棋子
downflag[3] = -1
j += 1
break
elif y-j>=0 and self.ChessData[i][y-j]['Cstate'] == 0: # 右斜向上没有棋子
downflag[3] = 1
if i + 1 < 19 and y-j-1 >= 0 and self.ChessData[i][y-j]['Cstate'] == 0:
downflag[3] = 2 # 表示有两个空格
j += 1
else:
j += 1
break
if i + 2 < 19 and y-j-2 >= 0 and self.ChessData[i][y-j]['Cstate'] == 0:
downflag[3] = 3 # 表示有三个空格
j += 1
else:
j += 1
break
j += 1
break
j=1
for i in range(x - 1, -1, -1): # 计算左斜向下 upcount[3]表示左斜向下同类棋子 用upflag[3]记录
# for j in range(y + 1, 15):
if y+j<19 and self.ChessData[i][j+y]['Cstate'] == color:
upcount[3] += 1 # 左斜向下有自己棋子
j+=1
elif y+j<19 and self.ChessData[i][j+y]['Cstate'] != 0 and self.ChessData[i][j+y]['Cstate'] != color: # 左斜向下有对方棋子
upflag[3] = -1
j+=1
break
elif y+j<19 and self.ChessData[i][j+y]['Cstate'] == 0: # 左斜向下没有棋子
upflag[3] = 1
if i - 1 >= 0 and j+y+1 < 19 and self.ChessData[i][j+y]['Cstate'] == 0:
upflag[3] = 2 # 表示有两个空格
j += 1
else:
j += 1
break
if i - 2 >= 0 and j+y+2 < 19 and self.ChessData[i-1][j+y+1]['Cstate'] == 0:
upflag[3] = 3 # 表示有三个空格
j += 1
else:
j += 1
break
j += 1
break
if computerColor == self.ChessData[x][y]['Cstate']: # 数据处理,如果是电脑方的话分数要高一点
for i in range(4):
count = upcount[i] + downcount[i] + 1
if count == 5: # 成五
value[i] = 40000
elif count == 4:
if upflag[i] >= 1 and downflag[i] >= 1: # 活四
value[i] = 19000
if (upflag[i] >= 1 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] >= 1): # 眠四
value[i] = 3000
if upflag[i] == -1 and downflag[i] == -1: # 死四
value[i] = -50
elif count == 3:
if (upflag[i] >= 2 and downflag[i] >= 1) or (upflag[i] >= 1 and downflag[i] >= 2): # 活三
value[i] = 4000
if (upflag[i] >= 2 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] >= 2) or (
upflag[i] == 1 and downflag[i] == 1): # 眠三
value[i] = 800
if upflag[i] == -1 and downflag[i] == -1: # 死三
value[i] = -50
elif count == 2:
if (upflag[i] >= 3 and downflag[i] >= 1) or (upflag[i] >= 1 and downflag[i] >= 3) or (
upflag[i] >= 2 and downflag[i] >= 2): # 活二
value[i] = 1050
if (upflag[i] >= 3 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] >= 3) or (
upflag[i] == 2 and downflag[i] == 1) or (upflag[i] == 1 and downflag[i] == 2): # 眠三
value[i] = 350
if upflag[i] == -1 and downflag[i] == -1: # 死二
value[i] = -50
else:
if (upflag[i] >= 3 and downflag[i] >= 2) or (upflag[i] >= 2 and downflag[i] >= 3): # 活一
value[i] = 80
if (upflag[i] == 2 and downflag[i] == 2) or (upflag[i] == 1 and downflag[i] == 3) or (
upflag[i] == 3 and downflag[i] == 1): # 眠一
value[i] = 20
if (upflag[i] <= 1 and downflag[i] <= 2) or (upflag[i] <= 2 and downflag[i] <= 1): # 死一
value[i] = -50
else:
for i in range(4):
count = upcount[i] + downcount[i] + 1
if count == 5: # 成五
value[i] = 30000
elif count == 4:
if upflag[i] >= 1 and downflag[i] >= 1: # 活四
value[i] = 15000
if (upflag[i] >= 1 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] >= 1): # 眠四
value[i] = 2500
if upflag[i] == -1 and downflag[i] == -1: # 死四
value[i] = -50
elif count == 3:
if (upflag[i] >= 2 and downflag[i] >= 1) or (upflag[i] >= 1 and downflag[i] >= 2): # 活三
value[i] = 3000
if (upflag[i] >= 2 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] >= 2) or (
upflag[i] == 1 and downflag[i] == 1): # 眠三
value[i] = 500
if upflag[i] == -1 and downflag[i] == -1: # 死三
value[i] = -50
elif count == 2:
if (upflag[i] >= 3 and downflag[i] >= 1) or (upflag[i] >= 1 and downflag[i] >= 3) or (
upflag[i] >= 2 and downflag[i] >= 2): # 活二
value[i] = 650
if (upflag[i] >= 3 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] >= 3) or (
upflag[i] == 2 and downflag[i] == 1) or (upflag[i] == 1 and downflag[i] == 2): # 眠二
value[i] = 150
if (upflag[i] == -1 and downflag[i] == -1) or (upflag[i] == 1 and downflag[i] == 1) or (
upflag[i] == -1 and downflag[i] == 2) or (upflag[i] == 2 and downflag[i] == -1): # 死二
value[i] = -50
else:
if (upflag[i] >= 3 and downflag[i] >= 2) or (upflag[i] >= 2 and downflag[i] >= 3): # 活一
value[i] = 50
if (upflag[i] == 2 and downflag[i] == 2) or (upflag[i] == 1 and downflag[i] == 3) or (
upflag[i] == 3 and downflag[i] == 1): # 眠一
value[i] = 10
if (upflag[i] <= 1 and downflag[i] <= 2) or (upflag[i] <= 2 and downflag[i] <= 1) or (
upflag[i] <= 3 and downflag[i] == -1) or (upflag[i] == -1 and downflag[i] <= 3): # 死三
value[i] = -50
for i in range(4):
sum += value[i]
value[i] = 0
upcount[i] = 0
downcount[i] = 0
upflag[i] = 0
downflag[i] = 0
self.ChessData[x][y]['Cstate'] = 0
return sum
def return_chess(self,Depth, computercolor):
time.sleep(0.5)
self.New_count = 0
self.Max_Score = 0
self.Counts = 0
pos = [[0 for y in range(2)] for x in range(10)]
evaFLAG = 0
position = [0, 0] # 初始化位置坐标数组
for i in range(8 - Depth,11+Depth):
for j in range(8 - Depth, 11+Depth):
if 0<=i<19 and 0<=j<19:
if self.ChessData[i][j]['Cstate'] == 0:
self.Score[i][j] = self.count_Score(i, j, computercolor)
self.New_count += 1
if self.Score[i][j]>0:
self.Counts += 1
if self.Max_Score < self.Score[i][j]:
self.Max_Score = self.Score[i][j] # 记录当前棋盘分数的最大值
for i in range(8 - Depth,11+Depth):
for j in range(8 - Depth,11+Depth):
if i<19 and j<19 and self.Score[i][j] == self.Max_Score and self.ChessData[i][j]['Cstate'] == 0:
pos[evaFLAG][0] = i
pos[evaFLAG][1] = j
evaFLAG +=1
m = random.randint(0, evaFLAG-1)
position[0] = pos[m][0]
position[1] = pos[m][1]
return position
def player_location(self, playerx, playery, canvas, blackch, whitech):
if 0 <= playerx <= 706 and 0 <= playery <= 640:
m = (playerx - 40) / 37
n = (playery - 21) / 34
intm = int(m)
intn = int(n)
if m - intm >= 0.5 or m - intm <= -0.5:
pointi = intm + 1
else:
pointi = intm
if n - intn >= 0.5 or n - intn <= -0.5:
pointj = intn + 1
else:
pointj = intn
print(pointi, pointj)
if 0 <= pointi <= 18 and 0 <= pointj <= 18:
print("1:%d" % self.Currently_step)
return self.make_move(pointi, pointj, canvas, blackch, whitech)
print("2:%d" % self.Currently_step)
return False
def make_move(self, pointi, pointj, canvas, blackch, whitech):
if self.ChessData[pointi][pointj]['Cstate'] == 0 and self.myColor == 2 and self.Currently_step % 2 == 0:
Chessimgx = pointi * 36.8 + 41
Chessimgy = pointj * 34.3 + 20
oval = canvas.create_image(Chessimgx - 14, Chessimgy, image=blackch, anchor=W)
self.Chessimg[pointi][pointj] = oval
self.ChessData[pointi][pointj]['Cstate'] = 2
xregretFLAG[self.Currently_step] = pointi
yregretFLAG[self.Currently_step] = pointj
self.player = 0 # 玩家下棋标志置0
self.computer = 1 # 电脑下棋标志置1
self.Currently_step += 1
self.ChessData[pointi][pointj]['Cstep'] = self.Currently_step
a = max(abs(pointi - 9), abs(pointj - 9))
self.Depth = max(self.Depth, a)
return True
elif (self.ChessData[pointi][pointj]['Cstate'] == 0 and self.myColor == 1 and self.Currently_step % 2 != 0) or \
(self.ChessData[pointi][pointj][
'Cstate'] == 0 and self.player2color == 1 and self.Currently_step % 2 != 0):
Chessimgx = pointi * 36.8 + 41
Chessimgy = pointj * 34.6 + 20
oval = canvas.create_image(Chessimgx - 14, Chessimgy, image=whitech, anchor=W)
self.Chessimg[pointi][pointj] = oval
self.ChessData[pointi][pointj]['Cstate'] = 1
xregretFLAG[self.Currently_step] = pointi
yregretFLAG[self.Currently_step] = pointj
self.Currently_step += 1
self.player = 0
self.computer = 1
self.ChessData[pointi][pointj]['Cstep'] = self.Currently_step
a = max(abs(pointi - 9), abs(pointj - 9))
self.Depth = max(self.Depth, a)
return True
elif self.ChessData[pointi][pointj]['Cstate'] != 0:
return False
def get_direction_Score(self, y, x, y_offset, x_offset):
nowcount = 0 # 落子处我方连续子数
_nowcount = 0 # 落子处对方连续子数
space = None # 我方连续子中有无空格
_space = None # 对方连续子中有无空格
both = 0 # 我方连续子两端有无阻挡
_both = 0 # 对方连续子两端有无阻挡
tmp_x = x
tmp_y = y
# 如果是 2 表示是边上是我方子1 表示敌方子
if 0 <= y + y_offset <= 18 and 0 <= x + x_offset <= 18:
Cflag = self.ChessData[y + y_offset][x + x_offset]['Cstate']
if Cflag != 0:
for step in range(1, 6):
x += x_offset
y += y_offset
if 0 <= x < 18 and 0 <= y < 18:
if Cflag == 2:
if self.ChessData[y][x]['Cstate'] == 2 and self.myColor == 2: #) or (self.ChessData[y][x]['Cstate'] == 1 and self.myColor == 1)
nowcount += 1
if space is False:
space = True
elif self.ChessData[y][x]['Cstate'] == 1 and self.myColor == 2: #) or (self.ChessData[y][x]['Cstate'] == 1 and self.myColor == 1)
_both += 1
break
else:
if space is None:
space = False
else:
break # 遇到第二个空格退出
elif Cflag == 1:
if self.ChessData[y][x]['Cstate'] == 2 and self.myColor == 1:
_both += 1
break
elif self.ChessData[y][x]['Cstate'] == 1 and self.myColor == 1:
_nowcount += 1
if _space is False:
_space = True
else:
if _space is None:
_space = False
else:
break
else:
# 遇到边也就是阻挡
if Cflag == 2:
both += 1
elif Cflag == 1:
_both += 1
if space is False:
space = None
if _space is False:
_space = None
x = tmp_x
y = tmp_y
if 0 <= y - y_offset <= 18 and 0 <= x - x_offset <= 18:
_flag = self.ChessData[y - y_offset][x - x_offset]['Cstate']
if _flag != 0:
for step in range(1, 6):
x -= x_offset
y -= y_offset
if 0 <= x < 18 and 0 <= y < 18:
if _flag == 2:
if self.ChessData[y][x]['Cstate'] == 2 and self.myColor ==2:
nowcount += 1
if space is False:
space = True
elif self.ChessData[y][x]['Cstate'] == 1 and self.myColor ==2:
_both += 1
break
else:
if space is None:
space = False
else:
break # 遇到第二个空格退出
elif _flag == 1:
if self.ChessData[y][x]['Cstate'] == 2 and self.myColor ==1:
_both += 1
break
elif self.ChessData[y][x]['Cstate'] == 1 and self.myColor ==1:
_nowcount += 1
if _space is False:
_space = True
else:
if _space is None:
_space = False
else:
break
else:
# 遇到边也就是阻挡
if _flag == 1:
both += 1
elif _flag == 2:
_both += 1
Score = 0
if nowcount == 4:
Score = 10000
elif _nowcount == 4:
Score = 9000
elif nowcount == 3:
if both == 0:
Score = 1000
elif both == 1:
Score = 100
else:
Score = 0
elif _nowcount == 3:
if _both == 0:
Score = 900
elif _both == 1:
Score = 90
else:
Score = 0
elif nowcount == 2:
if both == 0:
Score = 100
elif both == 1:
Score = 10
else:
Score = 0
elif _nowcount == 2:
if _both == 0:
Score = 90
elif _both == 1:
Score = 9
else:
Score = 0
elif nowcount == 1:
Score = 10
elif _nowcount == 1:
Score = 9
else:
Score = 0
if space or _space:
Score /= 2
return Score
def get_point_Score(self, y, x):
Score = 0
offset = [(1, 0), (0, 1), (1, 1), (1, -1)]
for os in offset:
Score += self.get_direction_Score(y, x, os[0], os[1])
return Score
def atuoactive(self):
_Score = 0
position = [-1 for x in range(2)]
for i in range(0, 18):
for j in range(0, 18):
if self.ChessData[i][j]['Cstate'] == 0:
Score = self.get_point_Score(i,j)
if Score > _Score:
position[0] = i
position[1] = j
_Score = Score
elif Score == _Score:
r = random.randint(0, 100)
if r % 2 == 0:
position[0] = i
position[1] = j
return position
def ai_location(self, canvas, blackch,whitech):
if self.Depth >= 9:
self.Depth = 8
position = self.return_chess(self.Depth,self.computercolor) #调用估值函数
# position = self.atuoactive()
if self.ChessData[position[0]][position[1]]['Cstate'] == 0:
print("3:%d"%self.Currently_step)
if self.computercolor == 2 and self.Currently_step %2 ==0:
self.ChessData[position[0]][position[1]]['Cstate'] = 2
oval = canvas.create_image(position[0]* 36.8 + 41 - 14, position[1]* 34.6 + 20, image=blackch, anchor=W)
self.Chessimg[position[0]][position[1]] = oval
self.ChessData[position[0]][position[1]]['Cstep']= self.Currently_step
elif self.computercolor==1 and self.Currently_step %2 !=0:
self.ChessData[position[0]][position[1]]['Cstate'] = 1
oval = canvas.create_image(position[0]* 36.8 + 41 - 14, position[1]* 34.6 + 20, image=whitech, anchor=W)
self.Chessimg[position[0]][position[1]] = oval
self.ChessData[position[0]][position[1]]['Cstep']= self.Currently_step
xregretFLAG[self.Currently_step] = position[0]
yregretFLAG[self.Currently_step] = position[1]
self.player = 1 # 玩家下棋标志置0
self.computer = 0 # 电脑下棋标志置1
self.Currently_step += 1
self.ChessData[position[0]][position[1]]['Cstep']= self.Currently_step
a = max(abs(position[0] - 9), abs(position[1] - 9)) #计算该点到中心的最大的距离
self.Depth = max(self.Depth, a) #不断更新Depth的值
print("4:%d" % self.Currently_step)
def ChessCheck(self):
for x in range(15):# 1.判断x-轴是否连续五子
for y in range(19):
if self.ChessData[x][y]['Cstate'] == 1 and self.ChessData[x + 1][y]['Cstate'] == 1 and self.ChessData[x + 2][y]['Cstate'] == 1 and self.ChessData[x + 3][y]['Cstate'] == 1 and self.ChessData[x + 4][y]['Cstate'] == 1:
self.WinFLAG = 1
return 1
if self.ChessData[x][y]['Cstate'] == 2 and self.ChessData[x + 1][y]['Cstate'] == 2 and self.ChessData[x + 2][y]['Cstate'] == 2 and self.ChessData[x + 3][y]['Cstate'] == 2 and self.ChessData[x + 4][y]['Cstate'] == 2:
self.WinFLAG = 1
return 2
# 2.判断y-轴是否连续五子
for x in range(19):
for y in range(15):
if self.ChessData[x][y]['Cstate'] == 1 and self.ChessData[x][y + 1]['Cstate'] == 1 and self.ChessData[x][y + 2]['Cstate'] == 1 and self.ChessData[x][y + 3]['Cstate'] == 1 and self.ChessData[x][y + 4]['Cstate'] == 1:
self.WinFLAG = 1
return 1
if self.ChessData[x][y]['Cstate'] == 2 and self.ChessData[x][y + 1]['Cstate'] == 2 and self.ChessData[x][y + 2]['Cstate'] == 2 and self.ChessData[x][y + 3]['Cstate'] == 2 and self.ChessData[x][y + 4]['Cstate'] == 2:
self.WinFLAG = 1
return 2
# 3.判断右上-左下是否连续五子
for x in range(15):
for y in range(4,19):
if self.ChessData[x][y]['Cstate'] == 1 and self.ChessData[x + 1][y - 1]['Cstate'] == 1 and self.ChessData[x + 2][y - 2]['Cstate'] == 1 and self.ChessData[x + 3][y - 3]['Cstate'] == 1 and self.ChessData[x + 4][y - 4]['Cstate'] == 1:
self.WinFLAG = 1
return 1
if self.ChessData[x][y]['Cstate'] == 2 and self.ChessData[x + 1][y - 1]['Cstate'] == 2 and self.ChessData[x + 2][y - 2]['Cstate']== 2 and self.ChessData[x + 3][y - 3]['Cstate'] == 2 and self.ChessData[x + 4][y - 4]['Cstate'] == 2:
self.WinFLAG = 1
return 2
# 4.判断左上-右下是否连续五子
for x in range(15):
for y in range(15):
if self.ChessData[x][y]['Cstate'] == 1 and self.ChessData[x + 1][y + 1]['Cstate'] == 1 and self.ChessData[x + 2][y + 2]['Cstate'] == 1 and self.ChessData[x + 3][y + 3]['Cstate'] == 1 and self.ChessData[x + 4][y + 4]['Cstate'] == 1:
self.WinFLAG = 1
return 1
if self.ChessData[x][y]['Cstate'] == 2 and self.ChessData[x + 1][y + 1]['Cstate'] == 2 and self.ChessData[x + 2][y + 2]['Cstate'] == 2 and self.ChessData[x + 3][y + 3]['Cstate'] == 2 and self.ChessData[x + 4][y + 4]['Cstate'] == 2:
self.WinFLAG = 1
return 2
# 5.判断是否是平局
avanum = 0
for x in range(19):
for y in range(19):
if self.ChessData[x][y]['Cstate'] == 0: # 判断棋盘中是否有空位,有空位则非平局
break
elif self.ChessData[x][y]['Cstate'] != 0:
avanum +=1
if avanum == 365:
return 3
def resultshow(self,root,canvas,whitech,blackch):
global photo,text
if self.WinFLAG == 1:
if self.myColor == 1 and self.Gameover == 1 and self.computercolor == 2:
photo=canvas.create_image(800, 300, image=whitech, anchor=W)
text=canvas.create_text(850, 300, text='玩家 胜利', font='Arial,10', fill='#AE0000',anchor=W)
elif self.myColor == 2 and self.Gameover == 2 and self.computercolor == 1:
photo = canvas.create_image(800, 300, image=blackch, anchor=W)
text = canvas.create_text(850, 300, text='玩家 胜利', font='Arial,10', fill='#AE0000', anchor=W)
elif self.myColor == 2 and self.Gameover == 1 and self.computercolor == 1:
photo=canvas.create_image(800, 300, image=whitech, anchor=W)
text=canvas.create_text(850, 300, text='电脑 胜利', font='Arial,10', fill='#AE0000',anchor=W)
elif self.myColor == 1 and self.Gameover == 2 and self.computercolor == 2:
photo = canvas.create_image(800, 300, image=blackch, anchor=W)
text = canvas.create_text(850, 300, text='电脑 胜利', font='Arial,10', fill='#AE0000', anchor=W)
elif self.myColor == 2 and self.player2color == 1 and self.Gameover == 2:
photo=canvas.create_image(800, 300, image=blackch, anchor=W)
text=canvas.create_text(850, 300, text='玩家1 胜利', font='Arial,10', fill='#AE0000', anchor=W)
elif self.myColor == 1 and self.player2color ==2 and self.Gameover == 2:
photo = canvas.create_image(800, 300, image=whitech, anchor=W)
text = canvas.create_text(850, 300, text='玩家1 胜利', font='Arial,10', fill='#AE0000', anchor=W)
elif self.myColor == 2 and self.player2color == 1 and self.Gameover == 1:
photo=canvas.create_image(800, 300, image=whitech, anchor=W)
text=canvas.create_text(850, 300, text='玩家2 胜利', font='Arial,10', fill='#AE0000',anchor=W)
elif self.myColor == 1 and self.player2color ==2 and self.Gameover == 1:
photo = canvas.create_image(800, 300, image=blackch, anchor=W)
text = canvas.create_text(850, 300, text='玩家2 胜利', font='Arial,10', fill='#AE0000', anchor=W)
elif self.Gameover != 1 or self.Gameover != 2 or self.Gameover != 3 :
canvas.delete(photo)
canvas.delete(text)
elif self.Gameover == 3 and self.WinFLAG == 0 :
canvas.create_text(850, 300, text='平 局', font='Arial,10', fill='#AE0000',anchor=W)
def curlocation(self, canvas, player, computer, Current_Player, blackch, whitech, photos1, photos2):
text_options = {'fill': 'white', 'font': 'Arial,9', 'anchor': W}
image_positions = [(750, 145), (870, 145)]
if player == 1 and computer == 0:
if Current_Player == 1:
image_data = [(blackch, '玩家'),(whitech, '电脑')]
else:
image_data = [(whitech, '玩家'),(blackch, '电脑')]
elif player == 0 and computer == 1:
if Current_Player == 1:
image_data = [(blackch, '玩家'),(whitech, '电脑')]
else:
image_data = [(whitech, '玩家'),(blackch, '电脑')]
elif player == 1 and computer == 1:
image_data = [(blackch, '玩家1'),(whitech, '玩家2')]
else:
image_data = [(blackch, '玩家1'),(whitech, '玩家2')]
for i, (image, text) in enumerate(image_data):
canvas.create_image(*image_positions[i], image=photos1, anchor=W)
canvas.create_image(*image_positions[i], image=image, anchor=W)
canvas.create_text(image_positions[i][0] + 50, 150, text=text, **text_options)
canvas.update()
def clear_location(self, canvas):
image_positions = [(750, 145), (870, 145)]
# Delete images and texts at specified positions
for position in image_positions:
canvas.delete(canvas.find_closest(*position))
canvas.delete(canvas.find_closest(position[0] + 50, 150))
canvas.update()
def playing(self,Chess_Mode,root,canvas,blackch,whitech,photos1,photos2):
if Chess_Mode == 1:
self.myColor = 2 # 玩家选择的棋子颜色 黑
self.computercolor = 1 # 电脑的棋子颜色 白
self.player = 1
self.computer = 0
self.WinFLAG = 0
self.curlocation(canvas, 1, 0,1,blackch,whitech,photos1,photos2)
elif Chess_Mode ==2:
self.myColor = 1 # 玩家选择的棋子颜色
self.computercolor = 2 # 电脑的棋子颜色
self.ChessData[9][9]['Cstate'] = 2
oval = canvas.create_image(9 * 36.8 + 41 - 14, 9 * 34.6 + 20, image=blackch, anchor=W)
self.Chessimg[9][9] = oval
xregretFLAG[self.Currently_step] = 9
yregretFLAG[self.Currently_step] = 9
self.player = 1 # 玩家下棋标志置0
self.computer = 0 # 电脑下棋标志置1
self.Currently_step += 1
self.WinFLAG = 0
self.ChessData[9][9]['Cstep'] = self.Currently_step
a = max(abs(9 - 9), abs(9 - 9)) # 计算该点到中心的最大的距离
self.Depth = max(self.Depth, a) # 不断更新Depth的值
self.curlocation(canvas, 1, 0,2,blackch,whitech,photos1,photos2)
elif Chess_Mode ==0:
self.myColor = 2 # 先手玩家选择的棋子颜色
self.player2color = 1 # 后手玩家选择的棋子颜色
self.player = 1
self.player2 = 0
self.WinFLAG = 0
self.curlocation(canvas, 1, 1,1,blackch,whitech,photos1,photos2)
def playgame_black(self,root,playerx,playery,canvas, blackch,whitech,result,photos1,photos2):
if self.WinFLAG == 0 and self.player == 1 and self.computer == 0 and self.Currently_step % 2==0:
if self.player_location(playerx,playery,canvas, blackch,whitech):
if self.Ovalone != 0:
canvas.delete(self.Ovalone)
self.curlocation(canvas, 0, 1,2,blackch,whitech,photos1,photos2)
self.Gameover = self.ChessCheck()
root.update()
if self.WinFLAG == 0 and self.player == 0 and self.computer == 1 and self.Currently_step % 2!=0 :
root.update()
self.ai_location(canvas, blackch,whitech)
self.Gameover = self.ChessCheck()
self.curlocation(canvas,1,0,1, blackch,whitech,photos1,photos2)
root.update()
if self.WinFLAG == 1:
self.resultshow(root,canvas,whitech,blackch)
root.update()
def playgame_white(self,root,playerx,playery,canvas, blackch,whitech,result,photos1,photos2):
if self.WinFLAG == 0 and self.player == 1 and self.computer == 0:
if self.player_location(playerx, playery, canvas, blackch,whitech) :
if self.Ovalone != 0:
canvas.delete(self.Ovalone)
self.curlocation(canvas, 0, 1,1, blackch,whitech,photos1,photos2)
self.Gameover = self.ChessCheck()
if self.WinFLAG == 0 and self.player == 0 and self.computer == 1:
root.update()
self.ai_location(canvas,blackch,whitech)
self.curlocation(canvas, 1, 0,2, blackch,whitech,photos1,photos2)
self.Gameover = self.ChessCheck()
if self.WinFLAG == 1:
self.resultshow(root,canvas,whitech,blackch)
root.update()
def doublepeople(self,root,playerx,playery,canvas,blackch,whitech,result,photos1,photos2):
if self.WinFLAG ==0:
if self.player == 1 and self.player2 == 0 and self.Currently_step % 2 ==0 :
if self.player_location(playerx, playery, canvas, blackch,whitech) :
if self.Ovalone != 0:
canvas.delete(self.Ovalone)
self.player2 = 1
self.Gameover = self.ChessCheck()
self.curlocation(canvas, 0, 0,2, blackch,whitech,photos1,photos2)
if self.WinFLAG == 1:
self.resultshow(root,canvas,whitech,blackch)
root.update()
elif self.player2 == 1 and self.player == 0 and self.Currently_step % 2 !=0 :
if self.player_location(playerx, playery, canvas, blackch,whitech):
if self.Ovalone != 0:
canvas.delete(self.Ovalone)
self.player = 1
self.player2 = 0
self.curlocation(canvas, 1, 1,1, blackch,whitech,photos1,photos2)
self.Gameover = self.ChessCheck()
if self.WinFLAG ==1:
self.resultshow(root,canvas,whitech,blackch)
root.update()

@ -0,0 +1,556 @@
from tkinter import *
import tkinter.messagebox
from chess import *
from PIL import Image,ImageTk
from datetime import datetime
import time
import numpy as np
chess = Chess()
crossline = []
verline = []
regretnum = 0
handlenum = 0
root = Tk() # 窗口对象
root.title('五子棋') # 窗口标题
root.geometry('1000x700+10+10') # 窗口大小 width x height + x + yx,y为在当前界面的坐标
# 创建一个主目录菜单,也被称为顶级菜单
main_menu = Menu (root)
gamefile = Menu (main_menu, tearoff=False)
#新增"文件"菜单的菜单项,并使用 accelerator 设置菜单项的快捷键
# gamefile.add_command (label="新建",command=menuCommand,accelerator="Ctrl+N")
def peocomwhite():
if chess.Chess_Mode == 3:
chess.Chess_Mode = 1
chess.playing(1,root,canvas,blackch,whitech,photos1,photos2)
else:
chess.Chess_Mode = 1
refresh()
def peocomblack():
if chess.Chess_Mode == 3:
chess.Chess_Mode = 2
chess.playing(2,root,canvas,blackch,whitech,photos1,photos2)
else:
chess.Chess_Mode = 2
refresh()
def doublepeople():
if chess.Chess_Mode == 3:
chess.Chess_Mode = 0
chess.playing(0,root,canvas,blackch,whitech,photos1,photos2)
else:
chess.Chess_Mode = 0
refresh()
def startgame():
win = Tk()
win.title("开始游戏")
win.geometry('500x300+100+100')
Label(win, text="五子棋", width=120, height=2).place(x=-175, y=50)
Button(win, text="人机模式(机白)", command=peocomwhite, width=20, height=2).place(x=170, y=100)
Button(win, text="人机模式(机黑)", command=peocomblack, width=20, height=2).place(x=170, y=150)
Button(win, text="双人模式", command=doublepeople, width=20, height=2).place(x=170, y=200)
def quitgame():
pass
def savecurrent():
data = [[0 for j in range(19)] for i in range(19)]
file = open('data.txt', 'r+')
file.truncate(0)
for i in range(0, 19):
for j in range(0, 19):
data[i][j] = chess.ChessData[i][j]['Cstate']
data = np.mat(data)
b = ''
for i in range(0, 19):
for j in range(0, 19):
b += str(data[i, j]) + '\t'
b += '\n'
file.writelines(b)
print(data)
data1 = [[0 for j in range(19)] for i in range(19)]
for i in range(0, 19):
for j in range(0, 19):
data1[i][j] = chess.ChessData[i][j]['Cstep']
data = np.mat(data1)
b = ''
for i in range(0, 19):
for j in range(0, 19):
b += str(data[i, j]) + '\t'
b += '\n'
file.writelines(b)
print(data)
Chess_Mode = str(chess.Chess_Mode) + '\n'
file.write(Chess_Mode)
step = str(chess.Currently_step) + '\n'
file.write(step)
WinFLAG = str(chess.WinFLAG) + '\n'
file.write(WinFLAG)
file.close()
def resetlast():
refresh()
file = open('data.txt', 'r+', encoding='utf-8')
data = file.readlines()
rtu = []
for i in data:
rtu.append(i.strip())
for i in range(0,19):
j = 0
rtu1 = rtu[i].split("\t")
for x in rtu1:
chess.ChessData[i][j]['Cstate']=int(x)
j+=1
for i in range(19, 38):
j = 0
rtu1 = rtu[i].split("\t")
for x in rtu1:
chess.ChessData[i-19][j]['Cstep'] = int(x)
j += 1
chess.Chess_Mode = int(rtu[len(rtu)-3])
chess.Currently_step = int(rtu[len(rtu) - 2])
chess.WinFLAG = int(rtu[len(rtu) - 1])
file.close()
for x in range(19):
for y in range(19):
if chess.ChessData[x][y]['Cstate'] == 1:
chess.Chessimg[x][y]=canvas.create_image(x* 36.8 + 41- 14, y* 34.6 + 21, image=whitech, anchor=W)
# canvas.create_oval(x*34.2+40-12.5, y*34.2+30-13.5, x*34.2+40+12.5, y*34.2+30+13.5, fill='#fff',
# outline="")
elif chess.ChessData[x][y]['Cstate'] == 2:
chess.Chessimg[x][y]=canvas.create_image(x* 36.8 + 41- 14, y* 34.6 + 21, image=blackch, anchor=W)
# canvas.create_oval(x*34.2+40-12.5, y*34.2+30-13.5, x*34.2+40+12.5, y*34.2+30+13.5, fill='#000',
# outline="")
if chess.Chess_Mode == 1 and chess.WinFLAG ==0 :
chess.myColor = 2
chess.computercolor = 1
if chess.Currently_step % 2 ==0:
chess.player = 1
chess.computer = 0
chess.curlocation(canvas,1,0,1, blackch,whitech,photos1,photos2)
tkinter.messagebox.showinfo(title='信息提示!', message='轮到玩家下棋了!')
elif chess.Currently_step % 2 !=0:
chess.player = 0
chess.computer = 1
chess.playgame_black(root,None,None,canvas, blackch,whitech,result,photos1,photos2)
elif chess.Chess_Mode == 2 and chess.WinFLAG ==0 :
chess.myColor = 1
chess.computercolor = 2
if chess.Currently_step % 2 == 0:
chess.player = 0
chess.computer = 1
chess.playgame_white(root, None, None, canvas, blackch,whitech,result,photos1,photos2)
elif chess.Currently_step % 2 != 0:
chess.player = 1
chess.computer = 0
chess.curlocation(canvas, 1, 0,2,blackch,whitech,photos1,photos2)
tkinter.messagebox.showinfo(title='信息提示!', message='轮到玩家下棋了!')
elif chess.Chess_Mode == 0 and chess.WinFLAG ==0 :
chess.myColor = 2
chess.player2color = 1
if chess.Currently_step % 2 == 0:
chess.player = 1
chess.player2 = 0
chess.curlocation(canvas, 1, 1,1,blackch,whitech,photos1,photos2)
# chess.playgame_black(root, None, None, canvas)
tkinter.messagebox.showinfo(title='信息提示!', message='轮到先手下棋了!')
elif chess.Currently_step % 2 != 0:
chess.player = 0
chess.player2 = 1
chess.curlocation(canvas, 0, 0,2,blackch,whitech,photos1,photos2)
tkinter.messagebox.showinfo(title='信息提示!', message='轮到后手下棋了!')
elif chess.WinFLAG ==1 :
tkinter.messagebox.showinfo(title='信息提示!', message='对局已经结束了')
gamefile.add_command (label="开始游戏",command=startgame)
# gamefile.add_command (label="暂停游戏",command=quitgame)
gamefile.add_command (label="保存当前局面",command=savecurrent, accelerator="Ctrl+O")
gamefile.add_command (label="重装以前局面",command=resetlast, accelerator="Ctrl+S")
main_menu.add_cascade (label="游戏",menu=gamefile)#在主目录菜单上新增"文件"选项并通过menu参数与下拉菜单绑定
def helpgame():
msg ='''1、对局双方各执一色棋子。
2空棋盘开局
3黑棋虽先行但有禁手黑方不能在一步之内形成两个活三活四或一步之内形成长连指一步形成超过五子连珠白方自由无禁手
4棋子下在棋盘的空白点上棋子下定后不得向其它点移动不得从棋盘上拿掉或拿起另落别处
5黑方的第一枚棋子可下在棋盘任意交叉点上'''
tkinter.messagebox.showinfo(title='游戏规则', message=msg)
helpfile = main_menu.add_command(label="帮助",command=helpgame)
root.config (menu=main_menu)
#棋盘背景画面
canvas = Canvas(root,bg='white',width=1000,height=800)
photoImg = Image.open("image/背景.png").resize((1000, 800))
imgbg = ImageTk.PhotoImage(photoImg)
canvas.create_image(0, 330, image = imgbg,anchor=W)
photoqizi=Image.open("image/棋盘-空.png").resize((730,700))
photoqizi=ImageTk.PhotoImage(photoqizi)
canvas.create_image(10,350,image=photoqizi,anchor=W)
def cross():
for i in range(19):#横线
point = [[40, 37], [706, 37]]
point[0][1] = 21 + i * 34.3
point[1][1] = 21 + i * 34.3
if i==0 or i==18:
canvas.create_line(point, fill="#C18B5F", width=2.5)
canvas.create_line(point, fill="#C18B5F", width=1.5)
for i in range(19):#竖线
point = [[41, 21], [41, 640]]
point[0][0] = 41 + i * 37
point[1][0] = 41 + i * 37
if i==0 or i==18:
canvas.create_line(point, fill="#C18B5F", width=2.5)
canvas.create_line(point, fill="#C18B5F", width=1.5)
for x in (4, 9, 14):
for y in (4, 9, 14):
if x == y == 9:
radius = 9
else:
radius = 6
canvas.create_oval(x * 36.9 + 41 - radius / 2,
y * 34.3 + 21 - radius / 2,
x * 36.9 + 41 + radius / 2,
y * 34.3 + 21 + radius / 2,
fill='#BE875E',outline="")
cross()
canvas.place(x=0, y=0)
#鼠标左击落子事件定义
class Player:
def PointNextMove(chessData):
global playerx,playery
playerx = float(format(chessData.x))
playery = float(format(chessData.y))
if chess.player == 1:
if chess.myColor == 2 and chess.computercolor == 1 :
chess.playgame_black(root,playerx,playery,canvas, blackch,whitech,result,photos1,photos2)
if chess.myColor == 1 and chess.computercolor == 2 :
chess.playgame_white(root,playerx,playery,canvas, blackch,whitech,result,photos1,photos2)
if chess.myColor == 2 and chess.player2color ==1 :
chess.doublepeople(root, playerx, playery, canvas, blackch,whitech,result,photos1,photos2)
print('鼠标左键单机位置(相对于父容器):{0},{1}'.format(chessData.x, chessData.y))
print('鼠标左键单击位置(相对于屏幕):{0},{1}'.format(chessData.x_root, chessData.y_root))
# canvas.bind('<Motion>',handleMotion)
canvas.bind('<Button-1>', PointNextMove)
class HumanPlayer(Player):
def NextMove(self):
chess.player_location()
class RobotPlayer(Player):
def NextMove(self):
chess.ai_location()
# 图片创建
blackch = Image.open("image/黑子-小.png").resize((40, 40))
blackch = ImageTk.PhotoImage(blackch)
whitech = Image.open("image/白子-小.png").resize((40, 40))
whitech = ImageTk.PhotoImage(whitech)
result = Image.open("image/resultshow.PNG").resize((100, 42))
result = ImageTk.PhotoImage(result)
photos1=Image.open("image/上方button-选中.png").resize((110,45))
photos1=ImageTk.PhotoImage(photos1)
photos2=Image.open("image/上方button-未选中.png").resize((110,45))
photos2=ImageTk.PhotoImage(photos2)
#棋盘
# photoqizi=Image.open("image/棋盘-空.png").resize((730,700))
# photoqizi=ImageTk.PhotoImage(photoqizi)
# canvas.create_image(10,350,image=photoqizi,anchor=W)
#当前落子方
# photocur = Image.open("image/当前落子方背景.png").resize((100, 30))
# photocur = ImageTk.PhotoImage(photocur)
# canvas.create_image(720, 40, image = photocur,anchor=W)
canvas.create_text(800,90,text='当前落子方',font='Arial,10',fill='white')
# lab_name = Label(root, text="当前落子方", font='Arial,10',fg='white',image=photocur,compound=CENTER)
# lab_name.place(x=630, y=85, width=100, height=30)
#当前落子方跳选框
canvas.create_image(750,145,image=photos2,anchor=W)
canvas.create_image(870,145,image=photos2,anchor=W)
#胜负判定
photoresult = Image.open("image/胜负判定背景.PNG").resize((100, 30))
photoresult = ImageTk.PhotoImage(photoresult)
# canvas.create_image(630, 200, image = photoresult,anchor=W)
cur_result = Label(root, text='胜负判定', font='Arial,10',fg='white',image=photoresult,compound=CENTER)
cur_result.config(bg='#8B7355')
cur_result.place(x=750, y=190,width=100, height=30)
#公告栏
photonotice=Image.open("image/公告栏.png").resize((230,130))
photonotice=ImageTk.PhotoImage(photonotice)
canvas.create_image(750,300,image=photonotice,anchor=W)
#按钮复盘
def review():
if chess.WinFLAG == 1:
for x in range(19):
for y in range(19):
if chess.ChessData[x][y]['Cstep'] !=0 and chess.ChessData[x][y]['Cstate'] == 2:
reviewnum=Label(root, text=str(chess.ChessData[x][y]['Cstep']),bg='#000',fg ='#fff', font=("黑体", 8), width=1, height=1)
reviewnum.place(x=x*36.8+41-7,y=y*34.6+21-9,anchor = 'nw')
chess.Relabel[x][y] = reviewnum
elif chess.ChessData[x][y]['Cstep'] !=0 and chess.ChessData[x][y]['Cstate'] == 1 :
reviewnum=Label(root, text=str(chess.ChessData[x][y]['Cstep']),bg='#fff',fg ='#000', font=("黑体", 8), width=1, height=1)
reviewnum.place(x=x*36.8+41-7,y=y*34.6+21-9,anchor = 'nw')
chess.Relabel[x][y] = reviewnum
elif chess.WinFLAG == 0:
tkinter.messagebox.showinfo(title='信息提示!', message='对局结束后才能复盘噢!')
chess.ifreview = 1
root.update()
photoreview = Image.open("image/复盘.png").resize((100, 50))
photoreview = ImageTk.PhotoImage(photoreview)
# canvas.create_image(720, 300, image = photoresult,anchor=W)
btn_review = Button(root, text='复盘', font='Arial,12', width=85, height=35,
image=photoreview, command=review,bd=0)
# btn_review["bg"] =
# btn_review["border"] = "0"
btn_review.place(x=750,y=400)
# 按钮悔棋
def regretch():
if chess.WinFLAG == 0:
global regretnum
regretnum = 1
if chess.Currently_step == 1 and chess.Chess_Mode ==2:
regretxFLAG = xregretFLAG[chess.Currently_step - regretnum]
regretyFLAG = yregretFLAG[chess.Currently_step - regretnum]
canvas.delete(chess.Chessimg[regretxFLAG][regretyFLAG])
chess.ChessData[regretxFLAG][regretyFLAG]['Cstate'] = 0
chess.ChessData[regretxFLAG][regretyFLAG]['Cstep'] = 0
chess.Currently_step -= 1
chess.playing( 2, root, canvas)
if chess.Chess_Mode == 1 or chess.Chess_Mode == 2 :
print(xregretFLAG)
print(yregretFLAG)
for i in range(2):
regretxFLAG = xregretFLAG[chess.Currently_step-regretnum]
regretyFLAG = yregretFLAG[chess.Currently_step-regretnum]
canvas.delete(chess.Chessimg[regretxFLAG][regretyFLAG])
chess.ChessData[regretxFLAG][regretyFLAG]['Cstate'] = 0
chess.ChessData[regretxFLAG][regretyFLAG]['Cstep'] = 0
chess.Currently_step -= 1
chess.curlocation(canvas, 1, 0,1,blackch,whitech,photos1,photos2)
if chess.Chess_Mode == 0:
regretxFLAG = xregretFLAG[chess.Currently_step - regretnum]
regretyFLAG = yregretFLAG[chess.Currently_step - regretnum]
canvas.delete(chess.Chessimg[regretxFLAG][regretyFLAG])
chess.ChessData[regretxFLAG][regretyFLAG]['Cstate'] = 0
chess.ChessData[regretxFLAG][regretyFLAG]['Cstep'] = 0
chess.Currently_step -= 1
if chess.Currently_step % 2 == 0:
chess.player = 1
chess.player2 = 0
chess.curlocation(canvas, 1, 1,1)
elif chess.Currently_step % 2 != 0:
chess.player = 0
chess.player2 = 1
chess.curlocation(canvas, 0, 0,2)
elif chess.WinFLAG == 1 :
tkinter.messagebox.showinfo(title='信息提示!', message='对局已经结束了!')
root.update()
# else:
# tkinter.messagebox.showinfo(title='信息提示!', message='只能悔一次棋!')
photoregretch = Image.open("image/悔棋.png").resize((100, 50))
photoregretch = ImageTk.PhotoImage(photoregretch)
btn_regret = Button(root, text='悔棋', font='Arial,12', width=85, height=35,
image=photoregretch, command=regretch,bd=0)
btn_regret.place(x=850, y=400)
# 按钮撤销复盘
def concelreview():
if chess.WinFLAG == 1:
chess.showHistory=True
for x in range(19):
for y in range(19):
if chess.ChessData[x][y]['Cstep'] !=0 and chess.Relabel[x][y]!=0:
chess.Relabel[x][y].destroy()
chess.Relabel[x][y]=0
elif chess.WinFLAG == 0:
chess.showHistory=False
tkinter.messagebox.showinfo(title='信息提示!', message='在复盘后使用噢!')
root.update()
photoconcel = Image.open("image/撤销复盘.png").resize((100, 50))
photoconcel = ImageTk.PhotoImage(photoconcel)
btn_concel = Button(root, text='撤销复盘', font='Arial,12', width=85, height=35, image=photoconcel,
command=concelreview,bd=0)
btn_concel.place(x=750, y=460)
# 按钮落子建议
def suggestion():
if chess.WinFLAG!=1:
if chess.Depth >= 9:
chess.Depth = 8
if chess.Chess_Mode ==1:
color = 2
elif chess.Chess_Mode ==2:
color = 1
elif chess.Chess_Mode ==0:
if chess.player == 1 and chess.player2 == 0 :
color = 2
elif chess.player == 0 and chess.player2 == 1 :
color = 1
pos = chess.return_chess(chess.Depth, color) # 调用估值函数
if chess.ChessData[pos[0]][pos[1]]['Cstate']==0:
if chess.myColor == 1 and chess.computercolor == 2:
Ovalone = canvas.create_oval(pos[0]* 36.8 + 41 - 12.5, pos[1] * 34.6 + 21 - 13.5,
pos[0]* 36.8 + 41 + 12.5, pos[1] * 34.6 + 21 + 13.5,
fill='#fff', outline="#000")
elif chess.myColor == 2 and chess.computercolor ==1:
Ovalone = canvas.create_oval(pos[0] * 36.8 + 41 - 12.5, pos[1] * 34.6 + 21 - 13.5,
pos[0]* 36.8 + 41 + 12.5, pos[1] * 34.6 + 21 + 13.5,
fill='#000', outline="#fff")
elif chess.myColor == 2 and chess.player2color ==1:
if chess.player == 1 and chess.player2 == 0 :
Ovalone = canvas.create_oval(pos[0]* 36.8 + 41-12.5, pos[1] * 34.6 + 21-13.5,pos[0]* 36.8 + 41+12.5,
pos[1] * 34.6 + 21+13.5,fill='#000', outline="#fff")
elif chess.player2 == 1 and chess.player == 0:
Ovalone = canvas.create_oval(pos[0]* 36.8 + 41-12.5, pos[1] * 34.6 + 21-13.5,pos[0]* 36.8 + 41+12.5,
pos[1] * 34.6 + 21+13.5,fill='#fff', outline="#000")
chess.Ovalone = Ovalone
root.update()
else:
pass
photosuggest = Image.open("image/落子.png").resize((100, 50))
photosuggest = ImageTk.PhotoImage(photosuggest)
btn_suggest = Button(root, text='落子建议', font='Arial,12', width=85, height=35,
image=photosuggest, command=suggestion,bd=0)
btn_suggest.place(x=850, y=460)
# 按钮局面评估
def curnow():
if chess.Depth >= 9:
chess.Depth = 8
if chess.Chess_Mode ==1:
color = 2
elif chess.Chess_Mode ==2:
color = 1
chess.return_chess(chess.Depth, color) # 调用估值函数
elif chess.Chess_Mode ==0:
if chess.player == 1 and chess.player2 == 0 :
color = 2
elif chess.player == 0 and chess.player2 == 1 :
color = 1
chess.return_chess(chess.Depth, color) # 调用估值函数
if chess.Counts / chess.New_count == 1:
OwnCounter = random.uniform(0.8, 0.85)
else:
OwnCounter = chess.Counts / chess.New_count
if color == 1:
for x in range(15):
for y in range(19):
if chess.ChessData[x][y]['Cstate'] == 2 and chess.ChessData[x+1][y]['Cstate'] == 2 and chess.ChessData[x+2][y]['Cstate'] == 2 and \
chess.ChessData[x+3][y]['Cstate'] == 2 and chess.ChessData[x+4][y]['Cstate'] == 0 and chess.ChessData[x-1][y]['Cstate'] == 0:
OwnCounter = OwnCounter-0.5
# 2.判断y-轴是否连续四子
for x in range(19):
for y in range(15):
if chess.ChessData[x][y]['Cstate'] == 2 and chess.ChessData[x ][y +1]['Cstate'] == 2 and chess.ChessData[x][y + 2]['Cstate'] == 2 and \
chess.ChessData[x][y + 3]['Cstate'] == 2 and chess.ChessData[x][y + 4]['Cstate'] == 0 and chess.ChessData[x][y-1]['Cstate'] == 0:
OwnCounter = OwnCounter-0.5
# 3.判断右上-左下是否连续四子
for x in range(15):
for y in range(4, 19):
if chess.ChessData[x][y]['Cstate'] == 2 and chess.ChessData[x + 1][y - 1]['Cstate'] == 2 and chess.ChessData[x + 2][y - 2]['Cstate'] == 2 and \
chess.ChessData[x + 3][y - 3]['Cstate'] == 2 and chess.ChessData[x + 4][y- 4]['Cstate'] == 0 and chess.ChessData[x-1][y+1]['Cstate'] == 0:
OwnCounter = OwnCounter-0.5
# 4.判断左上-右下是否连续四子
for x in range(15):
for y in range(15):
if chess.ChessData[x][y]['Cstate'] == 2 and chess.ChessData[x + 1][y + 1]['Cstate'] == 2 and chess.ChessData[x + 2][y + 2]['Cstate'] == 2 and \
chess.ChessData[x + 3][y + 3]['Cstate'] == 2 and chess.ChessData[x + 4][y+4]['Cstate'] == 0 and chess.ChessData[x-1][y-1]['Cstate'] == 0:
OwnCounter = OwnCounter-0.5
elif color ==2 :
for x in range(15):
for y in range(19):
if chess.ChessData[x][y]['Cstate'] == 1 and chess.ChessData[x + 1][y]['Cstate'] == 1 and chess.ChessData[x + 2][y]['Cstate'] == 1 and \
chess.ChessData[x + 3][y]['Cstate'] == 1 and chess.ChessData[x + 4][y]['Cstate'] == 0 and chess.ChessData[x-1][y]['Cstate'] == 0:
OwnCounter = OwnCounter - 0.5
# 2.判断y-轴是否连续四子
for x in range(19):
for y in range(15):
if chess.ChessData[x][y]['Cstate'] == 1 and chess.ChessData[x ][y +1]['Cstate'] == 1 and chess.ChessData[x][y+2]['Cstate'] == 1 and \
chess.ChessData[x][y+3]['Cstate'] == 1 and chess.ChessData[x][y+4]['Cstate'] == 0 and chess.ChessData[x][y-1]['Cstate'] == 0:
OwnCounter = OwnCounter - 0.5
# 3.判断右上-左下是否连续四子
for x in range(15):
for y in range(4, 15):
if chess.ChessData[x][y]['Cstate'] == 1 and chess.ChessData[x+1][y-1]['Cstate'] == 1 and chess.ChessData[x+2][y-2]['Cstate'] == 1 and \
chess.ChessData[x + 3][y - 3]['Cstate'] == 1 and chess.ChessData[x + 4][y- 4]['Cstate'] == 0 and chess.ChessData[x-1][y+1]['Cstate'] == 0:
OwnCounter = OwnCounter - 0.5
# 4.判断左上-右下是否连续四子
for x in range(15):
for y in range(15):
if chess.ChessData[x][y]['Cstate'] == 1 and chess.ChessData[x+1][y+1]['Cstate'] == 1 and chess.ChessData[x+2][y+2]['Cstate'] == 1 and \
chess.ChessData[x+3][y+3]['Cstate'] == 1 and chess.ChessData[x+4][y+4]['Cstate'] == 0 and chess.ChessData[x-1][y-1]['Cstate'] == 0:
OwnCounter = OwnCounter - 0.5
OtherCouter=1-OwnCounter
msg = '当前落子方的胜率为'+str(round(OwnCounter, 4) *100)+'%!\n'+ \
'当前对方的胜率为' + str(round(OtherCouter, 4) * 100) + '%!'
tkinter.messagebox.showinfo(title='信息提示!', message=msg)
photocurnow = Image.open("image/局面评估.png").resize((100, 50))
photocurnow = ImageTk.PhotoImage(photocurnow)
btn_elevalue = Button(root, text='局面评估', font='Arial,12', width=85, height=35, image=photocurnow,
command=curnow,bd=0)
btn_elevalue.place(x=750, y=520)
def start_game_black():
if chess.Chess_Mode == 3:
chess.Chess_Mode = 1
chess.playing(1, root, canvas, blackch, whitech, photos1, photos2)
else:
chess.Chess_Mode = 1
refresh()
root.update()
photostart = Image.open("image/true.jpg").resize((100, 50))
photostart = ImageTk.PhotoImage(photostart)
btn_reset = Button(root, text='人机对战', font='Arial,12', width=85, height=35,image=photostart,
command=peocomwhite,bg='#FFA500',bd=0)
btn_reset.place(x=800,y=580)
# 按钮重新开始
def refresh():
canvas.create_image(750, 145, image=photos2, anchor=W)
canvas.create_image(870, 145, image=photos2, anchor=W)
photoqizi = Image.open("image/棋盘-空.png").resize((730, 700))
photoqizi = ImageTk.PhotoImage(photoqizi)
canvas.create_image(10, 350, image=photoqizi, anchor=W)
cross()
if chess.Ovalone != 0:
canvas.delete(chess.Ovalone)
for x in range(19):
for y in range(19):
if chess.ChessData[x][y]['Cstate'] != 0:
canvas.delete(chess.Chessimg[x][y])
if chess.Relabel[x][y] != 0:
chess.Relabel[x][y].destroy()
chess.ChessData[x][y]['Cstate'] = 0
chess.ChessData[x][y]['Cstep'] = 0
chess.Chessimg[x][y] = 0
chess.Relabel[x][y] = 0
chess.Currently_step = 0
chess.Gameover = 0
chess.Depth = 0
chess.player = 0 # 轮到下棋的标志1=下0=不下
chess.computer = 0 # 轮到下棋的标志1=下0=不下
chess.myColor = 0 # 玩家选择的棋子颜色
chess.computercolor = 0 # 电脑的棋子颜色
chess.player2color = 0 # 玩家2的棋子颜色
if chess.WinFLAG == 1:
chess.resultshow(root,canvas,whitech,blackch)
if chess.Chess_Mode == 1 :
chess.playing(1, root, canvas,blackch,whitech,photos1,photos2)
# chess.curlocation(root, player=1, computer=0,Current_Player=1)
elif chess.Chess_Mode == 2:
chess.playing(2, root, canvas,blackch,whitech,photos1,photos2)
elif chess.Chess_Mode == 0:
chess.playing(0, root, canvas,blackch,whitech,photos1,photos2)
# chess.curlocation(root, player=1, computer=1,Current_Player=2)
if chess.Ovalone != 0:
canvas.delete(chess.Ovalone)
chess.WinFLAG = 0
root.update()
photorefresh = Image.open("image/重新开始.png").resize((100, 50))
photorefresh = ImageTk.PhotoImage(photorefresh)
btn_reset = Button(root, text='重新开始', font='Arial,12', width=85, height=35,
image=photorefresh,command=refresh,bg='#FFA500',bd=0)
btn_reset.place(x=850,y=520)

@ -0,0 +1,41 @@
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 4 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 5 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1
6
0

@ -0,0 +1,15 @@
1 1 1 1 1 1 1 2 2 1 2 1 2 2 1
2 1 2 2 1 1 2 1 1 1 2 1 2 2 1
1 1 2 1 2 1 1 2 1 2 2 1 2 2 2
2 1 1 2 1 2 2 1 2 1 2 1 1 2 1
1 2 1 1 2 2 1 2 2 1 2 2 1 1 2
1 2 1 1 1 2 2 1 1 1 2 1 1 2 1
1 2 1 2 2 1 1 2 1 1 2 1 2 1 2
1 1 2 1 2 1 1 1 2 2 2 2 1 1 1
2 2 2 2 2 2 2 1 1 1 2 2 2 2 1
2 2 2 2 2 2 2 2 1 2 1 1 2 2 1
2 2 2 1 2 1 1 1 2 2 2 1 2 1 2
1 2 2 1 1 1 1 1 1 1 1 1 1 2 2
2 2 2 2 1 1 1 2 2 1 2 2 2 1 1
1 1 2 2 2 1 1 2 2 1 2 2 1 2 2
1 1 1 1 2 2 2 2 1 1 1 1 2 1 2

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 903 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 129 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

@ -0,0 +1,13 @@
# This is a sample Python script.
import chessboard
from chessboard import *
# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
root.mainloop()
# See PyCharm help at https://www.jetbrains.com/help/pycharm/

@ -0,0 +1,17 @@
import random
from PIL import Image,ImageTk
import math
import random
import time
class Chess:
def __init__(self): # 设计五子棋运行的数据结构
self.ChessData = [[{"Cstate": 0, "Cstep": 0} for j in range(19)] for i in range(19)]
def main(self):
i = random.randint(0, 18)
j = random.randint(0, 18)
for color in range(1, 3):
self.ChessData[i][j]['Cstate'] = color
print(self.ChessData[i][j])
if __name__ == '__main__':
chess=Chess()
chess.main()
Loading…
Cancel
Save