Beispiel #1
0
    def apply_picker(picker):
        # create copy of hand that we'll remove cards from as cards are selected for playing
        pick_hand = list(hand)
        picked_cards = []
        first_data = [
            TractorMetadata(tractor.rank, tractor.length)
            for tractor in first_tractors
        ]
        while first_data:
            # compute the minimum rank/length tractor we must play
            suit_tractors = state.get_suit_tractors_from_cards(
                pick_hand, trick_suit)
            hand_data = [
                TractorMetadata(tractor.rank, tractor.length)
                for tractor in suit_tractors
            ]
            if len(hand_data) == 0:
                break
            hand_idx = find_matching_data_index(hand_data, first_data[0])
            min_data = get_min_data(first_data[0], hand_data[hand_idx])

            # get tractors that exactly match the minimum, and tractors that are larger in rank/length
            exact = []
            larger = []
            for tractor in suit_tractors:
                if tractor.rank == min_data.rank and tractor.length == min_data.length:
                    exact.append(tractor)
                elif tractor.rank >= min_data.rank and tractor.length >= min_data.length:
                    larger.append(tractor)

            # run the picker
            cur_picked = picker(min_data, exact, larger)
            for card in cur_picked:
                picked_cards.append(card)
                pick_hand.remove(card)

            first_data = update_data_array(first_data, min_data)

        # at this point there should be no cards in suit matching first_play
        # so we provide single cards to the picker
        while len(picked_cards) < len(first_play):
            exact = []
            for card in pick_hand:
                suit_type = card_to_suit_type(card, trick_card.suit,
                                              state.trump_card)
                tractor = Tractor(1, 1, card.suit_power(state.trump_card),
                                  suit_type)
                tractor.orig_cards = [[card]]
                exact.append(tractor)
            cur_picked = picker(TractorMetadata(1, 1), exact, [])
            for card in cur_picked:
                picked_cards.append(card)
                pick_hand.remove(card)

        return picked_cards
Beispiel #2
0
def get_splits(large, small):
    # first split the length, then for each split, cut the rank
    splits = []
    for i in range(large.length - small.length + 1):
        tractor = Tractor(large.rank, small.length, large.power + i,
                          large.suit_type)
        tractor.orig_cards = large.orig_cards[i:i + small.length]
        splits.append(tractor)
    for split in splits:
        split.rank = small.rank
        split.orig_cards = [t[:small.rank] for t in split.orig_cards]
    return splits