def minimax(board, player_name, depth, start_time): if depth == MAX_SEARCH_DEPTH or is_out_of_time_for_move( start_time) or game_over(board): score = evaluate(board, player_name) return Move(-1, -1, score) best_move = Move( -1, -1, -infinity if player_name == PLAYER_NAMES['P1'] else +infinity) board_copy = board.get_cloned_board() for correct_move in get_all_correct_moves(board, player_name, board.fields): x, y, piece_x, piece_y = correct_move.x, correct_move.y, correct_move.piece_x, correct_move.piece_y move_single_piece(board, player_name, correct_move) player_to_move = get_opponent_player(board, player_name) potential_move = minimax(board, player_to_move, depth + 1, start_time) potential_move.x = x potential_move.y = y potential_move.piece_x = piece_x potential_move.piece_y = piece_y if is_better_score(potential_move, best_move, player_name): best_move.x = potential_move.x best_move.y = potential_move.y best_move.piece_x = potential_move.piece_x best_move.piece_y = potential_move.piece_y best_move.score = potential_move.score board = board_copy.get_cloned_board() return best_move
def minimax(self, board, player, depth): depth += 1 # print(depth) avail_moves = self.available_moves(board) if self.win(board, self.human): return -10 elif self.win(board, self.ai): return 10 elif len(avail_moves) == 0 or depth == self.max_depth: return 0 moves = [] for index in avail_moves: move = Move() move.index = index board[index[0]][index[1]] = player new_board = copy(board) new_depth = copy(depth) if player == self.ai: result = self.minimax(new_board, self.human, depth) move.score = result.score if isinstance(result, Move) else result elif player == self.human: result = self.minimax(new_board, self.ai, depth) move.score = result.score if isinstance(result, Move) else result board[index[0]][index[1]] = 0 moves.append(move) scores = np.array([move.score for move in moves]) #best_score_ind = scores.argmax() if player == self.ai else scores.argmin() best_score_ind = np.random.choice( np.flatnonzero(scores == scores.max() if player == self.ai else scores == scores.min())) return moves[best_score_ind]