class Game(object): def __init__(self): self.white_turn = False self.valid_move = True self.board = Board() self.board.initialise_board() self.start_time = 0 self.interface = GUI() self.interface.draw_board(self.board) self.interface.update_gui(self.board) self.interface.get_square_coordinates(self.board) self.selected_piece = None self.target_square = None self.capture_status = False self.ai = AI() self.depth = 3 # Three move lookahead self.game_termination = False self.selected = False self.s1 = None def ai_move(self): root = Node(self.board, value=0) self.ai.terminal_state = False self.ai.alpha_beta(root, self.depth, -10000, 10000, True) target_1, target_2, capture_target = None, None, None if root.children: for child in root.children: if child.beta == root.alpha: self.board.move_sequence = child.name.move_sequence print("AI move: ", self.board.move_sequence) target_1 = child.name.origin_square target_2 = child.name.final_square break if abs(target_1.number - target_2.number) > 5: print("CAPTURE") if target_2.row - target_1.row > 0: capture_target_row = target_1.row + 1 else: capture_target_row = target_1.row - 1 if target_2.column - target_1.column > 0: capture_target_column = target_1.column + 1 else: capture_target_column = target_1.column - 1 capture_target = [capture_target_row, capture_target_column] self.capture_status = True else: self.capture_status = False else: print("Game over human wins") self.valid_move = False self.ai_move() print(self.board.move_sequence) print("Capture target", capture_target) self.start_time = time.time() target_1 = [target_1.row, target_1.column] target_2 = [target_2.row, target_2.column] self.make_move() def human_move(self): if self.selected is False: self.s1 = self.interface.event_listener() x = self.board.possible_moves(self.s1) if x is not 0: self.interface.draw_board(self.board) self.interface.update_gui(self.board) s2 = self.interface.event_listener() move_sequence = [[self.s1.row, self.s1.column], [s2.row, s2.column]] print("Move Seq: ", move_sequence) if self.validate_move(move_sequence): self.board.move_sequence = [self.s1.number, s2.number] print("Move: ", self.board.move_sequence) self.make_move() else: self.selected = True self.human_move() else: self.human_move() def validate_move(self, move_sequence): for move in move_sequence: selected_square = self.board.checkers_board[move[0]][move[1]] # selected_square = self.interface.event_listener() print(self.board.checkers_board[move[0]][move[1]].number) if selected_square.piece: if selected_square.piece.colour == "black": piece_colour = False else: piece_colour = True if piece_colour == self.white_turn: print("Getting legal moves") self.board.possible_moves(selected_square) self.selected_piece = selected_square selected_square = None else: self.selected_piece = None else: self.target_square = selected_square if self.selected_piece and self.target_square: print("Move validated") return True else: return False def update_game_state(self): while 1: self.ai_move() self.human_move() def make_move(self): if self.board.legal_move(self.white_turn): self.board.update_board() self.board.final_possible_moves = [] self.selected_piece = None self.interface.draw_board(self.board) self.interface.update_gui(self.board) self.valid_move = True if self.capture_status: moves = self.board.get_capture_moves(self.target_square) if self.target_square.piece.colour == "white" and self.target_square.piece.crowned is False: for move in moves: if move > self.target_square.number: moves.remove(move) elif self.target_square.piece.colour == "black" and self.target_square.piece.crowned is False: for move in moves: if move < self.target_square.number: moves.remove(move) if moves: self.board.captured_squares.clear() else: self.board.captured_squares.clear() self.white_turn = not self.white_turn self.capture_status = False else: self.white_turn = not self.white_turn else: self.valid_move = False print("Invalid move made") self.human_move()