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
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