class ChessGame: Distribution_Info = [ "Standard Opening", "Single Rook Kill", "Pawn eat pawn passing by" ] Game_Mode_Info = ["Human vs Human", "Human vs AI", "AI vs AI"] def __init__(self, mode=1, dis=0, showMove=True, showSearch=False, showGUI=True, saveInfo=False): self.board = ChessBoard() self.Player_Side = False self.GameMode = mode self.distribution = dis self.ai_0 = AI() self.ai_1 = AI() self.ShowMoveInfo = showMove self.ShowSearchInfo = showSearch self.ShowGraphUI = showGUI self.SaveInfo = saveInfo self.view = ChessView(self) def Set(self, mode=1, dis=0, showMove=True, showSearch=False, showGUI=True, saveInfo=False, savePath=r".\Records", ai_name_0="MinMaxSearch", use_pos_0=False, depth_0=3, ai_name_1="MinMaxSearch", depth_1=3, use_pos_1=False): self.GameMode = mode self.distribution = dis self.ShowMoveInfo = showMove self.ShowSearchInfo = showSearch self.ShowGraphUI = showGUI self.SaveInfo = saveInfo self.SavePath = savePath self.SaveFileName = "" if ai_name_0 == "MinMaxSearch": ai_0 = MinMaxSearchAI(depth_0, True, use_pos_0) else: ai_0 = RandomMoveAI() if ai_name_1 == "MinMaxSearch": ai_1 = MinMaxSearchAI(depth_1, True, use_pos_1) else: ai_1 = RandomMoveAI() self.SetAI(ai_0, ai_1) def SetGame(self, mode=1, dis=0): self.GameMode = mode self.distribution = dis def SetInfo(self, showMove=True, showSearch=False, showGUI=True, saveInfo=False): self.ShowMoveInfo = showMove self.ShowSearchInfo = showSearch self.ShowGraphUI = showGUI self.SaveInfo = saveInfo def SetAI(self, ai_0, ai_1): self.ai_0 = ai_0 self.ai_1 = ai_1 def start(self): timeInfo = time.strftime('%Y-%m-%d %H:%M:%S') timeLabel = time.strftime('%Y-%m-%d-%H-%M-%S') self.SaveFileName = timeLabel + ".txt" Msg = timeInfo + " " \ + ChessGame.Game_Mode_Info[self.GameMode] + " " \ + ChessGame.Distribution_Info[self.distribution] + "\n" Msg_AI = "" if self.GameMode == 1: Msg_AI += str(self.ai_0) + "\n" elif self.GameMode == 2: Msg_AI += str(self.ai_0) + "\n" Msg_AI += str(self.ai_1) + "\n" print Msg + Msg_AI, if self.SaveInfo: self.SaveData(Msg + Msg_AI) self.board.Board_Initialization(self.distribution) if self.GameMode == 2: if not self.ShowGraphUI: self.Game_AIvAI_Auto(self.ai_0, self.ai_1) self.view.showMsg("Chess") self.view.draw_board(self.board) self.view.start() def callback(self, event): rx, ry = real_coord(event.x), real_coord(800 - event.y) self.Game(rx, ry, self.GameMode) def Move_Info(self, move_info): game_info = { 0: "", 1: " #", 2: " #", 3: " Stalemate", 4: " Draw", 5: " Perpetual check" } return "(" + str(self.board.Round) + "):" + move_info \ + game_info[self.board.Status] \ + ("; " if self.Player_Side else ";\n") def SaveData(self, info): fileName = self.SavePath + r'\chess-' + self.SaveFileName with open(fileName, 'a') as data: data.write(info) def Game(self, x, y, mode=0): if mode == 0: self.Game_PvP(x, y) elif mode == 1: self.Game_PvAI(x, y) elif mode == 2: self.Game_AIvAI(self.ai_0, self.ai_1) else: raise Exception("Invalid game mode: " + str(mode)) def Game_PvP(self, rx, ry): if self.board.Status != 0: return move_info = self.board.select(rx, ry, self.Player_Side) if move_info != "": self.view.showMsg( "White turn" if self.Player_Side else "Black turn") self.Player_Side = not self.Player_Side self.board.Round += 1 self.board.UpdateStatu() if self.ShowMoveInfo: print self.Move_Info(move_info), if self.SaveInfo: self.SaveData(self.Move_Info(move_info)) self.view.draw_board(self.board) def Game_PvAI(self, rx, ry): if self.board.Status != 0: return move_info = self.board.select(rx, ry, self.Player_Side) self.view.draw_board(self.board) if move_info != "": self.view.showMsg( "White turn" if self.Player_Side else "Black turn") self.Player_Side = not self.Player_Side self.board.Round += 1 self.board.UpdateStatu() if self.ShowMoveInfo: print self.Move_Info(move_info), if self.SaveInfo: self.SaveData(self.Move_Info(move_info)) self.view.draw_board(self.board) if self.board.Status != 0: return move, msg = self.ai_0.Play(self.board, self.Player_Side) self.board.select(move[0][0], move[0][1], self.Player_Side) move_info = self.board.select(move[1][0], move[1][1], self.Player_Side) self.view.showMsg( "White turn" if self.Player_Side else "Black turn") self.Player_Side = not self.Player_Side self.board.Round += 1 self.board.UpdateStatu() if self.ShowSearchInfo: print msg, if self.SaveInfo: self.SaveData(msg + " ") if self.ShowMoveInfo: print self.Move_Info(move_info), if self.SaveInfo: self.SaveData(self.Move_Info(move_info)) self.view.draw_board(self.board) def Game_AIvAI(self, ai_0, ai_1): if self.board.Status != 0: return if self.Player_Side == False: ai_0.Clear() move, msg = ai_0.Play(self.board, self.Player_Side) else: ai_1.Clear() move, msg = ai_1.Play(self.board, self.Player_Side) self.board.select(move[0][0], move[0][1], self.Player_Side) move_info = self.board.select(move[1][0], move[1][1], self.Player_Side) self.view.showMsg("White turn" if self.Player_Side else "Black turn") self.Player_Side = not self.Player_Side self.board.Round += 1 self.board.UpdateStatu() if self.ShowSearchInfo: print msg, if self.SaveInfo: self.SaveData(msg + " ") if self.ShowMoveInfo: print self.Move_Info(move_info), if self.SaveInfo: self.SaveData(self.Move_Info(move_info)) self.view.draw_board(self.board) def Game_AIvAI_Auto(self, ai_0, ai_1): while self.board.Status == 0: ai_0.Clear() move, msg = ai_0.Play(self.board, self.Player_Side) self.board.select(move[0][0], move[0][1], self.Player_Side) move_info = self.board.select(move[1][0], move[1][1], self.Player_Side) self.view.showMsg( "White turn" if self.Player_Side else "Black turn") self.Player_Side = not self.Player_Side self.board.Round += 1 self.board.UpdateStatu() if self.ShowSearchInfo: print msg, if self.SaveInfo: self.SaveData(msg + " "), if self.ShowMoveInfo: print self.Move_Info(move_info), if self.SaveInfo: self.SaveData(self.Move_Info(move_info)) if self.board.Status != 0: self.SaveData("\n") print "" break ai_1.Clear() move, msg = ai_1.Play(self.board, self.Player_Side) self.board.select(move[0][0], move[0][1], self.Player_Side) move_info = self.board.select(move[1][0], move[1][1], self.Player_Side) self.view.showMsg( "White turn" if self.Player_Side else "Black turn") self.Player_Side = not self.Player_Side self.board.Round += 1 self.board.UpdateStatu() if self.ShowSearchInfo: print msg, if self.SaveInfo: self.SaveData(msg + " ") if self.ShowMoveInfo: print self.Move_Info(move_info), if self.SaveInfo: self.SaveData(self.Move_Info(move_info)) print self.board print self.board.Status if self.SaveInfo: self.SaveData(str(self.board) + "\n") self.SaveData(str(self.board.Status) + "\n")