Beispiel #1
0
class BlackJack:
	'''
	Creates and manages the game.Check for the condition of the game whether player wins, loss or busted.
	'''
	def __init__(self):
		self.moves = ["hit","stand","double","split"]
		self.deck = Deck()
		self.player = Player()
		self.player_hand = []
		self.player_hand.append(Hand()) 
		self.dealer_hand = Hand()
	
	
	def place_bet(self):
		if self.player.get_fund() < 1:
			print("Sorry,not enough fund to play. Start a new game.")
			input()
			sys.exit(0)

		print("You have {0:.2f}".format(self.player.get_fund())+" chips.")
		
		while True:
			try:
				bet = int(input("Place your bet: "))
				if bet < 1:
					bet = int(input("Bet must be at least 1 chip.Try Again!!! "))
				elif self.player.get_fund() < bet:
					bet = int(input("Not enough chips.Try Again!!! "))
				else:
					break
		
			except ValueError:
				print("Doesn't looks like valid bet.Try Again!!!")

		self.player.current_bet(bet)

	
	def play_hit(self,current_hand, hand_index = 0):
				new_card = self.deck.deal_card()
				current_hand.add_card(new_card)
				print(new_card.get_rank()+" of " + new_card.get_suit())
				
				if current_hand.get_value() > 21:
					self.player.busted[hand_index] = True

	
	def play_double(self):
		if len(self.player_hand[0].hand) == 2 and not self.player.is_split(): 		#Allowed only in initial hands
			try:
				double_bet = int(input("Enter the double bet amount: "))
			except ValueError:
				double_bet = int(input("Please enter the valid integer positive number: "))

			if double_bet <= self.player.current_fund() and double_bet <= self.player.bet[0]:
				self.player.current_bet(double_bet)
				new_card = self.deck.deal_card()
				self.player_hand[0].add_card(new_card)
				print(new_card.get_rank()+" of " + new_card.get_suit())
				
				if self.player_hand[0].get_value() > 21:
					self.player.busted[0] = True
				elif self.player_hand[0].get_value == 21:
					self.player.blackjack = True
				else:
					pass
	

			else:
				print("You should have enough chips and the double cannot be more then 100% of original bet.Try Again!!")
				
		else:
			print("You can only Double Down initially when not playing split.Try other move!!")

	
	def play_split(self):
		hand_cards = self.player_hand[0].get_hand()
		
		if len(hand_cards) == 2 and hand_cards[0].get_rank() == hand_cards[1].get_rank():
			if self.player.get_bet() <= self.player.current_fund():
				self.player.split = True
				self.player_hand.append(Hand())  # create new hand to store split hand
				print("Player's split on " + str(hand_cards[0].get_rank()))
				remove_card = self.player_hand[0].remove_card()
				self.player.current_bet(self.player.get_bet())
				self.player_hand[1].add_card(remove_card)
				for i in range(0,2):
					print("Play Hand",i+1)
					self.player_hand[i].add_card(self.deck.deal_card())
					while True:
						print("Hand: ",end="")
						self.player_hand[i].print_cards()	
						player_input = input("Player's play:").lower()
						if player_input not in ["hit","stand"]:
							print("Only Hit and Stand is valid after splitting.")
							player_input = input("Enter your play :").lower()
						elif player_input == "stand":
							break
						else:
							pass

						self.play_hit(self.player_hand[i],i)
						
						if self.player.is_busted(i):
							break


				
			else:
				print("\nNot enough fund to split.Try other move!!!")
				
		else:
			print("\nSplitting is only allowed on initial hand when cards rank are equal.")
	

	def player_move(self):

		self.player_hand[0].add_card(self.deck.deal_card())
		self.dealer_hand.add_card(self.deck.deal_card())
		self.player_hand[0].add_card(self.deck.deal_card())
		self.dealer_hand.add_card(self.deck.deal_card())
		print("\n")
		print("Player Hand: ",end="")
		self.player_hand[0].print_cards()
		print("Dealer Hand: ",end="")
		self.dealer_hand.print_dealer_initial_hand()

		if self.player_hand[0].get_value() == 21:
			self.player.blackjack = True
			return

		print("\n\nPlayer's Turn:")
		
		while True:
			print("Hand: ",end="")
			self.player_hand[0].print_cards()			
			player_input = input("Player's play:").lower()
			if player_input not in self.moves:
				print("Enter valid moves: "+",".join(self.moves))

			if player_input == 'hit':
				self.play_hit(self.player_hand[0])
				if self.player.is_busted():
					break


			elif player_input == 'double':   # Double is not allowed after split
				self.play_double()
				break                  #Just one card be drawn after placing double bet
			
			elif player_input == 'split':
				if not self.player.is_split():      # Split is not allowed in the split hand itself.
					self.play_split()
					break
							
				else:
					print("\nSplitting is only allowed on initial hand when cards are equal.!!!")
			
			else:
				break

			
			


	def dealer_move(self):
		if not self.player.is_busted():
			print("\nDealer's Turn:")
			while True:
				print("Hand :",end="")
				self.dealer_hand.print_cards()
				dealer_value = self.dealer_hand.get_value()
				
				if dealer_value < 17:
					print("\nDealer's Play: Hit")
					new_card = self.deck.deal_card()
					print(new_card.get_rank()+" of " + new_card.get_suit())
					self.dealer_hand.add_card(new_card)

				# Dealer Hits on soft 17
				elif len(self.dealer_hand.hand) == 2 and dealer_value == 17:
					print("\nDealer's Play: Hit on Soft 17")
					new_card = self.deck.deal_card()
					print(new_card.get_rank()+" of " + new_card.get_suit())
					self.dealer_hand.add_card(new_card)


				elif dealer_value >= 17 and dealer_value <= 21:
					print("Dealer's Play: Stand")
					break
				
				else:
					break

	def result(self):
		dealer_val = self.dealer_hand.get_value()
		player_val = []
		player_val.append(self.player_hand[0].get_value())
		dealer_blackjack = False
		if len(self.dealer_hand.hand) == 2 and dealer_val == 21:
			dealer_blackjack = True

		for i in range(0,2):
			print("\n")
			if i == 0 and self.player.is_split():
				print("Player's Hand 1: ")
			elif i == 1 and not self.player.is_split():
				break

			elif i == 1 and self.player.is_split():
				print("Player's Hand 2: ")
				player_val.append(self.player_hand[i].get_value())

			else:
				pass


			if self.player.is_busted(i):
				print("Player's Hand: ",end="")
				self.player_hand[i].print_cards()
				print("Player Busted -- Dealer Wins!!!")
				self.player.remaining_fund()
		
			elif self.player.is_blackjack() and not dealer_blackjack:
				print("Player's Hand: ",end="")
				self.player_hand[i].print_cards()
				print("!!BLACKJACK!!")
				print("Dealer's Hand: ",end="")
				self.dealer_hand.print_cards()
				if dealer_val > 21:
					print("Dealer Busted!!")

				self.player.add_fund()


			elif dealer_val > 21:
				print("Dealer Hand: ",end="")
				self.dealer_hand.print_cards()
				print("Dealer Busted -- Player Wins!!!")
				self.player.add_fund()

			elif player_val[i] > dealer_val:
				print("Player's Hand: ",end="")
				self.player_hand[i].print_cards()
				print("Dealer's Hand: ",end="")
				self.dealer_hand.print_cards()
				print("Player Win!!!")
				self.player.add_fund()

			
			elif player_val[i] == dealer_val and not dealer_blackjack :
				print("Player's Hand: ",end="")
				self.player_hand[i].print_cards()
				print("Dealer's Hand: ",end="")
				self.dealer_hand.print_cards()
				print("Points Tie.PUSH")

			else:
				print("Player's Hand: ",end="")
				self.player_hand[i].print_cards()
				print("Dealer's Hand: ",end="")
				self.dealer_hand.print_cards()
				print("Dealer Win!!!",end="")
				if dealer_blackjack:
					print("Dealer's BLACKJACK")
				self.player.remaining_fund()

		print("Player current Status:")
		print("Player has {0:.2f} chips\n".format(self.player.get_fund()))