コード例 #1
0
ファイル: spades_AI.py プロジェクト: Ben-Call/cs162
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
コード例 #2
0
ファイル: spades_AI.py プロジェクト: Ben-Call/cs162
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
コード例 #3
0
ファイル: spades_AI.py プロジェクト: Ben-Call/cs162
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)
コード例 #4
0
ファイル: spades_AI.py プロジェクト: Ben-Call/cs162
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