-
-
Save solomonwu/280d1dde8515720e2852640f1ab1cd1a to your computer and use it in GitHub Desktop.
[Udemy Python][Day11] Blackjack Capstone Project
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
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