コード例 #1
0
ファイル: decks_test.py プロジェクト: zjg/Steam-Tunnel
class TestDeck(unittest.TestCase):
    def setUp(self):
        self.deck = Deck()
        self.fake_cards = [ FakeCard(), FakeCard(), FakeCard() ]
        self.deck.cards = self.fake_cards[:]

    def test_shuffle_randomizes_card_order(self):
        # arrange
        sorted_cards = []
        for i in xrange(10000):
            sorted_cards.append(FakeCard())
        self.deck.cards = sorted_cards[:]
        # act
        self.deck.shuffle()
        # assert
        self.assertEqual(len(self.deck.cards), len(sorted_cards))
        self.assertNotEqual(self.deck.cards, sorted_cards)
    
    def test_shuffle_flips_cards(self):
        # arrange
        Deck.SHUFFLE_FLIP_PROBABILITY = 1.0
        # act
        self.deck.shuffle()
        # assert
        for card in self.fake_cards:
            self.assertTrue(card.flip_called)
    
    def test_nextCard_returns_cards_in_correct_order(self):
        # arrange
        next_cards = []
        # act
        for i in range(len(self.fake_cards)):
            next_cards.append(self.deck.nextCard())
        # assert
        self.assertEqual(next_cards, self.fake_cards)

    def test_nextCard_throws_exception_when_deck_empty(self):
        # arrange
        try:
            # act
            for i in range(len(self.fake_cards) + 1):
                self.deck.nextCard()
        except DeckEmptyException:
            pass
コード例 #2
0
class BlackJack:
    """ BlackJackClass - Main actions for the game """
    class Mode:
        dark = 0
        one_up = 1
        dark_dealer = 2
        one_up_dealer = 3

    def __init__(self,
                 *names,
                 console,
                 bet=100,
                 cash=500,
                 players=2,
                 mode=Mode.dark):
        self.__mode = mode
        self.__bet = bet
        self.__csl = console
        if players < len(names):
            players = len(names) + 1
        self.players = [
            BJPlayer(name=nome, npc=False, cash=cash) for nome in names
        ]
        for i in range(players - len(self.players)):
            self.players.append(BJPlayer(name=f'NPC-{i}', npc=True, cash=cash))
        if len(self.players) > 7:
            raise Exception("No more than 7 players, please...")
        if mode in [self.Mode.dark_dealer, self.Mode.one_up_dealer]:
            self.players.append(
                BJPlayer(name="Dealer", npc=True, cash=float('inf')))
        self.deck = Deck()

    def __enter__(self):
        self.start()
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if exc_val is not None:
            raise exc_val

    # ------------------- functions for playing ----------------------------------
    def start(self):
        # Initialize each player hand with 2 cards
        self.deck.shuffle()
        while sum(len(player)
                  for player in self.players) < 2 * len(self.players):
            for player in self.players:
                player.get_card(self.deck.draw())
        for player in self.players:
            if player.name == 'Dealer' and player.is_npc:
                while abs(
                        player
                ) < 17:  # For dealer type games, dealer cannot start with less than 17 points
                    player.get_card(self.deck.draw())

    def roll(self):  # Play a round
        plays = 0
        for player in self.players:
            if not player.burn:
                if not (player.name == 'Dealer' and player.is_npc):
                    plays += 1
        result = {
            'asks': 0,
            'non-asks': 0,
            'unknown': plays
        }  # plays counts the number of players in the roll
        while result['unknown'] > 0:
            for player in self.players:
                if player.name == 'Dealer' and player.is_npc:  # Dealers only draw cards in the game start
                    continue
                if not player.burn:
                    if player.is_npc:
                        draws = round(random())
                        if draws == 1:  # Modify with machine learning decision making in future version
                            result['asks'] += 1
                            result['unknown'] -= 1
                            player.get_card(self.deck.draw())
                            if player.burn:
                                self.__csl.print(
                                    f'\n==========\n{player.name} BURNS\n===========\n',
                                    self.__csl.textColor.RED)
                        else:
                            result['non-asks'] += 1
                            result['unknown'] -= 1
                    else:
                        if self.__mode == self.Mode.dark or self.__mode == self.Mode.dark_dealer:
                            adver = {
                                play.name: f"{len(play)} cards"
                                for play in self.players
                            }
                        else:
                            adver = {
                                play.name:
                                f"{play.hand[0]} => {len(play)} cards"
                                for play in self.players
                            }
                        self.__csl.print(
                            str("\n\n"
                                f"Player: {player.name}\n\n"
                                f"Opponent:\n"
                                f"{adver}\n"
                                f"Your cards {[card for card in player.hand]} Sum = {abs(player)}\n\n"
                                f"Draw a card? (y/n):\n"))
                        ask = input()
                        while ask.lower() not in ['y', 'n']:
                            ask = input(
                                f"{self.__csl.textColor.YELLOW}Sorry?!\n{self.__csl.style.RESET_ALL}"
                                f"Wanna draw a card? (y/n):\n")
                        if ask.lower() == 'y':
                            result['asks'] += 1
                            result['unknown'] -= 1
                            player.get_card(self.deck.draw())
                            if player.burn:
                                self.__csl.print(
                                    f'\n==========\n{player.name} BURNS\n===========\n',
                                    self.__csl.textColor.RED)
                        else:  # if 'n'
                            result['non-asks'] += 1
                            result['unknown'] -= 1
                player.last_roll = result
            asks = result['asks']
        return result

    def play(self):
        res = 1
        while res > 0:
            self.__csl.clear()
            res = self.roll()['asks']
        self.__csl.clear()
        result = {
            player.name: ('Burn' if player.burn else
                          'BlackJack' if abs(player) == 21 else abs(player))
            for player in self.players
        }
        self.__csl.print(result)
        val = max(abs(player) for player in self.players if not player.burn)
        lista = [player for player in self.players if abs(player) == val]
        for player in self.players:
            if player in lista:
                player += self.__bet * len(self.players) / len(lista)
            else:
                player -= self.__bet

    # ------------------- TODO ----------------------------------
    def showTable():
        pass

    def showPlayerOptions():
        pass

    def showResults():
        pass