Skip to content

Instantly share code, notes, and snippets.

@solomonwu
Last active March 16, 2021 03:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save solomonwu/280d1dde8515720e2852640f1ab1cd1a to your computer and use it in GitHub Desktop.
Save solomonwu/280d1dde8515720e2852640f1ab1cd1a to your computer and use it in GitHub Desktop.
[Udemy Python][Day11] Blackjack Capstone Project
"""
Name: main.py
"""
import os
def clear(): os.system('cls' if os.name == 'nt' else 'clear')
from art import logo
import random
# 52 cards represent 1-52:
# spade: 1-13; heart: 14-26; diamond: 27-39; club: 40-52
poker_suit = [ "spade", "heart", "diamond", "club" ]
poker_num = [ "A", "2", "3", "4", "5", "6", "7",
"8", "9", "10", "J", "Q", "K" ]
pc_name = "Dealer"
dict_key_card = "card" # card list
dict_key_stand = "stand" # the stand state
cards = []
for i in range( 1, 53 ):
cards += [i]
# structure: { "player_name": {"card":[card_list], "stand": bool_flag}}
players_cards = {}
def draw_card():
card = random.choice( cards )
cards.remove( card )
return card
def covert_poker_suit( num ):
return f"({poker_suit[int((num-1)/13)]}, {poker_num[num%13-1]})"
# Display a player's card
def card_display( player_name, game_end = False ):
clear()
if game_end == False:
print( f"{player_name}'s turn:" )
else:
print( "Game End:" )
# reveal first 2 card for each player
for name in players_cards:
print( f"{name}'s card:" )
display = ""
count = 0
for card in players_cards[name][dict_key_card]:
if count < 2 or player_name == name or game_end:
display += f"{covert_poker_suit( card )} "
else:
display += f"(hidden) "
count += 1
print( display )
# calcualte a player's card point
def check_card_point( player_name ):
point = 0
ace_num = 0
for card in players_cards[player_name][dict_key_card]:
mod_value = card % 13
if mod_value == 1:
point += 11
ace_num += 1
elif mod_value == 11 or \
mod_value == 12 or \
mod_value == 0:
point += 10
else:
point += mod_value
# adjust A from 11 to 1
while point > 21 and ace_num > 0:
point -= 10
ace_num -= 1
return point
# PC's decision
def dealer_ai():
# if total point < 17, draw a card
if check_card_point( pc_name ) < 17:
players_cards[pc_name][dict_key_card] += [draw_card()]
else:
players_cards[pc_name][dict_key_stand] = 1
# bust/winner check
def check_winner( player_name ):
winner = ""
highest_point = 0
draw = False
point = check_card_point( player_name )
if point > 21:
print( f"{player_name} bust!" )
if player_name == pc_name:
name_str =""
player_num = len( players_cards )
for name in list(players_cards)[0:player_num-1]:
name_str += f"{name} "
print( f"{name_str} win the game." )
return True
del players_cards[player_name] # delete from dictionary
elif point == 21:
print( f"{player_name} win the game with 21 points!" )
return True
for name in players_cards:
if players_cards[name][dict_key_stand] == 0:
return False
point = check_card_point( name )
if point > highest_point:
highest_point = point
winner = name
draw = False
elif point == highest_point:
draw = True
if draw:
name_list = ""
for name in players_cards:
name_list += f"{name}, "
card_display( player_name = name, game_end = True )
print( name_list + f"draw in the game with {highest_point} point" )
else:
card_display( player_name = winner, game_end = True )
print( f"{winner} win the game with {highest_point} point" )
return True
def blackjack_game( player_num ):
#global players_name
name_list = []
for num in range( 0, player_num ):
name_list += [input( f"What's player {num+1}'s name? ")]
name_list += [pc_name] # Dealer
# starting
for num in range( 0, player_num + 1 ):
players_cards[name_list[num]] = {}
players_cards[name_list[num]][dict_key_card] = [draw_card()]
players_cards[name_list[num]][dict_key_stand] = 0
game_end = False
while not game_end:
name_list = []
for name in players_cards:
name_list += [name]
for player_name in name_list:
card_display( player_name )
if player_name == pc_name: # dealer
dealer_ai()
else:
if players_cards[player_name][dict_key_stand] == 0:
choice = input( f"{player_name}, what's your action? type (h/s): \n" +
"h: Hit (get another card)\n" +
"s: Stand (don't want any card)\n" )
if choice == 'h':
card = draw_card()
print( f"new crad:{covert_poker_suit( card )}" ) #
players_cards[player_name][dict_key_card] += [card]
elif choice == 's':
players_cards[player_name][dict_key_stand] = 1
game_end = check_winner( player_name )
if game_end:
break
start = input( "Do you want to play a game of Blackjack? Type (y/n) " )
if start == 'y':
print( logo )
blackjack_game( int(input("How many players? ")) )
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment