Пример #1
0
def suit_choice_human(hand, restriction):
    if (restriction == None) or c.numberInSuit(hand, restriction)==0:
        while True:
            print("\nWhich suit would you like to play?")
            suit_options = {}
            choices = [suit for suit in c.Card.SUITS if c.numberInSuit(hand, suit) != 0]
            for suit in choices:
                print("({}). {}".format(suit[0], suit))
            ans = input("-> ").lower().strip().capitalize()

            if ans.lower() in ['c','d','h','s']:
                ans = c.Card.SUIT_ALIAS[ans.lower()]
            if ans in [x.type() for x in c.validOptions(hand, restriction, spades_broken)]:
                return card_choice_human(ans, hand)
            else:
                print("Sorry, that is not a legal move. Please try again.")
    else:
        return card_choice_human(restriction, hand)
Пример #2
0
def protect(player, cards_played):
    if c.numberInSuit(player.hand, cards_played[0].type()) != 0:
        card = cardsLeftInSuit(player.hand,cards_played[0].type())[0]
    else:
        dumpable_cards = list(filter(lambda x: x not in winners(cardsLeft), c.validOptions(player.hand, cards_played[0].type(), False)))
        if dumpable_cards == []:
            dumpable_cards = c.validOptions(player.hand, cards_played[0].type(), False)
        choice = dumpable_cards[0]
        for card in dumpable_cards:
            if card.number() < choice.number():
                choice = card
        card = choice
    return card
Пример #3
0
def nil_protect(player, cards_played):
    teammate = player.knowledge.teammate
    if c.numberInSuit(c.validOptions(player.hand, None, spades_broke), 'Spades') != 0:
        return cardsLeftInSuit(c.validOptions(player.hand, None, spades_broke), 'Spades')[-1]
    
    for suit in [x.type() for x in c.validOptions(player.hand, None, spades_broke)]:
        if (teammate[c.Card.SUITS.index(suit) + 1] == True) or cardsLeftInSuit(player.hand, suit) == cardsLeftInSuit(cardsLeft, suit):
            return c.highestInSuit(player.hand, suit, spades_broke)
    
    if list(filter(lambda x: x in winners(cardsLeft), c.validOptions(player.hand, None, spades_broke))) != []:
        return list(filter(lambda x: x in winners(cardsLeft), player.hand))[0]
    
    last_resort = c.validOptions(player.hand, None, spades_broke)[-1]
    for card in c.validOptions(player.hand, None, spades_broke):
        if card.number() > last_resort.number():
            last_resort = card
    return last_resort
Пример #4
0
def dump(player, cards_played):
    usable_cards = [card for card in list(filter(lambda x: x not in winners(cardsLeft), player.hand))]
    usable_suits = [x.type() for x in usable_cards]
  
    if usable_cards == []:
        usable_cards = player.hand

    usable_suits = [x.type() for x in usable_cards]

    if 'Spades' in usable_suits and usable_suits != ['Spades']:
        usable_suits.remove('Spades')

    if len(cards_played) == 0 and len(player.hand) != c.numberInSuit(player.hand, 'Spades'):
        base = 1
        for suit in usable_suits:
            if (player.knowledge.teammate[c.Card.SUITS.index(suit) + 1] == True) and 0 < c.numberInSuit(usable_cards, suit) < c.numberInSuit(cardsLeft, suit):
                card = cardsLeftInSuit(usable_cards, suit)[0]
                break
            elif c.numberInSuit(cardsLeft, suit) - c.numberInSuit(usable_cards, suit) >= base:
                base = c.numberInSuit(cardsLeft, suit)
                card = cardsLeftInSuit(usable_cards, suit)[0]
            else:
                card = usable_cards[0]

    elif len(cards_played) == 0:
        card = cardsLeftInSuit(usable_cards, 'Spades')[0]

    elif c.numberInSuit(player.hand, cards_played[0].type()) != 0:
        usable_cards = [card for card in list(filter(lambda x: x != s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke)))]

        if usable_cards == []:
            usable_cards = c.validOptions(player.hand, cards_played[0].type(),spades_broke)
            if len(cards_played) != 3:
                usable_cards.reverse()
        card = usable_cards[-1]

    elif c.numberInSuit(player.hand, 'Spades') != len(player.hand):
        options = list(filter(lambda x: x.type() != 'Spades',c.validOptions(player.hand, cards_played[0].type(), spades_broke)))
        choice = options[0]
        for card in options:
            if card.number() > choice.number():
                card = choice
        card = choice
    else:
        usable_cards = [card for card in list(filter(lambda x: x != s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke)))]

        if usable_cards == []:
            usable_cards = c.validOptions(player.hand, cards_played[0].type(),spades_broke)
            if len(cards_played) != 3:
                usable_cards.reverse()
        card = usable_cards[-1]
        
    return card
Пример #5
0
def decide_move(player, cards_played):
    global cardsLeft

    cardsLeft = player.knowledge.cards_left

    index = len(cards_played)
    
    if player.knowledge.teammate[0] == 0 and player.knowledge.teammate[6] == 0:
        if index == 0:
            return nil_protect(player, cards_played)

        elif index == 1:
            if cards_played[0] in winners(cardsLeft) or player.knowledge.teammate[2 + c.Card.SUITS.index(cards_played[0].type())] == True:
                return protect(player, cards_played)
            elif c.numberInSuit(player.hand, cards_played[0].type()) == 0:
                return take(player, cards_played)
            elif list(filter(lambda x: c.Card.VALUES.index(x.number()) > c.Card.VALUES.index(cards_played[0].number()), c.validOptions(player.hand, cards_played[0].type(), spades_broke))) == []:
                return protect(player, cards_played)
            else:
                return c.highestInSuit(player.hand, cards_played[0].type(), spades_broke)
        else:
            if s.trick_winner(cards_played) != cards_played[0]:
                return protect(player, cards_played)
            else:
                return take(player, cards_played)
                        
    elif player.knowledge.opponent2[0] == 0 and player.knowledge.opponent2[6] == 0:
        if index == 3:
            if s.trick_winner(cards_played+[dump(player, cards_played)]) == cards_played[0]:
                return dump(player, cards_played)
            else:
                return c.validOptions(player.hand, cards_played[0].type(), spades_broke)[-1]
        else:
            return dump(player, cards_played)

    elif player.knowledge.opponent1[0] == 0 and player.knowledge.opponent1[6] == 0:
        if index != 0:
            if s.trick_winner(cards_played+[dump(player, cards_played)]) == cards_played[index - 1]:
                return dump(player, cards_played)
            else:
                return c.validOptions(player.hand, cards_played[0].type(), spades_broke)[-1]
        else:
            return dump(player, cards_played)
    else:
        return normal_move(player, cards_played)
Пример #6
0
def take(player, cards_played):
    if len(cards_played) == 0:
        good_choices = list(filter(lambda x: x in winners(cardsLeft), c.validOptions(player.hand, None, spades_broke))) 
        if good_choices != []:
            card = good_choices[0]
        else:
            card = middle(c.validOptions(player.hand, None, spades_broke))
    elif len(cards_played) == 3:
        good_choices = list(filter(lambda x: x == s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke)))
        if good_choices != []:
            card = good_choices[0]
        else:
            card = protect(player, cards_played)
    else:
        if s.trick_winner(cards_played).type() == 'Spades':
            good_choices = list(filter(lambda x: x == s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke)))
        else:
            good_choices = list(filter(lambda x: x in winners(cardsLeft) and x == s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke)))

        if good_choices != []:
            card = good_choices[0]

        elif c.numberInSuit(player.hand, cards_played[0].type()) == 0:
            options = cardsLeftInSuit(player.hand, 'Spades')
            if options != []:
                card = options[0]
            else:
                card = protect(player, cards_played)
        else:
            if middle(list(filter(lambda x: x == s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke)))) == 'King':
                card = protect(player, cards_played)
            else:
                card = middle(list(filter(lambda x: x == s.trick_winner(cards_played+[x]), c.validOptions(player.hand, cards_played[0].type(), spades_broke))))
                if card is None:
                    card = protect(player, cards_played)
    return card
Пример #7
0
def normal_move(player, cards_played):
    if player.contract == 0 and player.tricks == 0:
        card= dump(player, cards_played)
    elif player.contract + player.knowledge.teammate[0] + player.knowledge.opponent1[0] + player.knowledge.opponent2[0] > 10 or player.contract > player.tricks:
        if len(cards_played) == 3 and s.trick_winner(cards_played) == cards_played[1] and player.knowledge.teammate[0] < player.knowledge.teammate[6]:
            card = protect(player, cards_played)
        elif len(cards_played) == 2 and s.trick_winner(cards_played) == cards_played[0] in winners(cardsLeft) and c.numberInSuit(cardsLeft, cards_played[0].type()) - c.numberInSuit(player.hand, cards_played[0].type()) >= 3:
            card = protect(player, cards_played)
        else:
            card = take(player, cards_played)            
    else:
       card = dump(player, cards_played)
    return card