|
|
|
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() |
|
|
|
|
|
@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) |
|
|
|
|
|
|