コード例 #1
0
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
コード例 #2
0
ファイル: gui.py プロジェクト: rorbachg/TicTacToe
    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]