import streamlit as st import pandas as pd import plotly.express as px import plotly.graph_objects as go import os import random PLAYERS = { "Player 1": {"Sketch": "🎨", "Character": "🧙‍♀️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 5, "Defense": 3, "Class": "Wizard"}, "Player 2": {"Sketch": "🎨", "Character": "🧙‍♂️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 4, "Defense": 4, "Class": "Fighter"}, "Player 3": {"Sketch": "🎨", "Character": "🧝‍♀️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 3, "Defense": 5, "Class": "Ranger"}, "Player 4": {"Sketch": "🎨", "Character": "🧝‍♂️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 4, "Defense": 4, "Class": "Rogue"}, "Player 5": {"Sketch": "🎨", "Character": "🧝‍♀️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 2, "Defense": 6, "Class": "Cleric"}, "Player 6": {"Sketch": "🎨", "Character": "🧝‍♂️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 3, "Defense": 5, "Class": "Barbarian"}, "Player 7": {"Sketch": "🎨", "Character": "🧟‍♀️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 1, "Defense": 7, "Class": "Paladin"}, "Player 8": {"Sketch": "🎨", "Character": "🧟‍♂️", "Player Board": "📜", "Action Dice": "🎲", "Health Tokens": "❤️", "Coin Tokens": "💰", "Battle Tokens": "⚔️", "Attack": 2, "Defense": 6, "Class": "Bard"} } MONSTERS = { "Goblin": {"Picture": "👺", "Description": "A small, mischievous creature with sharp teeth and claws.", "Attack": 2, "Defense": 1}, "Orc": {"Picture": "👹", "Description": "A large, brutish humanoid with green skin and a nasty temperament.", "Attack": 4, "Defense": 2}, "Dragon": {"Picture": "🐲", "Description": "A massive, fire-breathing beast with scales as hard as steel.", "Attack": 6, "Defense": 5}, "Cyclops": {"Picture": "👁️", "Description": "A one-eyed giant with incredible strength.", "Attack": 8, "Defense": 6}, "Minotaur": {"Picture": "🐂", "Description": "A half-man, half-bull creature with a fierce temper.", "Attack": 5, "Defense": 3}, "Medusa": {"Picture": "🐍", "Description": "A woman with snakes for hair who can turn people to stone with her gaze.", "Attack": 3, "Defense": 2}, "Siren": {"Picture": "🧜", "Description": "A beautiful creature with the upper body of a woman and the lower body of a bird, whose singing lures sailors to their doom.", "Attack": 1, "Defense": 1}, "Kraken": {"Picture": "🦑", "Description": "A massive sea creature with tentacles that can crush ships.", "Attack": 7, "Defense": 4}, "Beholder": {"Picture": "👁️‍🗨️", "Description": "A floating orb covered in eyes, each of which can cast a deadly spell.", "Attack": 9, "Defense": 8}, "Chimera": {"Picture": "🐲🐐🦁", "Description": "A creature with the body of a lion, the head of a goat, and the tail of a dragon.", "Attack": 6, "Defense": 5}, "Basilisk": {"Picture": "🐍👁️", "Description": "A serpent that can turn people to stone with its gaze.", "Attack": 4, "Defense": 3}, "Mimic": {"Picture": "📦", "Description": "A creature that can disguise itself as a treasure chest and surprise unwary adventurers.", "Attack": 2, "Defense": 1}, "Aboleth": {"Picture": "🦑👁️", "Description": "A sea monster with slimy tentacles and the power to control people's minds.", "Attack": 7, "Defense": 6}, "Troll": {"Picture": "👹🔨", "Description": "A regenerating monster that can only be killed with fire or acid.", "Attack": 5, "Defense": 4}, "Gorgon": {"Picture": "🐍👁️‍🗨️", "Description": "A creature with the body of a lion and the head of a snake, whose gaze can turn people to stone.", "Attack": 6, "Defense": 4}, } def get_random_monster_old(): monster_name = st.session_state.selected_monster if monster_name: monster = MONSTERS[monster_name] st.write("Picture: ", monster["Picture"]) st.write("Description: ", monster["Description"]) st.write("Attack: ", monster["Attack"]) st.write("Defense: ", monster["Defense"]) return monster else: return None def shuffle_monsters(): global MONSTERS keys = list(MONSTERS.keys()) random.shuffle(keys) shuffled = {} for key in keys: shuffled[key] = MONSTERS[key] MONSTERS = shuffled def get_random_monster(): monster_name = st.session_state.selected_monster if monster_name: monster = MONSTERS[monster_name] st.write("Picture: ", monster["Picture"]) st.write("Description: ", monster["Description"]) st.write("Attack: ", monster["Attack"]) st.write("Defense: ", monster["Defense"]) return monster else: # Select a random monster based on its size monster_sizes = [monster_data["Attack"] + monster_data["Defense"] for monster_data in MONSTERS.values()] selected_size = random.choice(monster_sizes) monster_names = [monster_name for monster_name, monster_data in MONSTERS.items() if monster_data["Attack"] + monster_data["Defense"] == selected_size] selected_monster = random.choice(monster_names) st.session_state.selected_monster = selected_monster monster = MONSTERS[selected_monster] st.write("Picture: ", monster["Picture"]) st.write("Description: ", monster["Description"]) st.write("Attack: ", monster["Attack"]) st.write("Defense: ", monster["Defense"]) return monster def save_data(): data = pd.DataFrame.from_dict(st.session_state.players, orient="index") filename = "player_data.csv" data.to_csv(filename) st.write(f"Player data saved to {filename}") def display_player_card(player_name, player_data): st.write(f"**{player_name}**") for key, value in player_data.items(): st.write(f"{key}: {value}") def battle_player_card_old(): selected_player = st.session_state.selected_player selected_monster = st.session_state.selected_monster if not selected_player: st.warning("Please select a player card.") return if not selected_monster: st.warning("Please select a monster.") return player_data = PLAYERS[selected_player] monster_data = MONSTERS[selected_monster] if player_data["Attack"] > monster_data["Defense"]: st.success("You defeated the monster!") else: st.error("The monster defeated you.") save_data() def battle_player_card(): selected_player = st.session_state.selected_player selected_monster = st.session_state.selected_monster if not selected_player: st.warning("Please select a player card.") return if not selected_monster: st.warning("Please select a monster.") return player_data = PLAYERS[selected_player] shuffle_monsters() monster_data = MONSTERS[selected_monster] if player_data["Attack"] > monster_data["Defense"]: st.success("You defeated the monster!") # Increase player's Health Tokens # player_data["Health Tokens"] += 1 # Increase player's Health Tokens and add an additional heart emoji player_data["Health Tokens"] += "❤️" else: st.error("The monster defeated you.") save_data() def load_and_display_player_data_old(): player_data = pd.read_csv("player_data.csv") st.write("## Player Data") st.write(player_data) fig = px.treemap(player_data, path=['Player'], values='Health Tokens', color='Attack', color_continuous_scale='Blues', title='Player Attack Power and Health Tokens') fig.update_traces(textinfo='label+value+percent entry', hovertemplate='%{label}
Attack: %{color}
Health: %{value}
Percent: %{percentEntry:.2f}%') fig.update_layout(margin=dict(t=50, b=0, l=0, r=0), height=400) st.plotly_chart(fig) def load_and_display_player_data(): if os.path.exists("player_data.csv"): player_data = pd.read_csv("player_data.csv") st.write("## Player Data") st.write(player_data) else: st.write("Player data file not found.") @st.experimental_singleton def get_history(): return [] def main(): st.set_page_config(page_title="Player Cards and Monsters") st.title("Player Cards and Monsters") st.write("🃏 Select a player card to reveal a monster and battle it! 🐉") if "players" not in st.session_state: st.session_state.players = {} history = get_history() st.sidebar.title("🃏 Select a Player Card") selected_player = st.sidebar.radio("Select a player:", list(PLAYERS.keys())) display_player_card(selected_player, PLAYERS[selected_player]) if st.button("🔥 Battle!"): st.session_state.selected_player = selected_player st.session_state.selected_monster = st.sidebar.selectbox("Select a monster:", list(MONSTERS.keys())) monster = get_random_monster() if monster: battle_player_card() history.append({"Player": selected_player, "Monster": st.session_state.selected_monster}) save_data() else: st.write("No monsters to battle. Please add more monsters to the MONSTERS dictionary.") load_and_display_player_data() st.write("## Battle History") if history: df = pd.DataFrame(history) st.write(df) else: st.write("No battles fought yet.") def main_old(): st.set_page_config(page_title="Player Cards and Monsters") st.title("Player Cards and Monsters") st.write("🃏 Select a player card to reveal a monster and battle it! 🐉") if "players" not in st.session_state: st.session_state.players = {} st.sidebar.title("🃏 Select a Player Card") selected_player = st.sidebar.radio("Select a player:", list(PLAYERS.keys())) display_player_card(selected_player, PLAYERS[selected_player]) if st.button("🔥 Battle!"): st.session_state.selected_player = selected_player st.session_state.selected_monster = st.sidebar.selectbox("Select a monster:", list(MONSTERS.keys())) monster = get_random_monster() if monster: battle_player_card() load_and_display_player_data() if __name__ == "__main__": main()