Мой город Moscow
Request a call back

Batalla Por Terra «UPDATED ✧»

// Inicializar resetGame(); </script> </body> </html> import random import os class Terrain: PLAIN = "name": "Plain", "dmg_atk": 1.0, "dmg_def": 1.0, "def_bonus": 0 FOREST = "name": "Forest", "dmg_atk": 0.9, "dmg_def": 1.1, "def_bonus": 2 HILL = "name": "Hill", "dmg_atk": 1.15, "dmg_def": 0.95, "def_bonus": 1

def play(self): while True: self.display() if self.check_victory(): break print("\nOpciones: ") print("1. Atacar (coordenadas atacante x y | defensor x y)") print("2. Terminar turno") print("3. Rendirse") opt = input("Elige: ") if opt == "3": print(f"self.current_turn se rinde. Batalla terminada.") break elif opt == "2": self.change_turn() continue elif opt == "1": try: ax, ay, dx, dy = map(int, input("Atacante (x y) y Defensor (x y): ").split()) if 0<=ax<self.size and 0<=ay<self.size and 0<=dx<self.size and 0<=dy<self.size: success, msg = self.attack(ax, ay, dx, dy) print(msg) if success: if self.check_victory(): break self.change_turn() else: print("Coordenadas inválidas") except: print("Formato incorrecto. Ejemplo: 1 0 6 7") input("\nPresiona Enter para continuar...") if == " main ": game = LandBattle(8) game.play() Características del Feature "Batalla por Tierra" ✅ Campo de batalla con terreno variable ✅ Dos facciones (Atacante/Defensor) ✅ Unidades con atributos distintos (daño, defensa, rango, HP) ✅ El terreno modifica el daño y defensa ✅ Sistema por turnos ✅ Interfaz visual para web o consola

// Event listeners document.getElementById("reset-btn").addEventListener("click", resetGame); document.getElementById("end-turn-btn").addEventListener("click", () => if (!checkVictory()) endTurn(); else addLog("La batalla terminó, reinicia para jugar."); updateUI(); );

function resetGame() initGrid(); placeArmies(); currentTurn = "attacker"; selectedUnit = null; updateUI(); addLog("⚔️ La batalla por Tierra comienza de nuevo. ¡Lucha!"); batalla por terra

def setup_armies(self): # Attacker left side, Defender right side for i in range(self.size): if i < self.size//2: self.grid[i][0] = Unit(random.choice(["Infantry","Archer","Cavalry"]), "attacker") self.grid[i][1] = Unit(random.choice(["Infantry","Archer"]), "attacker") else: self.grid[i][self.size-1] = Unit(random.choice(["Infantry","Archer","Cavalry"]), "defender") self.grid[i][self.size-2] = Unit(random.choice(["Infantry","Archer"]), "defender")

def count_units(self, side): return sum(1 for i in range(self.size) for j in range(self.size) if self.grid[i][j] and self.grid[i][j].side == side)

Puedes copiar el código HTML en un archivo .html y abrirlo en cualquier navegador para jugar. El script de Python se ejecuta en terminal. Rendirse") opt = input("Elige: ") if opt ==

// Atacar function attack(attackerX, attackerY, defenderX, defenderY) !defenderCell.unit) return false; if (attackerCell.side === defenderCell.side) addLog("❌ No puedes atacar a tus propias tropas"); return false; if (currentTurn !== attackerCell.side) addLog("⏳ No es tu turno"); return false; const range = attackerCell.unit.range; if (!isInRange(attackerX, attackerY, defenderX, defenderY, range)) addLog(`📏 Fuera de rango ($range casillas)`); return false; const damage = calculateDamage(attackerCell.unit, defenderCell.unit, attackerCell.terrain, defenderCell.terrain); defenderCell.unit.hp -= damage; addLog(`⚡ $attackerCell.unit.icon ataca a $defenderCell.unit.icon y causa $damage de daño!`); if (defenderCell.unit.hp <= 0) addLog(`💀 Unidad $defenderCell.unit.icon eliminada!`); defenderCell.unit = null; defenderCell.side = null; return true;

<script> // ---------- CONFIGURACIÓN ---------- const GRID_SIZE = 10; let grid = []; let currentTurn = "attacker"; // attacker or defender let selectedUnit = null; // x, y

// Inicializar grid function initGrid() grid = Array(GRID_SIZE).fill().map(() => Array(GRID_SIZE).fill().map(() => ( terrain: randomTerrain(), unit: null, side: null // "attacker", "defender" ))); ¡Lucha

def change_turn(self): self.current_turn = "defender" if self.current_turn == "attacker" else "attacker" print(f"\n🔄 Turno cambiado a self.current_turn.upper()")

// Terrenos const TERRAIN = PLAIN: name: "🌾", dmgModAttacker: 1.0, dmgModDefender: 1.0, defBonus: 0 , FOREST: name: "🌲", dmgModAttacker: 0.9, dmgModDefender: 1.1, defBonus: 2 , HILL: name: "⛰️", dmgModAttacker: 1.15, dmgModDefender: 0.95, defBonus: 1 ;