Spaces:
Runtime error
Runtime error
| import random | |
| class Box: | |
| """Box character class""" | |
| def __init__(self, name="Unnamed Box"): | |
| self.name = name | |
| self.attack = 10 | |
| self.defense = 8 | |
| self.health = 50 | |
| self.max_health = 50 | |
| self.speed = 5 | |
| self.level = 1 | |
| self.xp = 0 | |
| self.xp_to_next_level = 100 | |
| self.ability = None | |
| def gain_xp(self, amount): | |
| """Add XP and check for level up""" | |
| self.xp += amount | |
| while self.xp >= self.xp_to_next_level: | |
| self.level_up() | |
| def level_up(self): | |
| """Level up the box""" | |
| self.level += 1 | |
| self.xp -= self.xp_to_next_level | |
| self.xp_to_next_level = int(self.xp_to_next_level * 1.5) | |
| # Increase stats | |
| self.attack += 2 | |
| self.defense += 2 | |
| self.max_health += 10 | |
| self.health = self.max_health # Full heal on level up | |
| self.speed += 1 | |
| # Upgrade ability | |
| if self.ability and "level" in self.ability: | |
| self.ability["level"] += 1 | |
| def heal(self, amount): | |
| """Heal the box""" | |
| self.health = min(self.max_health, self.health + amount) | |
| def take_damage(self, damage): | |
| """Apply damage to the box""" | |
| self.health = max(0, self.health - damage) | |
| def is_alive(self): | |
| """Check if box is alive""" | |
| return self.health > 0 | |
| def get_status_string(self): | |
| """Get formatted status string""" | |
| return f""" | |
| 📦 {self.name} (Level {self.level}) | |
| ⚔️ Attack: {self.attack} | |
| 🛡️ Defense: {self.defense} | |
| ❤️ Health: {self.health}/{self.max_health} | |
| ⚡ Speed: {self.speed} | |
| ✨ XP: {self.xp}/{self.xp_to_next_level} | |
| 🎯 Ability: {self.ability['name'] if self.ability else 'None'} | |
| """.strip() | |
| class Battle: | |
| """Battle class for managing fights""" | |
| def __init__(self, attacker, defender): | |
| self.attacker = attacker | |
| self.defender = defender | |
| self.rounds = 0 | |
| self.battle_log = [] | |
| self.winner = None | |
| def start_battle(self): | |
| """Start the battle""" | |
| self.rounds = 0 | |
| self.battle_log = [] | |
| # Determine who goes first | |
| attacker_first = self.attacker.speed >= self.defender.speed | |
| self.battle_log.append(f"⚔️ Battle Start: {self.attacker.name} vs {self.defender.name}!") | |
| self.battle_log.append(f"{self.attacker.name} goes first!" if attacker_first else f"{self.defender.name} goes first!") | |
| max_rounds = 20 | |
| while self.attacker.is_alive() and self.defender.is_alive() and self.rounds < max_rounds: | |
| self.rounds += 1 | |
| self.battle_log.append(f"\n--- Round {self.rounds} ---") | |
| if attacker_first: | |
| self.execute_round(self.attacker, self.defender) | |
| if self.defender.is_alive(): | |
| self.execute_round(self.defender, self.attacker) | |
| else: | |
| self.execute_round(self.defender, self.attacker) | |
| if self.attacker.is_alive(): | |
| self.execute_round(self.attacker, self.defender) | |
| # Determine winner | |
| if self.attacker.is_alive() and not self.defender.is_alive(): | |
| self.winner = self.attacker | |
| self.battle_log.append(f"\n🎉 {self.attacker.name} WINS!") | |
| elif self.defender.is_alive() and not self.attacker.is_alive(): | |
| self.winner = self.defender | |
| self.battle_log.append(f"\n💀 {self.defender.name} WINS!") | |
| else: | |
| # Draw or max rounds | |
| if self.attacker.health > self.defender.health: | |
| self.winner = self.attacker | |
| self.battle_log.append(f"\n⏰ Time's up! {self.attacker.name} wins by health!") | |
| elif self.defender.health > self.attacker.health: | |
| self.winner = self.defender | |
| self.battle_log.append(f"\n⏰ Time's up! {self.defender.name} wins by health!") | |
| else: | |
| self.winner = None | |
| self.battle_log.append(f"\n🤝 It's a DRAW!") | |
| return { | |
| "winner": self.winner, | |
| "rounds": self.rounds, | |
| "log": "\n".join(self.battle_log) | |
| } | |
| def execute_round(self, attacker, defender): | |
| """Execute a single round""" | |
| damage = max(1, attacker.attack - defender.defense + random.randint(-2, 3)) | |
| # Apply ability effects | |
| if attacker.ability: | |
| if "damage_bonus" in attacker.ability: | |
| damage += attacker.ability["damage_bonus"] | |
| self.battle_log.append(f"{attacker.name} uses {attacker.ability['name']}!") | |
| if "crit_chance" in attacker.ability and random.random() < attacker.ability["crit_chance"]: | |
| damage *= 2 | |
| self.battle_log.append(f"💥 CRITICAL HIT!") | |
| defender.take_damage(damage) | |
| self.battle_log.append(f"{attacker.name} deals {damage} damage to {defender.name}") | |
| self.battle_log.append(f"{defender.name} health: {defender.health}/{defender.max_health}") | |
| class Shop: | |
| """Shop class for managing items""" | |
| def __init__(self): | |
| self.items = self.generate_shop_items() | |
| def generate_shop_items(self): | |
| """Generate shop items""" | |
| return [ | |
| { | |
| "id": 1, | |
| "name": "Power Boost", | |
| "cost": 50, | |
| "description": "Increase attack by 3", | |
| "type": "stat_boost", | |
| "stat": "attack", | |
| "value": 3 | |
| }, | |
| { | |
| "id": 2, | |
| "name": "Defense Shield", | |
| "cost": 40, | |
| "description": "Increase defense by 3", | |
| "type": "stat_boost", | |
| "stat": "defense", | |
| "value": 3 | |
| }, | |
| { | |
| "id": 3, | |
| "name": "Health Potion", | |
| "cost": 30, | |
| "description": "Restore 20 health", | |
| "type": "heal", | |
| "value": 20 | |
| }, | |
| { | |
| "id": 4, | |
| "name": "Speed Boots", | |
| "cost": 60, | |
| "description": "Increase speed by 2", | |
| "type": "stat_boost", | |
| "stat": "speed", | |
| "value": 2 | |
| }, | |
| { | |
| "id": 5, | |
| "name": "Mystery Box", | |
| "cost": 100, | |
| "description": "Random stat boost", | |
| "type": "random" | |
| } | |
| ] | |
| def get_item(self, item_id): | |
| """Get item by ID""" | |
| for item in self.items: | |
| if item["id"] == item_id: | |
| return item | |
| return None | |
| def purchase_item(self, user_coins, item_id): | |
| """Purchase an item""" | |
| item = self.get_item(item_id) | |
| if not item: | |
| return {"success": False, "message": "Item not found"} | |
| if user_coins < item["cost"]: | |
| return {"success": False, "message": "Not enough coins"} | |
| return {"success": True, "item": item, "message": f"Purchased {item['name']}"} |