예제 #1
0
 def explore_or_exploit(self, gameboard, player, opponent_player):
     chosen_move = None
     random_number = np.random.random()
     if random_number <= self.epsilon:
         self.epsilon -= self.epsilon_decay
         chosen_move = return_random_move(gameboard, player)
         if constants.VERBOSITY > 1:
             print("Epsilon value is now", self.epsilon)
         if constants.VERBOSITY > 0: print("Chose to explore")
     else:
         best_score = constants.M_INFINITY
         verb = constants.VERBOSITY
         constants.VERBOSITY = 0
         for move in board.return_all_pending_moves(gameboard, player):
             if gameboard.fit_piece(move,
                                    player,
                                    opponent_player,
                                    mode="ai"):
                 score = self.predict_model(gameboard.board, player.score,
                                            opponent_player.score,
                                            player.number)
                 if score > best_score:
                     best_score = score
                     chosen_move = move
                 gameboard.unfit_last_piece(player, opponent_player)
         constants.VERBOSITY = verb
         if constants.VERBOSITY > 0: print("Chose to exploit")
     return chosen_move
예제 #2
0
def do_minimax(alpha, beta, gameboard, ai_player, opponent_player, \
               maximizing_player, depth = 2):

    if maximizing_player:
        if depth == 0 or len(return_all_pending_moves(gameboard,
                                                      ai_player)) == 0:
            return scoring_fn(ai_player.remaining_pieces)

        return get_max(alpha, beta, gameboard, ai_player, opponent_player,
                       depth)

    else:
        if depth == 0 or len(
                return_all_pending_moves(gameboard, opponent_player)) == 0:
            return scoring_fn(opponent_player.remaining_pieces)

        return get_min(alpha, beta, gameboard, ai_player, opponent_player,
                       depth)
예제 #3
0
def return_random_move(gameboard, player):
    if player.is_1st_move:
        return return_first_turn_move(player)
    else:
        all_moves = board.return_all_pending_moves(gameboard, player)
        if len(all_moves) > 0:
            chosen_move = random.choice(all_moves)
            if constants.VERBOSITY > 0:
                print("Chosen move for RandomMovesBot: %s" % (chosen_move))
            return chosen_move
    return None
예제 #4
0
def get_max(alpha, beta, gameboard, ai_player, opponent_player, depth):
    max_eval = constants.M_INFINITY
    ai_moves = return_all_pending_moves(gameboard, ai_player)

    for move in ai_moves:
        board_copy = copy.deepcopy(gameboard)
        ai_copy = copy.deepcopy(ai_player)
        opponent_copy = copy.deepcopy(opponent_player)
        if board_copy.fit_piece(move, ai_copy, opponent_copy):
            eval = do_minimax(alpha, beta, board_copy, ai_copy, \
                              opponent_copy, False, depth - 1)
            max_eval = max(max_eval, eval)
            alpha = max(alpha, eval)
            if beta <= alpha:
                break
    return max_eval
예제 #5
0
def get_min(alpha, beta, gameboard, ai_player, opponent_player, depth):
    min_eval = constants.INFINITY
    player_moves = return_all_pending_moves(gameboard, opponent_player)

    for move in player_moves:
        board_copy = copy.deepcopy(gameboard)
        ai_copy = copy.deepcopy(ai_player)
        opponent_copy = copy.deepcopy(opponent_player)
        if board_copy.fit_piece(move, opponent_copy, ai_copy):
            eval = do_minimax(alpha, beta, board_copy, ai_copy, \
                              opponent_copy, True, depth - 1)
            min_eval = min(min_eval, eval)
            beta = min(beta, eval)
            if beta <= alpha:
                break
    return min_eval
예제 #6
0
def main(gameboard, ai_player, opponent_player):
    best_score = constants.M_INFINITY
    best_move = None

    if ai_player.is_1st_move:
        best_move = do_first_move(ai_player)
    else:
        for move in return_all_pending_moves(gameboard, ai_player):
            board_copy = copy.deepcopy(gameboard)
            ai_copy = copy.deepcopy(ai_player)
            opponent_copy = copy.deepcopy(opponent_player)
            if board_copy.fit_piece(move, ai_copy, opponent_copy):
                score = do_minimax(constants.INFINITY, constants.M_INFINITY, board_copy, \
                                   ai_copy, opponent_copy, False)
                if score > best_score:
                    best_score = score
                    best_move = move
    return best_move
예제 #7
0
def main(gameboard, ai_player, opponent_player):
    best_score = constants.M_INFINITY
    best_move = None

    if ai_player.is_1st_move:
        best_move = do_first_move(ai_player)
    else:
        board_copy = copy.deepcopy(gameboard)
        ai_copy = copy.deepcopy(ai_player)
        opponent_copy = copy.deepcopy(opponent_player)
        for move in return_all_pending_moves(board_copy, ai_copy):
            simulate_move(board_copy, move, ai_copy, opponent_copy)
            score = eval_fn(ai_player.board_corners, ai_player.remaining_pieces)
            if score > best_score:
                best_score = score
                best_move = move
            undo_move(board_copy, move, ai_copy, opponent_copy)
    return best_move