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 = "
" for row in rows: html += "
" html += f"{row['name']}" html += f"{row['message']}" html += "
" html += "
" 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)