diff --git a/chess.py b/chess.py new file mode 100644 index 0000000..7133569 --- /dev/null +++ b/chess.py @@ -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() diff --git a/chessboard.py b/chessboard.py new file mode 100644 index 0000000..6dcb7b0 --- /dev/null +++ b/chessboard.py @@ -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 + y(x,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('',handleMotion) + canvas.bind('', 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) + diff --git a/data.txt b/data.txt new file mode 100644 index 0000000..fe26e76 --- /dev/null +++ b/data.txt @@ -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 diff --git a/data1.txt b/data1.txt new file mode 100644 index 0000000..ec92de2 --- /dev/null +++ b/data1.txt @@ -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 diff --git a/file1_function_call_graph.png b/file1_function_call_graph.png new file mode 100644 index 0000000..4e1ad51 Binary files /dev/null and b/file1_function_call_graph.png differ diff --git a/image/blackchess.png b/image/blackchess.png new file mode 100644 index 0000000..f13fdcb Binary files /dev/null and b/image/blackchess.png differ diff --git a/image/chessbdbg.png b/image/chessbdbg.png new file mode 100644 index 0000000..1b10d62 Binary files /dev/null and b/image/chessbdbg.png differ diff --git a/image/chessbdg.jpg b/image/chessbdg.jpg new file mode 100644 index 0000000..134d90c Binary files /dev/null and b/image/chessbdg.jpg differ diff --git a/image/concel.png b/image/concel.png new file mode 100644 index 0000000..de18c29 Binary files /dev/null and b/image/concel.png differ diff --git a/image/curnow.png b/image/curnow.png new file mode 100644 index 0000000..0046ddf Binary files /dev/null and b/image/curnow.png differ diff --git a/image/currentlocation.png b/image/currentlocation.png new file mode 100644 index 0000000..e7d2d7a Binary files /dev/null and b/image/currentlocation.png differ diff --git a/image/currentlocationd.png b/image/currentlocationd.png new file mode 100644 index 0000000..e5742d5 Binary files /dev/null and b/image/currentlocationd.png differ diff --git a/image/gameresult.png b/image/gameresult.png new file mode 100644 index 0000000..ef4a132 Binary files /dev/null and b/image/gameresult.png differ diff --git a/image/refresh.png b/image/refresh.png new file mode 100644 index 0000000..4a7975c Binary files /dev/null and b/image/refresh.png differ diff --git a/image/regretch.png b/image/regretch.png new file mode 100644 index 0000000..f3a7bfe Binary files /dev/null and b/image/regretch.png differ diff --git a/image/result.jpg b/image/result.jpg new file mode 100644 index 0000000..09cf09a Binary files /dev/null and b/image/result.jpg differ diff --git a/image/resultshow.PNG b/image/resultshow.PNG new file mode 100644 index 0000000..6bc8db5 Binary files /dev/null and b/image/resultshow.PNG differ diff --git a/image/review.png b/image/review.png new file mode 100644 index 0000000..758aaf4 Binary files /dev/null and b/image/review.png differ diff --git a/image/suggestion.png b/image/suggestion.png new file mode 100644 index 0000000..fffc13c Binary files /dev/null and b/image/suggestion.png differ diff --git a/image/true.jpg b/image/true.jpg new file mode 100644 index 0000000..d8e1e41 Binary files /dev/null and b/image/true.jpg differ diff --git a/image/whitechess.png b/image/whitechess.png new file mode 100644 index 0000000..1fd868e Binary files /dev/null and b/image/whitechess.png differ diff --git a/image/上方button-未选中.png b/image/上方button-未选中.png new file mode 100644 index 0000000..bcefe78 Binary files /dev/null and b/image/上方button-未选中.png differ diff --git a/image/上方button-选中.png b/image/上方button-选中.png new file mode 100644 index 0000000..cfba87f Binary files /dev/null and b/image/上方button-选中.png differ diff --git a/image/公告栏.png b/image/公告栏.png new file mode 100644 index 0000000..d12cb7f Binary files /dev/null and b/image/公告栏.png differ diff --git a/image/复盘.png b/image/复盘.png new file mode 100644 index 0000000..c10c591 Binary files /dev/null and b/image/复盘.png differ diff --git a/image/局面评估.png b/image/局面评估.png new file mode 100644 index 0000000..5ebd68d Binary files /dev/null and b/image/局面评估.png differ diff --git a/image/当前落子方背景.PNG b/image/当前落子方背景.PNG new file mode 100644 index 0000000..18d19b9 Binary files /dev/null and b/image/当前落子方背景.PNG differ diff --git a/image/悔棋.png b/image/悔棋.png new file mode 100644 index 0000000..493a1ef Binary files /dev/null and b/image/悔棋.png differ diff --git a/image/撤销复盘.png b/image/撤销复盘.png new file mode 100644 index 0000000..05860a6 Binary files /dev/null and b/image/撤销复盘.png differ diff --git a/image/未选中.PNG b/image/未选中.PNG new file mode 100644 index 0000000..605a974 Binary files /dev/null and b/image/未选中.PNG differ diff --git a/image/棋盘-空.png b/image/棋盘-空.png new file mode 100644 index 0000000..8c5843c Binary files /dev/null and b/image/棋盘-空.png differ diff --git a/image/棋盘.png b/image/棋盘.png new file mode 100644 index 0000000..736a31b Binary files /dev/null and b/image/棋盘.png differ diff --git a/image/白子-大.png b/image/白子-大.png new file mode 100644 index 0000000..e8748d8 Binary files /dev/null and b/image/白子-大.png differ diff --git a/image/白子-小.png b/image/白子-小.png new file mode 100644 index 0000000..40f8bbe Binary files /dev/null and b/image/白子-小.png differ diff --git a/image/背景.png b/image/背景.png new file mode 100644 index 0000000..7af92c3 Binary files /dev/null and b/image/背景.png differ diff --git a/image/胜负判定背景.PNG b/image/胜负判定背景.PNG new file mode 100644 index 0000000..78655ba Binary files /dev/null and b/image/胜负判定背景.PNG differ diff --git a/image/落子.png b/image/落子.png new file mode 100644 index 0000000..336fcee Binary files /dev/null and b/image/落子.png differ diff --git a/image/重新开始.png b/image/重新开始.png new file mode 100644 index 0000000..b334062 Binary files /dev/null and b/image/重新开始.png differ diff --git a/image/黑子-大.png b/image/黑子-大.png new file mode 100644 index 0000000..4cd5a78 Binary files /dev/null and b/image/黑子-大.png differ diff --git a/image/黑子-小.png b/image/黑子-小.png new file mode 100644 index 0000000..16e3bf1 Binary files /dev/null and b/image/黑子-小.png differ diff --git a/main.py b/main.py new file mode 100644 index 0000000..0160c32 --- /dev/null +++ b/main.py @@ -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/ diff --git a/test.py b/test.py new file mode 100644 index 0000000..ea782c5 --- /dev/null +++ b/test.py @@ -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() \ No newline at end of file