bright-lab-15 / app.py
Taf2023's picture
Update Gradio app with multiple files
6f9585a verified
import gradio as gr
import json
import random
import time
from datetime import datetime
import pandas as pd
from utils import (
initialize_game_state,
create_box,
calculate_battle_result,
get_shop_items,
purchase_item,
get_leaderboard,
save_game_state,
load_game_state
)
from models import Box, Battle, Shop
# Global game state
game_state = {}
def authenticate_user(profile):
"""Handle user authentication"""
if profile is None:
return None, "❌ Please login to play", gr.update(visible=False)
user_id = profile["name"]
if user_id not in game_state:
game_state[user_id] = initialize_game_state(user_id)
return user_id, f"βœ… Welcome back, {user_id}!", gr.update(visible=True)
def create_user_box(user_id, box_name):
"""Create a new box for the user"""
if not box_name.strip():
return "❌ Please enter a box name", get_user_status(user_id)
box = create_box(box_name.strip())
game_state[user_id]["box"] = box
game_state[user_id]["coins"] = 100 # Starting coins
status = get_user_status(user_id)
return f"βœ… Box '{box_name}' created successfully! Starting with 100 coins.", status
def get_user_status(user_id):
"""Get current user status as formatted text"""
if user_id not in game_state:
return "❌ User not found"
user_data = game_state[user_id]
box = user_data.get("box")
if not box:
return "❌ No box created yet"
status = f"""
πŸ“¦ BOX STATUS: {box.name}
βš”οΈ Attack: {box.attack}
πŸ›‘οΈ Defense: {box.defense}
❀️ Health: {box.health}/{box.max_health}
⚑ Speed: {box.speed}
πŸͺ™ Coins: {user_data.get('coins', 0)}
πŸ† Wins: {user_data.get('wins', 0)}
πŸ’€ Losses: {user_data.get('losses', 0)}
πŸ“Š Level: {box.level}
✨ XP: {box.xp}/{box.xp_to_next_level}
"""
return status.strip()
def battle_opponent(user_id, opponent_type="system"):
"""Battle against an opponent"""
if user_id not in game_state or not game_state[user_id].get("box"):
return "❌ Create a box first!", get_user_status(user_id)
user_box = game_state[user_id]["box"]
if opponent_type == "system":
# Create system box with level based on user level
system_level = max(1, user_box.level + random.randint(-2, 2))
opponent = create_box(f"System Bot Lv.{system_level}")
opponent.level = system_level
opponent.attack = 10 + system_level * 5
opponent.defense = 8 + system_level * 4
opponent.health = 50 + system_level * 20
opponent.max_health = opponent.health
opponent.speed = 5 + system_level * 2
else:
# For multiplayer - create a random opponent for demo
opponent = create_box(f"Player Box")
opponent.level = random.randint(1, 10)
opponent.attack = 15 + opponent.level * 3
opponent.defense = 12 + opponent.level * 2
opponent.health = 40 + opponent.level * 15
opponent.max_health = opponent.health
opponent.speed = 3 + opponent.level
battle_result = calculate_battle_result(user_box, opponent)
# Update user stats
if battle_result["winner"] == "user":
game_state[user_id]["wins"] = game_state[user_id].get("wins", 0) + 1
coins_earned = 20 + opponent.level * 5
game_state[user_id]["coins"] = game_state[user_id].get("coins", 0) + coins_earned
user_box.gain_xp(10 + opponent.level * 5)
result_text = f"""
πŸŽ‰ VICTORY!
πŸ† You defeated {opponent.name}!
πŸͺ™ Earned {coins_earned} coins
✨ Gained {10 + opponent.level * 5} XP
"""
else:
game_state[user_id]["losses"] = game_state[user_id].get("losses", 0) + 1
coins_earned = 5
game_state[user_id]["coins"] = game_state[user_id].get("coins", 0) + coins_earned
result_text = f"""
πŸ’€ DEFEAT!
πŸ˜” You were defeated by {opponent.name}
πŸͺ™ Earned {coins_earned} coins (consolation prize)
"""
battle_log = f"""
βš”οΈ BATTLE LOG
{battle_result["log"]}
"""
return result_text.strip(), battle_log.strip(), get_user_status(user_id)
def show_shop(user_id):
"""Display shop items"""
if user_id not in game_state:
return "❌ Please login first", ""
user_coins = game_state[user_id].get("coins", 0)
items = get_shop_items()
shop_text = f"πŸͺ™ Your Coins: {user_coins}\n\nπŸ›οΈ SHOP ITEMS:\n\n"
for i, item in enumerate(items, 1):
affordable = "βœ…" if user_coins >= item["cost"] else "❌"
shop_text += f"{i}. {item['name']} - {item['cost']} coins {affordable}\n"
shop_text += f" {item['description']}\n"
shop_text += f" Effect: {item['effect']}\n\n"
return shop_text, ""
def buy_item(user_id, item_choice):
"""Purchase an item from the shop"""
if user_id not in game_state:
return "❌ Please login first", show_shop(user_id)
try:
item_num = int(item_choice)
items = get_shop_items()
if item_num < 1 or item_num > len(items):
return "❌ Invalid item number", show_shop(user_id)
item = items[item_num - 1]
result = purchase_item(game_state[user_id], item)
if result["success"]:
return f"βœ… {result['message']}", show_shop(user_id)
else:
return f"❌ {result['message']}", show_shop(user_id)
except ValueError:
return "❌ Please enter a valid number", show_shop(user_id)
def show_leaderboard():
"""Display the global leaderboard"""
leaderboard = get_leaderboard(game_state)
if not leaderboard:
return "πŸ† LEADERBOARD\n\nNo players yet. Be the first!"
board_text = "πŸ† GLOBAL LEADERBOARD\n\n"
for i, player in enumerate(leaderboard[:10], 1):
medal = "πŸ₯‡" if i == 1 else "πŸ₯ˆ" if i == 2 else "πŸ₯‰" if i == 3 else "πŸ…"
win_rate = (player['wins'] / (player['wins'] + player['losses']) * 100) if (player['wins'] + player['losses']) > 0 else 0
board_text += f"{medal} {i}. {player['name']}\n"
board_text += f" πŸ† Wins: {player['wins']} | πŸ’€ Losses: {player['losses']}\n"
board_text += f" πŸ“Š Win Rate: {win_rate:.1f}% | πŸ“¦ Box: {player['box_name']}\n\n"
return board_text
def auto_upgrade_system_boxes():
"""Automatically upgrade system boxes"""
while True:
time.sleep(30) # Every 30 seconds
# System boxes upgrade logic would go here
# For now, this is a placeholder
def create_interface():
"""Create the main game interface"""
with gr.Blocks(
title="Box Battle Arena - Accessible Fighting Game",
css="""
.accessibility-mode {
font-size: 18px;
line-height: 1.6;
}
.game-status {
background-color: #f0f0f0;
padding: 15px;
border-radius: 10px;
font-family: monospace;
}
""",
theme=gr.themes.Soft()
) as demo:
# Header with accessibility info
gr.HTML("""
<div style="text-align: center; margin-bottom: 20px;">
<h1>πŸ₯Š Box Battle Arena πŸ₯Š</h1>
<p><a href="https://huggingface.co/spaces/akhaliq/anycoder" target="_blank">Built with anycoder</a></p>
<p>πŸ”Š This game is fully accessible for screen reader users</p>
<p>Use Tab to navigate, Enter to select, and screen reader will announce all actions</p>
</div>
""")
# Login section
with gr.Row():
with gr.Column(scale=1):
login_btn = gr.LoginButton()
user_info = gr.HTML("<p>πŸ” Please login with Hugging Face to play</p>")
>>>>>>> REPLACE REPLACE
# Main game area (hidden until login)
with gr.Group(visible=False) as game_area:
# Box Creation
with gr.Group():
gr.Markdown("## πŸ“¦ Create Your Box")
with gr.Row():
box_name_input = gr.Textbox(
label="Box Name",
placeholder="Enter your box name...",
elem_id="box_name_input"
)
create_box_btn = gr.Button("Create Box", variant="primary")
create_result = gr.Textbox(label="Creation Result", interactive=False)
# Status Display
with gr.Group():
gr.Markdown("## πŸ“Š Your Status")
user_status = gr.Textbox(
label="Current Status",
value="No box created yet",
interactive=False,
elem_classes=["game-status"]
)
# Battle Section
with gr.Group():
gr.Markdown("## βš”οΈ Battle Arena")
with gr.Row():
battle_system_btn = gr.Button("πŸ€– Battle System Box", variant="primary")
battle_player_btn = gr.Button("πŸ‘₯ Battle Player Box", variant="secondary")
battle_result = gr.Textbox(label="Battle Result", interactive=False)
battle_log = gr.Textbox(
label="Battle Log",
lines=10,
interactive=False,
elem_classes=["game-status"]
)
# Shop Section
with gr.Group():
gr.Markdown("## πŸ›οΈ Shop")
with gr.Row():
shop_btn = gr.Button("View Shop")
refresh_shop_btn = gr.Button("πŸ”„ Refresh")
shop_display = gr.Textbox(
label="Shop Items",
lines=15,
interactive=False,
elem_classes=["game-status"]
)
with gr.Row():
item_choice_input = gr.Number(
label="Item Number",
minimum=1,
maximum=10,
step=1
)
buy_btn = gr.Button("Buy Item", variant="primary")
shop_result = gr.Textbox(label="Purchase Result", interactive=False)
# Leaderboard
with gr.Group():
gr.Markdown("## πŸ† Leaderboard")
leaderboard_btn = gr.Button("View Leaderboard")
leaderboard_display = gr.Textbox(
label="Top Players",
lines=15,
interactive=False,
elem_classes=["game-status"]
)
# Event handlers
def handle_login(profile):
if profile:
user_id, msg, visibility = authenticate_user(profile)
return (
gr.update(value=f"βœ… Logged in as: {profile['name']}"),
gr.update(visible=True),
get_user_status(user_id) if user_id else "No box created yet"
)
return gr.update(), gr.update(visible=False), "No box created yet"
login_btn.success(
handle_login,
inputs=[login_btn],
outputs=[user_info, game_area, user_status]
)
create_box_btn.click(
create_user_box,
inputs=[box_name_input],
outputs=[create_result, user_status]
)
def battle_system():
return battle_opponent("demo_user")
def battle_player():
return battle_opponent("demo_user", "player")
def show_shop_demo():
return show_shop("demo_user")
def buy_item_demo(choice):
return buy_item("demo_user", choice)
battle_system_btn.click(
battle_system,
outputs=[battle_result, battle_log, user_status]
)
battle_player_btn.click(
battle_player,
outputs=[battle_result, battle_log, user_status]
)
shop_btn.click(
show_shop_demo,
outputs=[shop_display, shop_result]
)
buy_btn.click(
buy_item_demo,
inputs=[item_choice_input],
outputs=[shop_result, shop_display]
)
leaderboard_btn.click(
show_leaderboard,
outputs=[leaderboard_display]
)
refresh_shop_btn.click(
show_shop_demo,
outputs=[shop_display, shop_result]
)
return demo
if __name__ == "__main__":
demo = create_interface()
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
show_api=False,
prevent_thread_lock=False
)