File size: 4,710 Bytes
4abf612
b1097e6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c0795f6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b1097e6
c0795f6
 
 
 
 
 
 
 
b1097e6
 
 
 
 
 
 
 
 
 
 
 
 
ca61840
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b1097e6
 
ca61840
 
 
 
 
 
 
 
 
 
 
 
 
b1097e6
4abf612
 
 
 
b1097e6
 
 
 
 
 
 
4abf612
32c96cc
b1097e6
 
 
 
 
 
9f1a7c8
 
 
 
 
 
 
 
 
 
 
650dd18
 
 
 
4abf612
 
32c96cc
 
 
 
 
 
 
4abf612
32c96cc
 
 
4abf612
32c96cc
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141

import streamlit as st
import os
import csv
import huggingface_hub
from PIL import Image
from components import GamePlay, Player, Dealer, Deck
from huggingface_hub import Repository, hf_hub_download, upload_file
from datetime import datetime

DATASET_REPO_URL = "https://huggingface.co/datasets/awacke1/Carddata.csv"
DATASET_REPO_ID = "awacke1/Carddata.csv"
DATA_FILENAME = "Carddata.csv"
DATA_FILE = os.path.join("data", DATA_FILENAME)
HF_TOKEN = os.environ.get("HF_TOKEN")
number_of_decks = 6
blackjack_multiplier = 1.5

def generate_html() -> str:
    with open(DATA_FILE) as csvfile:
        reader = csv.DictReader(csvfile)
        rows = []
        for row in reader:
            rows.append(row)
        rows.reverse()
        if len(rows) == 0:
            return "no messages yet"
        else:
            html = "<div class='chatbot'>"
            for row in rows:
                html += "<div>"
                html += f"<span>{row['name']}</span>"
                html += f"<span class='message'>{row['message']}</span>"
                html += "</div>"
            html += "</div>"
            return html
            
def store_message(name: str, message: str):
    if name and message:
        with open(DATA_FILE, "a") as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=["name", "message", "time"])
            writer.writerow(
                {"name": name, "message": message, "time": str(datetime.now())}
            )
        commit_url = repo.push_to_hub()
    return generate_html()

# Initialize player, dealer, deck and game play. Cache these variables
@st.cache(allow_output_mutation=True, suppress_st_warning=True)
def start_game():
    game_deck = Deck(number_of_decks)
    dealer = Dealer()
    player = Player()
    game_play = GamePlay(player, dealer, game_deck, blackjack_multiplier)
    return game_deck, dealer, player, game_play

game_deck, dealer, player, game_play = start_game()

def display_pro_tip(player, dealer):
    player_total = sum(card.rank for card in player.cards)
    
    if dealer.cards:
        dealer_upcard = dealer.cards[0].rank
    else:
        dealer_upcard = 0

    if player_total <= 11:
        return "Pro Tip: With a total of 11 or less, it's generally advisable to hit."
    elif player_total == 12 and dealer_upcard <= 3:
        return "Pro Tip: With a total of 12 and the dealer showing 3 or less, consider hitting."
    elif player_total >= 17:
        return "Pro Tip: With a total of 17 or more, it's usually best to stand."
    else:
        return ""

def display_betting_strategy(player, dealer):
    player_total = sum(card.rank for card in player.cards)
    
    if dealer.cards:
        dealer_upcard = dealer.cards[0].rank
    else:
        dealer_upcard = 0

    if player_total <= 11:
        return "Betting Strategy: Consider increasing your bet when your total is 11 or less."
    elif player_total >= 17 and dealer_upcard <= 6:
        return "Betting Strategy: Consider increasing your bet when you have a strong hand and the dealer has a weak upcard."
    else:
        return ""

def calculate_hand_total(hand):
    total = sum(card.rank for card in hand)
    return total

st.title('🃏Blackjack Simulator AI♠2️⃣1️⃣')

if st.button('New hand?'):
    game_play.deal_in()

player_stats = st.empty()
player_images = st.empty()
player_action = st.empty()
done_button = st.empty()
dealer_stats = st.empty()
dealer_images = st.empty()
result = st.empty()
pro_tip = st.empty()
betting_strategy = st.empty()

while True:
    game_play.update()
    player_stats.write(player)
    player_images.image([Image.open(card.image_location) for card in player.cards], width=100)
    dealer_stats.write(dealer)
    dealer_images.image([Image.open(card.image_location) for card in dealer.cards], width=100)
    result.write(game_play)

    pro_tip.write(display_pro_tip(player, dealer))
    betting_strategy.write(display_betting_strategy(player, dealer))

    player_total = calculate_hand_total(player.cards)
    dealer_total = calculate_hand_total(dealer.cards)

    if player_total == 21 or dealer_total == 21 or not player.possible_actions:
        break

    if 'Hit' in player.possible_actions or 'Double Down' in player.possible_actions:
        action = player_action.radio("Choose your action", ("👋 Hit", "⏬ Double Down"), key=f"action_{len(player.cards)}")

        if action == "👋 Hit":
            player.player_hit(game_deck, game_play)
        elif action == "⏬ Double Down":
            player.double_down(game_deck, game_play)

        if done_button.button("✅ Done", key=f"done_{len(player.cards)}"):
            player.stand(game_play)
    else:
        player.stand(game_play)