Ejemplo n.º 1
0
class CardMatch:
    def __init__(self, card_players):
        self.card_players = card_players
        self.deck = Deck()
        self.deck.shuffle()
        for pl in card_players:
            pl.stats.card_games += 1

    def get_winner(self):
        rank_players = sorted(self.card_players,
                              key=lambda x: x.stats.aces,
                              reverse=True)
        if len(rank_players) > 1:
            if rank_players[0].stats.aces == rank_players[1].stats.aces:
                return None
        return rank_players[0] if rank_players else None

    def playing(self, player: CardPlayer):
        if self.deck.has_cards():
            card_picked = self.deck.take_card()
            player.stats.cards.append(card_picked)
            if card_picked.rank == Ranks.ACE:
                player.stats.aces += 1
            return True
        else:
            return False
Ejemplo n.º 2
0
    def card_game(self, card_match):
        """Card Game"""
        self.render_background()
        deck = Deck()
        deck.shuffle()

        if not card_match.card_players:
            self.render_text("There are no Card Players... Restart the game",
                             (620, 300))
        else:
            while card_match.deck.has_cards():
                for p in card_match.card_players:
                    width_c = 500
                    if card_match.playing(p):
                        self.render_background()
                        self.show_player_scores(card_match.card_players)
                        self.render_image(self.player_pic, (450, 350))
                        self.render_text(p.first_name, (450, 320))
                        pos = 1
                        for card in p.stats.cards:
                            self.render_image(self.card_images[str(card)],
                                              (width_c + 70 * pos, 350))
                            pos += 1

                        pygame.display.flip()
                        time.sleep(0.1)
                    else:
                        return
 def test_deck_shuffle(self):
     deck = Deck()
     random.seed(2020)
     before = deck.cards.copy()
     deck.shuffle()
     after = deck.cards.copy()
     self.assertCountEqual(before, after)
     self.assertNotEqual(before, after)
Ejemplo n.º 4
0
class DeckTestCase(TestCase):
    def setUp(self):
        self.deck = Deck()
        self.test_cards = [
            Card('London', 'Blue'),
            Card('Washington', 'Yellow'),
            Card('Bejing', 'Red'),
            Card('Moscow', 'Black'),
            Card('New York', 'Yellow'),
        ]
        self.deck.cards = self.test_cards.copy()

    def test_prepare(self):
        self.deck.prepare('fake settings')
        self.assertEqual([], self.deck.cards)
        self.assertEqual([], self.deck.discard)

    def test_take_top_card(self):
        card = self.deck.take_top_card()
        self.assertEqual('London', card.name)

        next_card = self.deck.take_top_card()
        self.assertEqual('Yellow', next_card.colour)

    def test_take_bottom_card(self):
        card = self.deck.take_bottom_card()
        self.assertEqual('Yellow', card.colour)

        next_card = self.deck.take_bottom_card()
        self.assertEqual('Moscow', next_card.name)

    def test_add_card(self):
        new_card = Card('Cherepovets', 'Black')
        self.deck.add_card(new_card)

        self.assertEqual('Cherepovets', self.deck.cards[-1].name)

    def test_add_discard(self):
        discarded_card = Card('Cherepovets', 'Black')
        self.deck.add_discard(discarded_card)

        self.assertEqual('Cherepovets', self.deck.discard[-1].name)

    def test_shuffle(self):
        random.seed(42)
        random.shuffle(self.test_cards)

        random.seed(42)
        self.deck.shuffle()
        self.assertEqual(self.test_cards, self.deck.cards)
Ejemplo n.º 5
0
class Game():

    def __init__(self):
        self.players = []
        self.deck = Deck()

    def create_players(self, name, seed=100):
        self.players.append(Player(name, seed))

    def shuffle_deck(self):
        self.deck.shuffle()

    def deal(self):
        for i in range(2):
            for player in self.players:
                player.receive_card(self.deck.pop())

    def get_chip_count(self):
        for player in self.players:
            print(player.get_name(), player.get_wallet())
Ejemplo n.º 6
0
class Shoe:

    def __init__(self, no_decks):
        self.shoe = Deck(no_decks)
        self._cards = queue.Queue(maxsize=52 * no_decks)
        self.shuffle()
        self._add_cards(self.shoe.deck)

    def shuffle(self):
        self.shoe.shuffle()

    def get_queue_size(self):
        return self._cards.qsize()

    def get_card(self):
        card = self._cards.get()
        return card

    def _add_cards(self, cards):
        for card in cards:
            self._cards.put(card)
Ejemplo n.º 7
0
class TestDeck(unittest.TestCase):
    def setUp(self):
        print("running setup")
        self.deck = Deck()

    def test_deck_length(self):
        self.assertEqual(len(self.deck.deck), 52)

    def test_suit_length(self):
        result = 0
        for card in self.deck.deck:
            if card.suit == "Hearts":
                result += 1
        self.assertEqual(result, 13)

    def test_shuffle(self):
        not_expected = self.deck.deck
        print("NOT EXPECTED")
        print(not_expected)
        self.deck.shuffle()
        print("AFTER SHUFFLE")
        print(self.deck.deck)
        self.assertEqual(len(self.deck.deck), 52)
        self.assertNotEqual(not_expected, self.deck.deck)
Ejemplo n.º 8
0
class Blackjack:
    def __init__(self):
        self.__hands = [[], []]
        self.__account = 100
        self.__bet = self.__account + 1
        self.__playerValue = 0
        self.__dealerValue = 0
        self.__deck = Deck()

    def playGame(self):
        user = "******"
        while self.__account > 0 and user == "y":
            # Resetting values and lists for each game
            self.__playerValue = 0
            self.__dealerValue = 0
            self.__bet = self.__account + 1
            self.__hands[0] = []
            self.__hands[1] = []

            self.__betting()
            self.__dealCards()
            self.__playerTurn()
            if self.__playerValue <= 21:
                self.__dealerTurn()
            if self.__playerValue <= 21 and self.__dealerValue <= 21:
                self.__determineWinner()
            if self.__account > 0:
                print("Your account balance is $", self.__account)
                user = str.lower(
                    input("Would you like to play again? (Y or N) "))
                if user != "y":
                    break
        print("Thank you for playing!")
        print("Final balance = $", self.__account)

    def __betting(self):
        print("Your current balance is $", self.__account)
        if self.__account >= 5:
            while self.__bet > self.__account or self.__bet < 5:
                self.__bet = int(
                    input(
                        "Your bet must be between $5 and your account balance.\nHow much would you like"
                        " to bet? "))
        else:
            print("The your bet is ", self.__account)
            self.__bet = self.__account

    def __dealCards(self):
        self.__deck.shuffle()
        for i in range(2):
            self.__hands[0].append(self.__deck.draw())
            self.__hands[1].append(self.__deck.draw())
        print("The dealers second card is: ", self.__hands[1][1], '\n')

    def __playerTurn(self):
        print("Your Hand:", '\n', self.__hands[0][0], '\n', self.__hands[0][1],
              '\n')
        self.__getPlayerValue()
        hit = ""
        while hit == "":
            hit = str(input("Press ENTER to hit or type anything to stay"))
            print('\n')
            if hit == "":
                self.__hands[0].append(self.__deck.draw())
                self.__playerValue += self.__hands[0][len(self.__hands[0]) -
                                                      1].getCardValue()
            if self.__playerValue <= 21:
                print("Your Hand:")
                for i in range(len(self.__hands[0])):
                    print(self.__hands[0][i])
                print('\n')
            else:
                print("You bust!", '\n')
                print("Your Hand:")
                for i in range(len(self.__hands[0])):
                    print(self.__hands[0][i])
                print('\n')
                self.__account -= self.__bet
                break

    def __dealerTurn(self):
        self.__dealerValue = 0
        print("Dealer's Hand:")
        print(self.__hands[1][0])
        print(self.__hands[1][1], '\n')
        self.__getDealerValue()
        while self.__dealerValue < 17:
            print("Dealer takes a card")
            time.sleep(1)
            self.__hands[1].append(self.__deck.draw())
            self.__dealerValue += self.__hands[1][len(self.__hands[1]) -
                                                  1].getCardValue()
        if self.__dealerValue <= 21:
            print("Dealer holds", '\n')
        else:
            print("Dealer busts", '\n')
            self.__account += self.__bet

    def __determineWinner(self):
        print("Dealer's Hand:")
        for i in range(len(self.__hands[1])):
            print(self.__hands[1][i])
        print('\n')
        if self.__playerValue > self.__dealerValue:
            print("You win!")
            print('\n')
            self.__account += self.__bet
        elif self.__playerValue == self.__dealerValue:
            print("It's a tie!")
            print('\n')
        elif self.__playerValue < self.__dealerValue:
            print("You lost!")
            print('\n')
            self.__account -= self.__bet

    def __playAgain(self):
        print("Your account balance is $", self.__account)
        if self.__account > 0:
            user = str.lower("Would you like to play again? (Y or N)")
            if user != "y":
                print("Thank you for playing!")
                print("Final balance = $", self.__account)

    def __getPlayerValue(self):
        for i in range(len(self.__hands[0])):
            self.__playerValue += self.__hands[0][i].getCardValue()
        return self.__playerValue

    def __getDealerValue(self):
        for i in range(len(self.__hands[1])):
            self.__dealerValue += self.__hands[1][i].getCardValue()
        return self.__dealerValue
Ejemplo n.º 9
0
def startGame(players):
    deck = Deck()
    scores = [0, 0, 0, 0]

    for handCount in range(1, 26):
        hand = handCount if handCount < 14 else 26 - handCount
        leading = hand % 4
        won = leading

        #Shuffle the deck
        deck.shuffle()

        #Deal the cards
        for dealing in range(hand):
            for player in players:
                player.deal(deck, deck.cards[0])

        #Display scores
        clear()
        for i in range(4):
            cols = [
                Fore.GREEN, Fore.LIGHTGREEN_EX, Fore.LIGHTYELLOW_EX,
                Fore.YELLOW
            ]
            print(cols[i] + players[i].name + ": " + str(scores[i]), end=" ")
        print(Style.RESET_ALL + "")

        #Determine trump suit
        trump = deck.getTrump()
        fores = [Fore.RED, Fore.BLACK]
        if SHOWOUTPUT:
            print("\nTrump is " + fores[SUITS.index(trump) % 2] + Back.WHITE +
                  trump + " " + Style.RESET_ALL)

        #Make bets
        bets = []
        tricks = [0, 0, 0, 0]
        if SHOWOUTPUT: print("\n" + players[leading].name + " leads\n")

        for player in players:
            i = players.index(player)
            if isinstance(player, Bot):
                bets.append(player.bet(hand - 1, trump, i == 0))
            else:
                bets.append(player.bet())

        for player in players:
            if SHOWOUTPUT:
                print(player.name + " bets " +
                      str(bets[players.index(player)]),
                      end="   ")

        if SHOWOUTPUT: print("\n")

        #Play hand
        for trick in range(hand):
            table = []
            for i in range(4):
                index = (i + won) % 4
                played = players[index].play(table, trump, 0, bets[index])
                players[index].hand.remove(played)
                table.append(played)
                if SHOWOUTPUT:
                    print(players[index].name + " plays " + str(played))

            winner = (getWinner(table, trump) + won) % 4
            if SHOWOUTPUT: print("\n" + players[winner].name + " wins\n")
            won = winner
            tricks[winner] += 1

            #Cleanup table, cards go back to deck
            while len(table) > 0:
                deck.cards.append(table[0])
                table.remove(table[0])

        for i in range(4):
            scores[i] += tricks[i]
            if tricks[i] == bets[i]: scores[i] += 5

        input("Press Enter to continue to next hand")
Ejemplo n.º 10
0
def main(iterations=1):
    running_count = 0
    running_warrior1_wins = 0
    running_warrior2_wins = 0
    running_warrior1_game_wins = 0
    running_warrior2_game_wins = 0

    for i in range(0, iterations):
        warrior1 = Warrior()
        warrior2 = Warrior()

        deck = Deck()
        deck.shuffle()
        deck.shuffle()

        ####################
        # Deal out hands
        ####################
        i = 0
        for card in deck.deck:
            if i % 2 == 0:
                warrior1.add_cards([card])
            else:
                warrior2.add_cards([card])
            i += 1

        ####################
        # Play the game
        ####################
        count = 0
        warrior1_wins = 0
        warrior2_wins = 0
        warrior1_game_wins = 0
        warrior2_game_wins = 0
        while True:

            if int(warrior1.get_queue_size()) == 0:
                print("WINNER Warrior 2")
                warrior2_game_wins += 1
                break

            if int(warrior2.get_queue_size()) == 0:
                print("WINNER Warrior 1")
                warrior1_game_wins += 1
                break

            cards = None

            war1_card = warrior1.get_card()
            # print(war1_card)
            war2_card = warrior2.get_card()
            cards = [war1_card, war2_card]
            # print(war2_card)

            print(
                f"warrior1 [{war1_card.name}-{war1_card.suit}-{war1_card.power}]"
                f" warrior2 [{war2_card.name}-{war2_card.suit}-{war2_card.power}]"
            )

            if war1_card.power > war2_card.power:
                print("Warrior 1 sweeps")
                warrior1_wins += 1
                warrior1.add_cards(cards)
            elif war1_card.power < war2_card.power:
                print("Warrior 2 sweeps")
                warrior2_wins += 1
                warrior2.add_cards(cards)
            else:
                print("WAR")
                while True:

                    warror1_len = int(warrior1.get_queue_size())
                    warrior2_len = int(warrior2.get_queue_size())

                    min_len = min(warror1_len, warrior2_len)

                    if min_len == 0:
                        if warror1_len == 0:
                            warrior2.add_cards(cards)
                            break
                        if warrior2_len == 0:
                            warrior1.add_cards(cards)
                            break

                    print(min_len)
                    if min_len > 3:
                        r = 3
                    elif min_len == 3:
                        r = 2
                    elif min_len == 2:
                        r = 1
                    else:
                        r = 0

                    for i in range(0, r):
                        cards.append(warrior1.get_card())
                        cards.append(warrior2.get_card())

                    war1_war = warrior1.get_card()
                    cards.append(war1_war)
                    war2_war = warrior2.get_card()
                    cards.append(war2_war)

                    if war1_war.power > war2_war.power:
                        print("Warrior 1 sweeps")
                        warrior1_wins += 1
                        warrior1.add_cards(cards)
                        break
                    elif war1_war.power < war2_war.power:
                        print("Warrior 2 sweeps")
                        warrior2_wins += 1
                        warrior2.add_cards(cards)
                        break
                    else:
                        print("WAR AGAIN")
            count += 1

            print(
                f"warrior1 hand: {warrior1.get_queue_size()} warrior2 hand: {warrior2.get_queue_size()}"
            )

            if int(warrior1.get_queue_size()) + int(
                    warrior2.get_queue_size()) != 52:
                print("Invalid deck size")
                break

        warrior1_list = warrior1.queue_to_list()
        warrior2_list = warrior2.queue_to_list()
        warrior1_list.sort(key=lambda x: x.power, reverse=True)
        warrior2_list.sort(key=lambda x: x.power, reverse=True)

        if len(warrior1_list) != 0:
            for item in warrior1_list:
                print(item)

        if len(warrior2_list) != 0:
            for item in warrior1_list:
                print(item)

        print("------------------------------------------------")
        print(f"Iterations: {count}")
        print(f"Warrior1 Wins: {warrior1_wins}")
        print(f"Warrior2 Wins: {warrior2_wins}")
        print("------------------------------------------------")

        running_count += count
        running_warrior1_wins += warrior1_wins
        running_warrior2_wins += warrior2_wins
        running_warrior1_game_wins += warrior1_game_wins
        running_warrior2_game_wins += warrior2_game_wins

    print("*********************************************************")
    print(f"Total iterations: {running_count}")
    print(f"Total Warrior1 Game Wins: {running_warrior1_game_wins}")
    print(f"Total Warrior2 Game Wins: {running_warrior2_game_wins}")
    print(f"Total Warrior1 Wins: {running_warrior1_wins}")
    print(f"Total Warrior2 Wins: {running_warrior2_wins}")
    print("*********************************************************")