Ejemplo n.º 1
0
 def test_init(self):
     with self.assertRaises(ValueError):
         card = Card('5', 'Hearts')
     with self.assertRaises(ValueError):
         card = Card('5', 'diamond')
     with self.assertRaises(ValueError):
         card = Card('5', 'club')
Ejemplo n.º 2
0
    def test_hearts_high(self):
        card1 = Card('3', 'spades')
        card2 = Card('2', 'hearts')
        card3 = Card('8', 'diamonds')

        self.assertEqual(card1.hearts_high(), 0)
        self.assertEqual(card2.hearts_high(), 51)
        self.assertEqual(card3.hearts_high(), 22)
Ejemplo n.º 3
0
 def test_toggle_selected(self):
     card = Card('5', 'hearts')
     if card.is_selected():
         card.toggle_selected()
         self.assertEqual(card.is_selected(), False)
     else:
         card.toggle_selected()
         self.assertEqual(card.is_selected(), True)
Ejemplo n.º 4
0
 def test_eq(self):
     card1 = Card('3', 'spades')
     card2 = Card('3', 'spades')
     card3 = Card('3', 'hearts')
     card4 = Card(3, 'hearts')
     self.assertEqual(card1.__eq__(card2), True)
     self.assertEqual(card1.__eq__(card3), False)
     self.assertEqual(card1.__eq__(3), False)
     self.assertEqual(card3.__eq__(card4), True)
Ejemplo n.º 5
0
def _find_doubles(cards1, cards2):
    """Find doubles in cards2 that can beat cards1.
    cards1: a sorted list containing a pair of cards with the same rank.
    cards2: a sorted list of cards."""
    moves = []

    # Set i and j to the index of the first card in cards2 that is equal to or larger than the lowest rank in cards1.
    i = 0
    while cards2[i].rank < cards1[0].rank and (i < (len(cards2) - 1)):
        i = i + 1
    j = i

    while i < (len(cards2) - 1):
        while j < len(cards2) and cards2[i].rank == cards2[j].rank:
            j = j + 1
        # There are j-i cards with the same rank.
        if j - i > 0:
            # Combinations of pairs.
            for first in range(i, j - 1):
                for second in range(first + 1, j):
                    if beats(cards1, [cards2[first], cards2[second]]):
                        moves.append([cards2[first], cards2[second]])
            i = j
        # There are no cards with the same rank as cards2[i]
        else:
            i = i + 1
            j = j + 1

    # If cards1 has a 2,
    # Find all double straights in cards2 that have 4 pairs. Any 4 pair double straight can beat any pair of 2's.
    if cards1[0].rank == '2':
        dbl_straight = [Card('3', 'spades') for _ in range(8)]
        for move in _find_double_straights(dbl_straight, cards2):
            moves.append(move)
    return moves
Ejemplo n.º 6
0
def _find_triples(cards1, cards2):
    """Find doubles in cards2 that can beat cards1.
        cards1: a sorted list containing three cards with the same rank.
        cards2: a sorted list of cards."""
    moves = []
    # Set i and j to the index of the first card in cards2 that is equal to or larger than the lowest rank in cards1.
    i = 0
    while cards2[i].rank < cards1[0].rank and (i < (len(cards2) - 2)):
        i = i + 1
    j = i

    while i < (len(cards2) - 2):
        while j < len(cards2) and cards2[i].rank == cards2[j].rank:
            j = j + 1
        # There are j-i cards with the same rank.
        if j - i > 1:
            # Combinations of triples.
            for comb in combinations(cards2[i:j], 3):
                if beats(cards1, comb):
                    moves.append(list(comb))
            i = j
        # There are no cards with the same rank as cards2[i]
        else:
            i = i + 1
            j = j + 1

    # If cards1 has a 2,
    # Find all double straights in cards2 that have 5 pairs. Any 5 pair double straight can beat any triple of 2's.
    if cards1[0].rank == '2':
        dbl_straight = [Card('3', 'spades') for _ in range(10)]
        for move in _find_double_straights(dbl_straight, cards2):
            moves.append(move)
    return moves
Ejemplo n.º 7
0
 def test_double(self):
     self.assertEqual(Rules.double([]), False)
     cards1 = [Card('3', 'spades'), Card('3', 'hearts')]
     self.assertEqual(Rules.double(cards1), True)
     cards2 = [Card('A', 'spades'), Card('A', 'spades')]
     self.assertEqual(Rules.double(cards2), True)
     cards3 = [Card('3', 'spades'), Card('2', 'hearts')]
     self.assertEqual(Rules.double(cards3), False)
     cards4 = [
         Card('2', 'spades'),
         Card('2', 'spades'),
         Card('2', 'spades')
     ]
     self.assertEqual(Rules.double(cards4), False)
     cards6 = [Card(2, 'spades')]
     self.assertEqual(Rules.double(cards6), False)
Ejemplo n.º 8
0
 def __set_cards(self):
     """
     Initialize list of 52 cards
     """
     self.cards = [
         Card(rank, suit, True) for rank in Card.ranks
         for suit in Card.suits
     ]
     self.undealtCards = self.cards[:]
Ejemplo n.º 9
0
def _find_singles(cards1, cards2):
    moves = [[card] for card in cards2
             if card.hearts_high() > cards1[0].hearts_high()]
    # If cards1 is a 2,
    # Find all double straights in cards2 that have 3 pairs. Any 3 pair double straight can beat any single 2.
    if cards1[0].rank == '2':
        dbl_straight = [Card('3', 'spades') for _ in range(6)]
        for move in _find_double_straights(dbl_straight, cards2):
            moves.append(move)
    return moves
Ejemplo n.º 10
0
 def test_triple(self):
     self.assertEqual(Rules.triple([]), False)
     cards1 = [
         Card('2', 'spades'),
         Card('2', 'spades'),
         Card('2', 'spades')
     ]
     self.assertEqual(Rules.triple(cards1), True)
     cards2 = [
         Card('2', 'spades'),
         Card('2', 'hearts'),
         Card('2', 'diamonds')
     ]
     self.assertEqual(Rules.triple(cards2), True)
     cards3 = [
         Card('2', 'spades'),
         Card('2', 'spades'),
         Card('3', 'spades')
     ]
     self.assertEqual(Rules.triple(cards3), False)
Ejemplo n.º 11
0
 def test_double_straight(self):
     self.assertEqual(Rules.double_straight([]), False)
     cards1 = [
         Card(rank, random.choice(suits)) for rank in [3, 3, 4, 4, 5, 5]
     ]
     self.assertEqual(Rules.double_straight(cards1), True)
     cards2 = [
         Card(rank, random.choice(suits)) for rank in [3, 3, 4, 5, 5, 5]
     ]
     self.assertEqual(Rules.double_straight(cards2), False)
     cards3 = [
         Card(rank, random.choice(suits))
         for rank in [3, 3, 4, 4, 5, 5, 6, 6]
     ]
     self.assertEqual(Rules.double_straight(cards3), True)
     cards4 = [Card(rank, random.choice(suits)) for rank in [3, 3, 4, 4]]
     self.assertEqual(Rules.double_straight(cards4), False)
     cards5 = [Card(rank, random.choice(suits)) for rank in [3, 3]]
     self.assertEqual(Rules.double_straight(cards5), False)
     cards6 = [
         Card(rank, random.choice(suits))
         for rank in [3, 3, 4, 4, 5, 5, 6, 6, 8, 8]
     ]
     self.assertEqual(Rules.double_straight(cards6), False)
     cards7 = [
         Card(rank, random.choice(suits))
         for rank in ['Q', 'Q', 'K', 'K', 'A', 'A']
     ]
     self.assertEqual(Rules.double_straight(cards7), True)
     cards8 = [
         Card(rank, random.choice(suits))
         for rank in ['K', 'K', 'A', 'A', 2, 2]
     ]
     self.assertEqual(Rules.double_straight(cards8), False)
     cards9 = [
         Card(rank, random.choice(suits)) for rank in [
             3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 'J', 'J',
             'Q', 'Q', 'K', 'K', 'A', 'A'
         ]
     ]
     self.assertEqual(Rules.double_straight(cards9), True)
Ejemplo n.º 12
0
    def clone(self):
        """Returns a deep clone of this game state.
        """
        # Create copies of each player's hand and position.
        new_players = []
        new_hands = []
        new_positions = []
        for player in self.players:
            new_hand = []
            new_positions.append(player.position)
            for card in player.hand:
                new_hand.append(Card(card.rank, card.suit, False))
            new_hands.append(new_hand)

        # Create copies of players.
        for i in range(len(self.players)):
            player_copy = Player('', new_positions[i])
            player_copy.hand = new_hands[i]
            new_players.append(player_copy)

        st = GameState(self.move[:], new_players, self.skipped[:],
                       self.player_just_moved, self.active_player)
        return st
Ejemplo n.º 13
0
 def test_straight(self):
     self.assertEqual(Rules.straight([]), False)
     cards1 = [Card(rank, 'spades') for rank in ranks[0:12]]
     self.assertEqual(Rules.straight(cards1), True)
     cards2 = [Card(rank, 'spades') for rank in ranks]
     self.assertEqual(Rules.straight(cards2), False)
     cards3 = [Card(rank, 'spades') for rank in ranks[0:2]]
     self.assertEqual(Rules.straight(cards3), False)
     cards4 = [Card(rank, 'spades') for rank in ranks[0:3]]
     self.assertEqual(Rules.straight(cards4), True)
     cards5 = cards1[::-1]
     self.assertEqual(Rules.straight(cards5), True)
     cards6 = cards2[::-1]
     self.assertEqual(Rules.straight(cards6), False)
     cards7 = cards4[::-1]
     self.assertEqual(Rules.straight(cards7), True)
     cards8 = [Card(rank, 'spades') for rank in ranks[10:13]]
     self.assertEqual(Rules.straight(cards8), False)
     cards9 = [Card(rank, 'spades') for rank in ranks[9:12]]
     self.assertEqual(Rules.straight(cards9), True)
Ejemplo n.º 14
0
 def test_beats(self):
     # Singles
     self.assertEqual(Rules.beats([Card(3, 'spades')], [Card(3, 'spades')]),
                      False)
     self.assertEqual(Rules.beats([Card(3, 'spades')], [Card(2, 'spades')]),
                      True)
     self.assertEqual(Rules.beats([Card(3, 'clubs')], [Card(3, 'spades')]),
                      False)
     self.assertEqual(
         Rules.beats([Card(3, 'spades')], [Card('J', 'hearts')]), True)
     self.assertEqual(Rules.beats([], []), False)
     quad_chop = [Card('3', suit) for suit in suits]
     self.assertEqual(Rules.beats([Card(2, 'hearts')], quad_chop), True)
     dbl_straight_chop = [
         Card(3, 'spades'),
         Card(3, 'clubs'),
         Card(4, 'diamonds'),
         Card(4, 'hearts'),
         Card(5, 'clubs'),
         Card(5, 'diamonds')
     ]
     self.assertEqual(Rules.beats([Card(2, 'spades')], dbl_straight_chop),
                      True)
     # Doubles
     cards1 = [Card(3, 'spades'), Card(3, 'diamonds')]
     cards2 = [Card(3, 'clubs'), Card(3, 'hearts')]
     self.assertEqual(Rules.beats(cards1, cards2), True)
     cards3 = [Card(3, 'clubs'), Card(3, 'hearts')]
     cards4 = [Card(4, 'clubs'), Card(4, 'hearts')]
     self.assertEqual(Rules.beats(cards3, cards4), True)
     cards5 = [Card(2, 'clubs'), Card(2, 'hearts')]
     cards6 = [Card('A', 'clubs'), Card('A', 'hearts')]
     self.assertEqual(Rules.beats(cards5, cards6), False)
     cards7 = [Card('Q', 'clubs'), Card('Q', 'hearts')]
     cards8 = [Card('Q', 'clubs'), Card('Q', 'diamonds')]
     self.assertEqual(Rules.beats(cards7, cards8), False)
     cards9 = [Card('Q', 'clubs'), Card('J', 'hearts')]
     cards10 = [Card('Q', 'clubs'), Card('J', 'diamonds')]
     self.assertEqual(Rules.beats(cards9, cards10), False)
     # Triples
     cards9 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'spades')
     ]
     cards10 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'hearts')
     ]
     self.assertEqual(Rules.beats(cards9, cards10), True)
     cards11 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'hearts')
     ]
     cards12 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'hearts')
     ]
     self.assertEqual(Rules.beats(cards11, cards12), False)
     cards13 = [
         Card('9', 'hearts'),
         Card('9', 'diamonds'),
         Card('9', 'spades')
     ]
     cards14 = [
         Card('10', 'hearts'),
         Card('10', 'diamonds'),
         Card('10', 'spades')
     ]
     self.assertEqual(Rules.beats(cards13, cards14), True)
     cards13 = [
         Card('9', 'hearts'),
         Card('9', 'diamonds'),
         Card('9', 'spades')
     ]
     cards14 = [
         Card('7', 'hearts'),
         Card('7', 'diamonds'),
         Card('7', 'spades')
     ]
     self.assertEqual(Rules.beats(cards13, cards14), False)
     cards15 = [
         Card('9', 'hearts'),
         Card('9', 'diamonds'),
         Card('9', 'spades')
     ]
     cards16 = [
         Card('A', 'hearts'),
         Card('10', 'diamonds'),
         Card('A', 'spades')
     ]
     self.assertEqual(Rules.beats(cards15, cards16), False)
     # Quads
     cards17 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'spades'),
         Card('Q', 'spades')
     ]
     cards18 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'spades'),
         Card('Q', 'hearts')
     ]
     self.assertEqual(Rules.beats(cards17, cards18), True)
     cards19 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'hearts'),
         Card('Q', 'hearts')
     ]
     cards20 = [
         Card('Q', 'clubs'),
         Card('Q', 'diamonds'),
         Card('Q', 'hearts'),
         Card('Q', 'hearts')
     ]
     self.assertEqual(Rules.beats(cards19, cards20), False)
     cards21 = [
         Card('9', 'hearts'),
         Card('9', 'diamonds'),
         Card('9', 'spades'),
         Card('9', 'clubs')
     ]
     cards22 = [
         Card('10', 'hearts'),
         Card('10', 'diamonds'),
         Card('10', 'spades'),
         Card('10', 'clubs')
     ]
     self.assertEqual(Rules.beats(cards21, cards22), True)
     cards23 = [
         Card('9', 'hearts'),
         Card('9', 'diamonds'),
         Card('9', 'spades'),
         Card('9', 'clubs')
     ]
     cards24 = [
         Card('7', 'hearts'),
         Card('7', 'diamonds'),
         Card('7', 'spades'),
         Card('7', 'clubs')
     ]
     self.assertEqual(Rules.beats(cards23, cards24), False)
     cards25 = [
         Card('9', 'hearts'),
         Card('9', 'diamonds'),
         Card('9', 'spades'),
         Card('9', 'clubs')
     ]
     cards26 = [
         Card('A', 'hearts'),
         Card('10', 'diamonds'),
         Card('A', 'spades'),
         Card('A', 'clubs')
     ]
     self.assertEqual(Rules.beats(cards25, cards26), False)
     # Straights
     cards27 = [
         Card('3', 'spades'),
         Card('4', 'clubs'),
         Card('5', 'diamonds')
     ]
     cards28 = [
         Card('3', 'spades'),
         Card('4', 'clubs'),
         Card('5', 'hearts')
     ]
     self.assertEqual(Rules.beats(cards27, cards28), True)
     cards29 = [
         Card('3', 'spades'),
         Card('4', 'clubs'),
         Card('5', 'diamonds')
     ]
     cards30 = [
         Card('3', 'spades'),
         Card('4', 'clubs'),
         Card('5', 'diamonds')
     ]
     self.assertEqual(Rules.beats(cards29, cards30), False)
     cards31 = [
         Card('3', 'spades'),
         Card('4', 'clubs'),
         Card('5', 'diamonds')
     ]
     cards32 = [
         Card('K', 'spades'),
         Card('A', 'clubs'),
         Card('2', 'hearts')
     ]
     self.assertEqual(Rules.beats(cards31, cards32), False)
     cards33 = [
         Card('Q', 'spades'),
         Card('K', 'clubs'),
         Card('A', 'hearts')
     ]
     cards34 = [
         Card('K', 'spades'),
         Card('A', 'clubs'),
         Card('2', 'spades')
     ]
     self.assertEqual(Rules.beats(cards33, cards34), False)
     # Double Straights
     cards35 = [Card(rank, 'spades') for rank in [3, 3, 4, 4, 5, 5]]
     cards36 = [Card(rank, 'spades') for rank in [4, 4, 5, 5, 6, 6]]
     self.assertEqual(Rules.beats(cards35, cards36), True)
     cards35 = [Card(rank, 'spades') for rank in [3, 3, 4, 4, 5, 5]]
     cards36 = [Card(rank, 'spades') for rank in [4, 4, 5, 5, 7, 7]]
     self.assertEqual(Rules.beats(cards35, cards36), False)
     cards37 = [Card(rank, 'spades') for rank in [3, 3, 4, 4, 5, 5]]
     cards38 = [Card(rank, 'spades') for rank in ['K', 'K', 'A', 'A', 2, 2]]
     self.assertEqual(Rules.beats(cards37, cards38), False)
     cards39 = [Card(rank, 'spades') for rank in [3, 3, 4, 4, 5, 5]]
     cards40 = [Card(rank, 'spades') for rank in [3, 3, 4, 4]]
     cards40.extend([Card('5', 'spades'), Card('5', 'clubs')])
     self.assertEqual(Rules.beats(cards39, cards40), True)
Ejemplo n.º 15
0
 def test_is_selected(self):
     card = Card('5', 'hearts')
     self.assertEqual(card.is_selected(), card.selected)
Ejemplo n.º 16
0
    def test_possible_moves(self):
        # Singles
        single1 = [Card('3', 'spades')]
        single2 = [
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('A', 'diamonds'),
            Card('2', 'spades')
        ]
        self.assertEqual(Rules.possible_moves(single1, single2),
                         [[card] for card in single2] + [[]])
        single3 = [Card('2', 'hearts')]
        single4 = [
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('A', 'diamonds'),
            Card('2', 'spades')
        ]
        self.assertEqual(Rules.possible_moves(single3, single4), [[]])
        single5 = [Card('2', 'spades')]
        single6 = [
            Card('2', 'clubs'),
            Card('2', 'hearts'),
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        self.assertEqual(
            Rules.possible_moves(single5, single6),
            [[Card('2', 'clubs')], [Card('2', 'hearts')], single6[2:]] + [[]])

        # Doubles
        double1 = [Card('3', 'clubs'), Card('3', 'hearts')]
        double2 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'diamonds'),
            Card('5', 'hearts')
        ]
        self.assertEqual(Rules.possible_moves(double1, double2), [[
            Card('4', 'spades'), Card('4', 'clubs')
        ], [Card('5', 'diamonds'), Card('5', 'hearts')]] + [[]])
        double3 = [Card('3', 'clubs'), Card('3', 'hearts')]
        double4 = [
            Card('4', 'spades'),
            Card('5', 'clubs'),
            Card('6', 'diamonds'),
            Card('7', 'hearts')
        ]
        self.assertEqual(Rules.possible_moves(double3, double4), [[]])
        double5 = [Card('2', 'spades'), Card('2', 'clubs')]
        double6 = [
            Card('2', 'clubs'),
            Card('2', 'diamonds'),
            Card('2', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(double5, double6),
            [[Card('2', 'clubs'), Card('2', 'diamonds')],
             [Card('2', 'clubs'), Card('2', 'hearts')],
             [Card('2', 'diamonds'),
              Card('2', 'hearts')]] + [[]])
        double7 = [Card('2', 'spades'), Card('2', 'clubs')]
        double8 = [
            Card('2', 'diamonds'),
            Card('2', 'hearts'),
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs'),
            Card('6', 'spades'),
            Card('6', 'clubs'),
            Card('7', 'spades'),
            Card('7', 'clubs')
        ]
        self.assertEqual(Rules.possible_moves(double7, double8),
                         [[Card('2', 'diamonds'),
                           Card('2', 'hearts')], double8[2:-2], double8[4:]] +
                         [[]])

        # Triples
        triple1 = [
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        triple2 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('7', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(triple1, triple2),
            [[Card('4', 'spades'),
              Card('4', 'clubs'),
              Card('4', 'diamonds')]] + [[]])
        triple3 = [
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        triple4 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('7', 'hearts'),
            Card('7', 'diamonds'),
            Card('7', 'spades')
        ]
        self.assertEqual(
            Rules.possible_moves(triple3, triple4),
            [[Card('4', 'spades'),
              Card('4', 'clubs'),
              Card('4', 'diamonds')],
             [Card('7', 'spades'),
              Card('7', 'diamonds'),
              Card('7', 'hearts')]] + [[]])
        triple5 = [
            Card('2', 'spades'),
            Card('2', 'clubs'),
            Card('2', 'diamonds')
        ]
        triple6 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs'),
            Card('6', 'spades'),
            Card('6', 'clubs'),
            Card('7', 'spades'),
            Card('7', 'clubs')
        ]
        self.assertEqual(Rules.possible_moves(triple5, triple6),
                         [triple6[:]] + [[]])
        triple7 = [
            Card('2', 'spades'),
            Card('2', 'clubs'),
            Card('2', 'diamonds')
        ]
        triple8 = [
            Card('2', 'spades'),
            Card('2', 'diamonds'),
            Card('2', 'hearts'),
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs'),
            Card('6', 'spades'),
            Card('6', 'clubs'),
            Card('7', 'spades'),
            Card('7', 'clubs')
        ]
        self.assertEqual(Rules.possible_moves(triple7, triple8),
                         [triple8[0:3], triple8[3:]] + [[]])

        # Quads
        quad1 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        quad2 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('4', 'hearts')
        ]
        self.assertEqual(Rules.possible_moves(quad1, quad2), [[
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('4', 'hearts')
        ]] + [[]])
        quad3 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        quad4 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds')
        ]
        self.assertEqual(Rules.possible_moves(quad3, quad4), [[]])
        quad5 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        quad6 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('5', 'hearts')
        ]
        self.assertEqual(Rules.possible_moves(quad5, quad6), [[]])
        quad7 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        quad8 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('5', 'clubs')
        ]
        self.assertEqual(Rules.possible_moves(quad7, quad8), [[
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('4', 'hearts')
        ]] + [[]])
        quad9 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('3', 'diamonds'),
            Card('3', 'hearts')
        ]
        quad10 = [
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('7', 'spades'),
            Card('7', 'clubs'),
            Card('7', 'diamonds'),
            Card('7', 'hearts')
        ]
        self.assertEqual(Rules.possible_moves(quad9, quad10),
                         [[
                             Card('4', 'spades'),
                             Card('4', 'clubs'),
                             Card('4', 'diamonds'),
                             Card('4', 'hearts')
                         ],
                          [
                              Card('7', 'spades'),
                              Card('7', 'clubs'),
                              Card('7', 'diamonds'),
                              Card('7', 'hearts')
                          ]] + [[]])

        # Straights
        straight1 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight2 = [Card('2', 'hearts')]
        self.assertEqual(Rules.possible_moves(straight1, straight2), [[]])
        straight3 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight4 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(straight3, straight4),
            [[Card('3', 'spades'),
              Card('4', 'spades'),
              Card('5', 'hearts')]] + [[]])
        straight5 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight6 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'hearts'),
            Card('5', 'diamonds')
        ]
        self.assertEqual(
            Rules.possible_moves(straight5, straight6),
            [[Card('3', 'spades'),
              Card('4', 'spades'),
              Card('5', 'diamonds')],
             [Card('3', 'spades'),
              Card('4', 'spades'),
              Card('5', 'hearts')]] + [[]])
        straight7 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight8 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        self.assertEqual(Rules.possible_moves(straight7, straight8), [[]])
        straight9 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight10 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'hearts'),
            Card('6', 'spades')
        ]
        self.assertEqual(
            Rules.possible_moves(straight9, straight10),
            [[Card('3', 'spades'),
              Card('4', 'spades'),
              Card('5', 'hearts')],
             [Card('4', 'spades'),
              Card('5', 'hearts'),
              Card('6', 'spades')]] + [[]])
        straight11 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight12 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'hearts'),
            Card('7', 'spades')
        ]
        self.assertEqual(
            Rules.possible_moves(straight11, straight12),
            [[Card('3', 'spades'),
              Card('4', 'spades'),
              Card('5', 'hearts')]] + [[]])
        straight13 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight14 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'hearts'),
            Card('7', 'spades'),
            Card('8', 'spades'),
            Card('9', 'spades')
        ]
        self.assertEqual(
            Rules.possible_moves(straight13, straight14),
            [[Card('3', 'spades'),
              Card('4', 'spades'),
              Card('5', 'hearts')],
             [Card('7', 'spades'),
              Card('8', 'spades'),
              Card('9', 'spades')]] + [[]])
        straight15 = [
            Card('3', 'spades'),
            Card('4', 'spades'),
            Card('5', 'spades')
        ]
        straight16 = []
        self.assertEqual(Rules.possible_moves(straight15, straight16), [[]])

        # Double Straights
        dbl_straight_eq_len1 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        dbl_straight_eq_len2 = [
            Card('3', 'diamonds'),
            Card('3', 'hearts'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('5', 'diamonds'),
            Card('5', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(dbl_straight_eq_len1, dbl_straight_eq_len2),
            [dbl_straight_eq_len2] + [[]])
        not_enough_cards1 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        not_enough_cards2 = [
            Card('3', 'diamonds'),
            Card('3', 'hearts'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('5', 'diamonds')
        ]
        self.assertEqual(
            Rules.possible_moves(not_enough_cards1, not_enough_cards2), [[]])
        not_enough_cards3 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        not_enough_cards4 = [Card('3', 'diamonds')]
        self.assertEqual(
            Rules.possible_moves(not_enough_cards3, not_enough_cards4), [[]])
        three_rank_combinations1 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        three_rank_combinations2 = [
            Card('3', 'diamonds'),
            Card('3', 'hearts'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('5', 'clubs'),
            Card('5', 'diamonds'),
            Card('5', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(three_rank_combinations1,
                                 three_rank_combinations2),
            [
                three_rank_combinations2[:-1],
                three_rank_combinations2[:5] + three_rank_combinations2[-1:],
                three_rank_combinations2[:4] + three_rank_combinations2[-2:]
            ] + [[]])
        four_ranks_of_pairs1 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        four_ranks_of_pairs2 = [
            Card('3', 'diamonds'),
            Card('3', 'hearts'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('5', 'diamonds'),
            Card('5', 'hearts'),
            Card('6', 'diamonds'),
            Card('6', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(four_ranks_of_pairs1, four_ranks_of_pairs2),
            [four_ranks_of_pairs2[:-2], four_ranks_of_pairs2[2:]] + [[]])
        dbl_straight_with_two1 = [
            Card('3', 'spades'),
            Card('3', 'clubs'),
            Card('4', 'spades'),
            Card('4', 'clubs'),
            Card('5', 'spades'),
            Card('5', 'clubs')
        ]
        dbl_straight_with_two2 = [
            Card('3', 'diamonds'),
            Card('3', 'hearts'),
            Card('4', 'diamonds'),
            Card('4', 'hearts'),
            Card('2', 'diamonds'),
            Card('2', 'hearts')
        ]
        self.assertEqual(
            Rules.possible_moves(dbl_straight_with_two1,
                                 dbl_straight_with_two2), [[]])
Ejemplo n.º 17
0
def all_move_combinations(cards):
    """Returns a list of all valid moves of cards.
    cards: a list of Cards.
    """
    cards = sorted(cards, key=Card.hearts_high)
    moves = []

    # Straight combinations.
    strts = []
    temp = []
    [temp.append(Card('3', 'spades')) for _ in range(3)]
    if len(cards) >= 3:
        for i in range(3, len(cards) + 1):
            temp.append(Card('3', 'spades'))
            strt_comb = _find_straights(temp, cards)
            if strt_comb:
                strts.extend(strt_comb)

    # Double straight combinations.
    dbl_strts = []
    temp = []
    [temp.append(Card('3', 'spades')) for _ in range(6)]
    if len(cards) >= 6:
        for i in range(6, len(cards) + 1):
            temp.append(Card('3', 'spades'))
            dbl_strt_comb = _find_double_straights(temp, cards)
            if dbl_strt_comb:
                dbl_strts.extend(dbl_strt_comb)
    # Combine all moves.
    for card in cards:
        moves.append([card])
    moves.extend(
        _find_doubles(
            [Card('3', 'spades'), Card('3', 'spades')], cards))
    moves.extend(
        _find_triples(
            [Card('3', 'spades'),
             Card('3', 'spades'),
             Card('3', 'spades')], cards))
    moves.extend(
        _find_quads([
            Card('3', 'spades'),
            Card('3', 'spades'),
            Card('3', 'spades'),
            Card('3', 'spades')
        ], cards))
    moves.extend(strts)
    moves.extend(dbl_strts)
    return moves
Ejemplo n.º 18
0
def combos_3_of_spades(cards):
    """Returns a list of all moves of a hand containing the 3 of spades."""
    return [
        move for move in all_move_combinations(cards)
        if Card('3', 'spades') in move
    ]
Ejemplo n.º 19
0
 def test_quad(self):
     self.assertEqual(Rules.quad([]), False)
     cards1 = [
         Card('2', 'spades'),
         Card('2', 'spades'),
         Card('2', 'spades'),
         Card('2', 'spades')
     ]
     self.assertEqual(Rules.quad(cards1), True)
     cards2 = [
         Card('2', 'clubs'),
         Card('2', 'spades'),
         Card('2', 'diamonds'),
         Card('2', 'hearts')
     ]
     self.assertEqual(Rules.quad(cards2), True)
     cards3 = [
         Card('2', 'clubs'),
         Card('2', 'spades'),
         Card('2', 'diamonds'),
         Card('A', 'hearts')
     ]
     self.assertEqual(Rules.quad(cards3), False)
Ejemplo n.º 20
0
 def has_3_spades(self):
     """Returns true if player has 3 of spades in their hand."""
     if Card('3', 'spades') in self.hand:
         return True
     return False