예제 #1
0
class Game:
	
	def __init__(self, num_players=1, num_decks=6):
		self.num_decks = num_decks
		self.dealer = Dealer()
		self.bot = Bot('Bot')
		self.players = []
		self.busted = []
		self.stand = []
		self.move = 0
		self.dealer_done = False
		self.bot_moves = []
		for i in xrange(0,num_players):
			self.players.append(Player('Player'+str(i+1)))

		self.players.append(self.bot)
		self.deck = Deck(num_decks)
		self.bot_deck = self.deck.deck * 1
		for player in self.players:
			player.make_bet()
			if player.name == 'Bot':
				player.add(self.bot_deck.pop())
				player.add(self.bot_deck.pop())
				self.bot_deck.pop()
				self.bot_deck.pop()
			else:
				player.add(self.deck.draw())
				player.add(self.deck.draw())
				self.dealer.add(self.deck.draw())
				self.dealer.add(self.deck.draw())

		self.rules = RulesEngine(self.dealer, self.players)

	def ongoing(self):
		return not len(self.players) == 0 or not self.dealer_done

	def winner(self):
		self.stand.sort(key=lambda x: x.val)
		self.stand.reverse()
		winner = self.dealer if self.dealer.val <= 21 else Player("Default")
		for player in self.stand:
			if player.val > winner.val:
				winner = player
		return winner

	def payout(self):
		self.rules.update(self.stand)

	def reset(self):
		self.players = self.rules.players
		self.stand = []
		self.busted = []
		self.dealer_done = False
		self.bot.update(self.players+[self.dealer])
		if len(self.deck.deck) <= self.deck.num_decks*52*0.25: # re-shuffle if < 75% of deck left
			self.deck.deck = self.deck.generate(self.deck.num_decks)
			self.deck.shuffle()
			self.reset_count()

		self.dealer.clear_hand()
		for player in self.players:
			player.clear_hand()
		self.bot_deck = self.deck.deck * 1
		for player in self.players:
			player.make_bet()
			if player.name == 'Bot':
				player.add(self.bot_deck.pop())
				player.add(self.bot_deck.pop())
				self.bot_deck.pop()
				self.bot_deck.pop()
			else:
				player.add(self.deck.draw())
				player.add(self.deck.draw())
				self.dealer.add(self.deck.draw())
				self.dealer.add(self.deck.draw())
		
		self.bot_moves = []

	def move_player(self, player, hand):
		newplayers = []
		
		if self.players[0].name == "Bot":
			move = player.play(self.dealer,hand)
		else:
			move = self.move

		if move == 1:
			player.add(self.deck.draw(),hand)
			if hand == len(player.hands)-1:
				newplayers.append(player)

		elif move == -1:
			if hand == len(player.hands)-1:
				self.busted.append(player)

		elif move == 2:
			player.add(self.deck.draw(),hand)
			player.doubled_down = True
			player.cash -= player.bet
			player.bet *= 2
			if hand == len(player.hands)-1:
				newplayers.append(player)

		elif move == 3:
			player.aces.append(0)
			player.tmp.append(0)

			player.hands.append([])
			card2 = player.hands[0].pop()
			player.val[0] = 0
			player.add(player.hands[0].pop(),0)
			player.cash -= player.bet
			player.val.append(0)
			player.add(card2,1)
			player.add(self.deck.draw(),0)
			player.add(self.deck.draw(),1)
			newplayers.append(player)

	def run(self):
		newplayers = []

		move = self.dealer.play()
		if move == 1:
			self.dealer.add(self.deck.draw())
			self.bot_deck.pop()
		else:
			self.dealer_done = True

		for i in xrange(0,len(self.players)):
			for j in xrange(0,len(self.players[i].hands)):
				if self.players[i].name == "Bot":
					move = self.players[i].play(self.dealer,j)
					if move == 2 and len(self.bot.hands[j]) > 2:
						move = 1
					if not (move == 0 and (j,move) in self.bot_moves):
						self.bot_moves.append((j,move))
				else:
					move = self.move

				if move == 1:
					if self.players[i].name == 'Bot':
						self.players[i].add(self.bot_deck.pop(),j)
					else:
						self.players[i].add(self.deck.draw(),j)
					if j == len(self.players[i].hands)-1:
						newplayers.append(self.players[i])

				elif move == -1:
					if j == len(self.players[i].hands)-1:
						self.busted.append(self.players[i])

				elif move == 2:
					if self.players[i].name == 'Bot':
						self.players[i].add(self.bot_deck.pop(),j)
					else:
						self.players[i].add(self.deck.draw(),j)
					self.players[i].doubled_down = True
					self.players[i].cash -= self.players[i].bet
					self.players[i].bet *= 2
					if j == len(self.players[i].hands)-1:
						newplayers.append(self.players[i]) # STAND?

				elif move == 3:
					self.players[i].aces.append(0)
					self.players[i].tmp.append(0)

					self.players[i].hands.append([])
					card2 = self.players[i].hands[0].pop()
					self.players[i].val[0] = 0
					self.players[i].add(self.players[i].hands[0].pop(),0)
					self.players[i].cash -= self.players[i].bet
					self.players[i].val.append(0)
					self.players[i].add(card2,1)
					
					if self.players[i].name == 'Bot':
						self.players[i].add(self.bot_deck.pop(),0)
						self.players[i].add(self.bot_deck.pop(),1)						
					else:
						self.players[i].add(self.deck.draw(),0)
						self.players[i].add(self.deck.draw(),1)
					newplayers.append(self.players[i])
					
				else:
					if j == len(self.players[i].hands)-1:
						self.stand.append(self.players[i])

		self.players = newplayers

	def reset_count(self):
		self.bot.rcount = 0
		self.bot.tcount = 0
		self.bot.dead_cards = 0

	def __repr__(self):
		repr = ['\n']
		repr.append('Dealer: ' + str(self.dealer))
		for player in self.players:
			repr.append('Active Player --> ' + str(player))
		for player in self.stand:
			repr.append('Standing Player --> ' + str(player))
		for player in self.busted:
			repr.append('Busted Player --> ' + str(player))
		repr.append('\n')
		return '\n'.join(repr)
예제 #2
0
class Game(object):
    """
    A sequence of Blackjack Rounds that keeps track of total money won or lost
    """
    def __init__(self, strategy=None):
        self.shoe = Shoe(SHOE_SIZE)
        self.money = 0.0
        self.bet = 1.0
        self.stake = 1.0
        self.player = Player(strategy=strategy)
        self.dealer = Dealer()

    def get_status(self, hand):
        if not hand.surrender:
            if hand.busted():
                status = "LOST"
            else:
                if hand.blackjack():
                    if self.dealer.hand.blackjack():
                        status = "PUSH"
                    else:
                        status = "WON 3:2"
                elif self.dealer.hand.busted():
                    status = "WON"
                elif self.dealer.hand.value < hand.value:
                    status = "WON"
                elif self.dealer.hand.value > hand.value:
                    status = "LOST"
                elif self.dealer.hand.value == hand.value:
                    if self.dealer.hand.blackjack():
                        status = "LOST"  # player's 21 vs dealers blackjack
                    else:
                        status = "PUSH"
        else:
            status = "SURRENDER"
        return status

    def get_hand_winnings(self, hand):
        win = 0.0
        bet = self.stake
        status = self.get_status(hand)

        if status == "LOST":
            win += -1
        elif status == "WON":
            win += 1
        elif status == "WON 3:2":
            win += 1.5
        elif status == "SURRENDER":
            win += -0.5
        if hand.doubled:
            win *= 2
            bet *= 2

        win *= self.stake

        return win, bet, status

    def play_round(self):
        self.stake = 1.0

        player_hand = Hand([self.shoe.deal(), self.shoe.deal()])
        dealer_hand = Hand([self.shoe.deal()])
        self.player.set_hands(player_hand, dealer_hand)
        self.dealer.set_hand(dealer_hand)
        print "Dealer Hand: %s" % self.dealer.hand
        print "Player Hand: %s\n" % self.player.hands[0]

        self.player.play(self.shoe)
        self.dealer.play(self.shoe)

        for hand in self.player.hands:
            win, bet, flag = self.get_hand_winnings(hand)
            self.money += win
            self.bet += bet

        self.player.strategy.record_result(hand, self.player, win)
        # print "Player Hand: %s %s (Value: %d, Busted: %r, BlackJack: %r, Splithand: %r, Soft: %r, Surrender: %r, Doubled: %r)" % (hand, status, hand.value, hand.busted(), hand.blackjack(), hand.splithand, hand.soft(), hand.surrender, hand.doubled)

        # print "Dealer Hand: %s (%d)" % (self.dealer.hand, self.dealer.hand.value)
        print self.player.strategy.qlearner.print_q()

    def get_money(self):
        return self.money

    def get_bet(self):
        return self.bet
예제 #3
0
파일: Game.py 프로젝트: bweis/blackjack-cli
class Game(object):
    def __init__(self):
        self.shoe = Shoe(DECKS_IN_SHOE)
        self.players = []
        self.dealer = Dealer()

    def init_game(self):
        print('''
            .------.
            |A_  _ |         Welcome to Ben's Blackjack Game
            |( \/ ).-----.    
            | \  /|J /\  |     Please follow the prompts below
            |  \/ | /  \ |
            `-----| \  / |
                  |  \/ J|
                  `------'
            ''')
        self.init_players()

    def init_players(self):
        player_count = get_non_negative_int_lt(
            "How many players will be playing: ", 6)
        for i in range(1, int(player_count) + 1):
            name = input("Player %d name: " % i)
            self.players.append(Player(name))
        print('\n', end='')

    def play(self):
        while True:
            self.play_round()

    def play_round(self):
        self.take_bets()
        self.display_dealer()
        for player in self.players:
            print(f"\nIt is now {player.name}'s turn")
            self.play_hand(player)

        self.dealer.play(self.shoe)
        self.display_dealer()
        self.resolve_bets()
        self.display_money()
        self.kick_players()

    def take_bets(self):
        for player in self.players:
            bet_amount = get_non_negative_int_lt(
                f"How much would {player.name} like to bet? [Minimum: ${MINIMUM_BET}, Balance: {player.money}]: $",
                player.money, "You can not bet that amount!")
            if bet_amount < MINIMUM_BET:
                bet_amount = MINIMUM_BET
            player.money -= bet_amount
            player.set_hand(
                Hand([self.shoe.deal(), self.shoe.deal()], bet_amount))
        self.dealer.set_hand(Hand([self.shoe.deal(), self.shoe.deal()]))
        print('\n', end='')

    def display_dealer(self):
        print("Dealer's Hand:", self.dealer.hand)

    def play_hand(self, player):
        for i, hand in enumerate(player.hands):
            while not hand.busted() and not hand.stayed:
                print(f"\t{player.name}'s hand {i+1}\n\t", hand)
                choice = self.handle_hand_options(player, hand)

                if choice == 'Hit':
                    print(f"\t{player.name} chose to Hit!")
                    player.hit(hand, self.shoe)
                elif choice == 'Stay':
                    print(f"\t{player.name} chose to Stay!")
                    player.stay(hand)
                elif choice == "Double Down":
                    print(f"\t{player.name} chose to Double Down!")
                    player.double_down(hand, self.shoe)
                elif choice == "Split":
                    print(f"\t{player.name} chose to Split!")
                    player.split(hand)

            if hand.busted():
                print(f"\t{player.name}'s final hand {i+1} went bust\n\t",
                      hand)
            else:
                print(f"\t{player.name}'s final hand {i+1}\n\t", hand)
            print('\n', end='')

    def handle_hand_options(self, player, hand):
        option_number = 1
        valid_options = []
        print('\tType the corresponding number:')
        print(f"\t\t[{option_number}] 'Stay'")
        valid_options.append('Stay')
        option_number += 1

        if hand.value < 21:
            print(f"\t\t[{option_number}] 'Hit'")
            valid_options.append('Hit')
            option_number += 1

        if hand.length(
        ) == 2 and hand.value != 21 and player.money > hand.bet and not hand.split_hand:
            print(f"\t\t[{option_number}] 'Double Down'")
            valid_options.append('Double Down')
            option_number += 1

        if hand.splitable() and len([
                h for h in player.hands if h.split_hand
        ]) <= SPLIT_LIMIT and player.money > hand.bet:
            print(f"\t\t[{option_number}] 'Split'")
            valid_options.append('Split')
            option_number += 1
        choice = get_non_negative_int_lt('\tChoice: ',
                                         max_val=option_number - 1,
                                         err="That is an invalid choice")
        print('\n', end='')
        return valid_options[choice - 1]

    def display_money(self):
        for player in self.players:
            print(f"{player.name} has ${player.money}")
        print("\n", end='')

    def resolve_bets(self):
        print(f"\tBetting Results:")
        dealer_value = self.dealer.hand.value
        dealer_blackjack = self.dealer.hand.blackjack()

        for player in self.players:
            for hand in player.hands:
                if not hand.busted() and hand.value > dealer_value:
                    player.money += hand.bet * WIN_MULTIPLIER
                    print(f"\t{player.name} won ${hand.bet * WIN_MULTIPLIER}")
                elif not hand.busted(
                ) and hand.value == dealer_value and not dealer_blackjack:
                    player.money += hand.bet
                    print(f"\t{player.name} pushed")
                else:
                    print(f"\t{player.name} lost his bet of ${hand.bet}")
        print('\n', end='')

    def kick_players(self):
        for player in self.players:
            if player.money == 0:
                self.players.remove(player)
                print(f"{player.name} has been eliminated")
                print("\n", end='')
예제 #4
0
파일: Game.py 프로젝트: namngo/uno-server
class Game(BaseClass):
    """
        The Game
    """

    def __init__(self, com, minPl, maxPl, cd_join, cd_kick, d):
        BaseClass.__init__(self)
        

        self.com = com

        self.minPl = minPl
        self.maxPl = maxPl
        self.maxQueue = 20
        self.cd_join = cd_join
        self.cd_kick = cd_kick

        self.com.regEvt("chat", self.chat)
        self.com.regEvt("join", self.join)
        self.com.regEvt("play", self.pl_play)
        self.com.regEvt("client_error", self.cl_er)

        self.clients = []
        self.debug = d

    def setup_new_game(self):
        self.log("Setting up new game")
        self.dealer = Dealer(self, self.cd_kick)
        self.dealer.regEvt("won", self.pl_won)
        self.dealer.regEvt("kick", self.pl_kicked)

        self.status = 0
        self.count_time = 0
        self.playing_list = []
        
        for c in self.clients:
            c.playerId = 0

        self.check_countdown()

    def start_game(self):
        """
            this is the actual start game method
            counting down is another one
        """
        self.log("starting game")
        n = len(self.clients)
        if n > self.maxPl:
            n = self.maxPl

        self.total_player = n

        for i in xrange(0, n):
            self.clients[i].playerId = i + 1
            self.playing_list.append(self.clients[i])

        self.dealer.start_game(n)
        self.status = 2 # playing

    #time comes
    #this is called every time in the outer loop
    #it will check 2 things: counting down in the game
    #and counting down in player move
    def check_time(self):
        now = time.time()
        if self.status == 1: #waiting
            if now - self.count_time >= self.cd_join: #time up
                self.start_game()
        elif self.status == 2: #playing
            self.dealer.check_time()

    #event

    def chat(self, sockId, msg):
        playerName = self.by_sockId(sockId).playerName
        self.com.bc_chat(playerName, msg)

    def join(self, sockId, msg):
        if len(self.clients) > self.maxQueue:
            self.com.kick_bysockId(sockId)
            return

        for c in self.clients:
            if c.sockId == sockId:
                self.com.s_invalid(sockId, "You already joined")
                return
            if c.playerName == msg:
                self.com.s_invalid(sockId, "The name is already taken")
                return

        try:
            p = PlayerInfo(msg, 0, sockId)
        except:
            self.com.s_invalid(sockId, msg)
            return

        self.clients.append(p)
        self.com.s_accept(sockId, msg)

        if self.status == 0 or self.status == 1: # waiting or counting
            self.check_countdown()
        else:
            self.com.s_wait(sockId, msg)

        self.com.bc_newplayer(self.all_player())

    def pl_play(self, sockId, msg):
        if self.status == 2:
            player = self.by_sockId(sockId)
            try:
                self.dealer.play(player.playerId, msg)
            except UnoException as e:
                self.com.s_invalid(sockId, e.__str__())

    def pl_won(self, playerId):
        playerName = self.by_playerId(playerId).playerName
        self.com.bc_gg(playerName)
        self.setup_new_game()

    def pl_kicked(self, playerId):
        p = self.by_playerId(playerId)
        self.playing_list.remove(p)
        self.kick(p)

    def cl_er(self, sockId):
        try:
            player = self.by_sockId(sockId)
        except Exception as e:
            return 

        if player in self.playing_list:
            self.dealer.kick_player(player.playerId)
        else:
            self.kick(player)
            if self.status == 1: #counting
                self.check_countdown()
                            
    def kick(self, p):
        sockId = p.sockId
        self.clients.remove(p)
        self.com.kick_bysockId(sockId)
        self.com.bc_newplayer(self.all_player())

    #check if we should start counting down
    def check_countdown(self):
        if len(self.clients) >= self.minPl and len(self.clients) <= self.maxPl:
            self.count_time = time.time()
            self.status = 1
        else:
            self.status = 0

    
    #helper
    def all_player(self):
        n = len(self.clients)
        all_player = ",".join([p.playerName for p in self.clients if p.playerId <= n])
        return all_player

    def by_sockId(self, sockId):
        return [c for c in self.clients if c.sockId == sockId][0]

    def by_playerId(self, playerId):
        return [c for c in self.playing_list if c.playerId == playerId][0]

    def by_name(self, name):
        return [c for c in self.client if c.playerName == name][0]

    def log(self, s):
        if self.debug:
            print s

    #send method from player class

    def com_s_deal(self, playerId, msg):
        self.log("Sending deal to: %d with %s" % (playerId, msg))
        sockId = self.by_playerId(playerId).sockId
        self.com.s_deal(sockId, msg)

    def com_s_go(self, playerId, msg):
        sockId = self.by_playerId(playerId).sockId
        self.com.s_go(sockId, msg)

    def com_bc_gg(self, playerId):
        playerName = self.by_playerId(playerId).playerName
        self.com.bc_gg(playerName)

    def com_bc_uno(self, playerId):
        playerName = self.by_playerId(playerId).playerName
        self.com.bc_uno(playerName)

    def com_bc_play(self, playerId, msg):
        playerName = self.by_playerId(playerId).playerName
        self.com.bc_play(playerName, "%s,%s" % (playerName, msg))

    def com_bc_startgame(self):
        msg = ",".join([p.playerName for p in self.playing_list])
        self.com.bc_start(msg)
예제 #5
0
class CasinoBJTable(object):
    DEBUG = False
    ROLLOUTS = False

    def __init__(self, numDecks, numPlayers):
        self.numDecks = numDecks
        self.deck = Shoe(numDecks)
        self.dealer = Dealer(Dealer.bankStart, numDecks)
        self.playersList = []
        self.numPlayers = numPlayers
        for i in range(0, numPlayers):
            if CasinoBJTable.ROLLOUTS:
                playerPerson = Player(i, Player.startingBank, numDecks)
                self.playersList.append(playerPerson)
            else:
                self.playersList.append(
                    ROPlayer(i, Player.startingBank, numDecks,
                             "MEGA_DICT.bin"))
                self.playersList.append(
                    BSPlayer(i, Player.startingBank, numDecks))
                self.playersList.append(
                    CCPlayer(i, Player.startingBank, numDecks))
                # self.playersList.append(Dealer(Dealer.bankStart, numDecks))
                shuffle(self.playersList)

    def givePlayerCard(self, player):
        aCard = self.deck.getTopCard()
        print "Giving the player: " + aCard
        player.getCard(aCard, 0)

    def updatePlayers(self, aCard):
        for i in range(0, self.numPlayers):
            self.playersList[i].countCard(aCard)

    def saveGameState(self):
        exit("Save Not implemented")

    def playRound(self):
        for pl in self.playersList:
            counter = 0
            moreHands = True

            if CasinoBJTable.DEBUG:
                StaticBJLogger.writeDealerMove(
                    DealerMove("TEST" + str(pl.getHands()[0].getHandValue()),
                               pl.getHands()[counter]))  # Move.NOTCOMPLETE))
            while moreHands:
                old = len(pl.getHands())
                while counter < len(pl.getHands()):
                    if CasinoBJTable.DEBUG:
                        print "counter:", counter

                    keepGoing = True
                    while keepGoing == True:
                        if CasinoBJTable.DEBUG:
                            keepGoing = pl.play(counter)
                        else:
                            keepGoing = pl.play(
                                counter,
                                self.dealer.getVisibleHand(0).getHandValue())
                        if keepGoing == True:
                            newCard = self.deck.getTopCard()
                            pl.getHands()[counter].addCard(newCard)
                            self.updatePlayers(newCard)
                            if CasinoBJTable.ROLLOUTS:
                                StaticBJLogger.writeDealerMove(
                                    DealerMove(
                                        self.dealer.getVisibleHand(
                                            0).getHandValue(),
                                        Move.NOTCOMPLETE))

                    counter += 1
                if CasinoBJTable.DEBUG:
                    print "OUT"
                moreHands = (old != len(pl.getHands()))

        keepGoing = True
        while keepGoing == True:
            keepGoing = self.dealer.play(None, None)

            if keepGoing == True:
                newCard = self.deck.getTopCard()
                self.dealer.getHands()[0].addCard(newCard)
                self.updatePlayers(newCard)

        if (CasinoBJTable.ROLLOUTS):
            if (len(pl.getHands()) == 2):
                if (self.dealer.getHands()[0].isBust()
                        and pl.getHands()[0].isBust()
                        and pl.getHands()[1].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.NOTCOMPLETE))
                elif (self.dealer.getHands()[0].isBust()
                      and not pl.getHands()[0].isBust()
                      and not pl.getHands()[1].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.WON_BOTH))
                elif (self.dealer.getHands()[0].isBust()
                      and pl.getHands()[0].isBust()
                      and not pl.getHands()[1].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.WON_HAND_2))
                elif (self.dealer.getHands()[0].isBust()
                      and not pl.getHands()[0].isBust()
                      and pl.getHands()[1].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.WON_HAND_1))
                elif (
                        not self.dealer.getHands()[0].isBust() and
                    (pl.getHands()[0].isBust() and pl.getHands()[1].isBust())):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.LOST))
                elif (not self.dealer.getHands()[0].isBust()
                      and not pl.getHands()[0].isBust()
                      and pl.getHands()[1].isBust()):
                    if (self.dealer.getHands()[0].getHandValue() >=
                            pl.getHands()[0].getHandValue()):
                        StaticBJLogger.writeDealerMove(
                            DealerMove(
                                self.dealer.getHands()[0].getHandValue(),
                                Move.LOST))
                    else:
                        StaticBJLogger.writeDealerMove(
                            DealerMove(
                                self.dealer.getHands()[0].getHandValue(),
                                Move.WON_HAND_1))
                elif (not self.dealer.getHands()[0].isBust()
                      and pl.getHands()[0].isBust()
                      and not pl.getHands()[1].isBust()):
                    if (self.dealer.getHands()[0].getHandValue() >=
                            pl.getHands()[1].getHandValue()):
                        StaticBJLogger.writeDealerMove(
                            DealerMove(
                                self.dealer.getHands()[0].getHandValue(),
                                Move.LOST))
                    else:
                        StaticBJLogger.writeDealerMove(
                            DealerMove(
                                self.dealer.getHands()[0].getHandValue(),
                                Move.WON_HAND_2))
                elif (not self.dealer.getHands()[0].isBust()
                      and not pl.getHands()[0].isBust()
                      and not pl.getHands()[1].isBust()):
                    if (self.dealer.getHands()[0].getHandValue() >=
                            pl.getHands()[0].getHandValue()):
                        if (self.dealer.getHands()[0].getHandValue() >=
                                pl.getHands()[1].getHandValue()):
                            StaticBJLogger.writeDealerMove(
                                DealerMove(
                                    self.dealer.getHands()[0].getHandValue(),
                                    Move.LOST))
                        else:
                            StaticBJLogger.writeDealerMove(
                                DealerMove(
                                    self.dealer.getHands()[0].getHandValue(),
                                    Move.WON_HAND_2))
                    else:
                        if (self.dealer.getHands()[0].getHandValue() >=
                                pl.getHands()[1].getHandValue()):
                            StaticBJLogger.writeDealerMove(
                                DealerMove(
                                    self.dealer.getHands()[0].getHandValue(),
                                    Move.WON_HAND_1))
                        else:
                            StaticBJLogger.writeDealerMove(
                                DealerMove(
                                    self.dealer.getHands()[0].getHandValue(),
                                    Move.WON_BOTH))

            else:
                # House rules: tie on a bust for dealer and player
                if (self.dealer.getHands()[0].isBust()
                        and pl.getHands()[0].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.NOTCOMPLETE))
                elif (self.dealer.getHands()[0].isBust()
                      and not pl.getHands()[0].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.WON_HAND_1))
                elif (not self.dealer.getHands()[0].isBust()
                      and pl.getHands()[0].isBust()):
                    StaticBJLogger.writeDealerMove(
                        DealerMove(self.dealer.getHands()[0].getHandValue(),
                                   Move.LOST))
                elif (not self.dealer.getHands()[0].isBust()
                      and not pl.getHands()[0].isBust()):
                    if (self.dealer.getHands()[0].getHandValue() >=
                            pl.getHands()[0].getHandValue()):
                        StaticBJLogger.writeDealerMove(
                            DealerMove(
                                self.dealer.getHands()[0].getHandValue(),
                                Move.LOST))
                    else:
                        StaticBJLogger.writeDealerMove(
                            DealerMove(
                                self.dealer.getHands()[0].getHandValue(),
                                Move.WON_HAND_1))
        else:
            for pl in self.playersList:
                gm = GameMove()

                for val in pl.getHandsVals():
                    if val > 21:
                        gm.incBust()
                    elif val > self.dealer.getHands()[0].getHandValue():
                        gm.incWon()
                    else:
                        gm.incLoss()

                if isinstance(pl, BSPlayer):
                    if CasinoBJTable.DEBUG:
                        print "BS"
                    StaticBJGameLogger.writeBSMove(gm)
                elif isinstance(pl, ROPlayer):
                    if CasinoBJTable.DEBUG:
                        print "RO"
                    StaticBJGameLogger.writeROMove(gm)
                elif isinstance(pl, CCPlayer):
                    if CasinoBJTable.DEBUG:
                        print "CC"
                    StaticBJGameLogger.writeCCMove(gm)
                elif isinstance(pl, Dealer):
                    if CasinoBJTable.DEBUG:
                        print "Dealer"
                    StaticBJGameLogger.writeDealerMove(gm)
                else:
                    if CasinoBJTable.DEBUG:
                        "wah wah"

    def initPlayers(self):
        for i in range(0, 2):
            for pl in self.playersList:
                newCard = self.deck.getTopCard()
                pl.getHands()[0].addCard(newCard)
                self.updatePlayers(newCard)

            if (i == 1):  # Hide the dealers other card
                topCard = self.deck.getTopCard()
                topCard.setIsVisible(False)
                self.dealer.getHands()[0].addCard(topCard)
            else:
                newCard = self.deck.getTopCard()
                self.dealer.getHands()[0].addCard(newCard)
                self.updatePlayers(newCard)

    def resetPlayers(self):
        for pl in self.playersList:
            pl.setHand([Hand([])])
            pl.hasDouble = False
            pl.hasSplit = False
        self.dealer.setHand([Hand([])])

    def __repr__(self):
        strPlayers = ""
        for i in range(0, self.numPlayers):
            strPlayers += str(self.playersList[i])
            strPlayers += "\n"
        return (strPlayers)

    # plays blackjack till a specific time
    # day, hour, minute is the ending time for the function
    def play(self, day, hour, minute):
        endTime = DateTimeCustom(day, hour, minute)
        self.resetPlayers()
        while not endTime.greaterEqualTo():
            if self.deck.yellowCardPassed():
                del self.deck
                self.deck = Shoe(self.numDecks)

            self.initPlayers()
            self.playRound()
            self.resetPlayers()