Batalla Por Terra -

def check_victory(self): if self.count_units("attacker") == 0: print("\n🏆 VICTORIA DEL DEFENSOR - Tierra defendida con éxito!") return True if self.count_units("defender") == 0: print("\n🏆 VICTORIA DEL ATACANTE - Tierra conquistada!") return True return False

// 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 ;

// Verificar fin de batalla function checkVictory() const attackerCount = countUnits("attacker"); const defenderCount = countUnits("defender"); document.getElementById("attacker-stats").innerText = attackerCount; document.getElementById("defender-stats").innerText = defenderCount; if (attackerCount === 0) addLog("🏆 ¡VICTORIA DEL DEFENSOR! La tierra permanece firme."); return "defender"; if (defenderCount === 0) addLog("🏆 ¡VICTORIA DEL ATACANTE! La tierra es conquistada."); return "attacker"; return null; batalla por terra

// Colocar ejércitos (ejemplo equilibrado) function placeArmies() // Atacante (zona izquierda) const attackerPositions = [[0,0],[1,1],[2,0],[0,2],[3,1],[1,3],[4,2],[5,0],[0,4],[2,3]]; const defenderPositions = [[9,9],[8,8],[9,7],[7,9],[6,8],[9,6],[8,5],[7,7],[9,4],[6,9]]; // Tipos variados const unitTypes = [UNITS.INFANTRY, UNITS.ARCHER, UNITS.CAVALRY, UNITS.INFANTRY, UNITS.ARCHER, UNITS.CAVALRY, UNITS.INFANTRY, UNITS.ARCHER, UNITS.CAVALRY, UNITS.INFANTRY]; attackerPositions.forEach((pos, idx) => if (pos[0] < GRID_SIZE && pos[1] < GRID_SIZE) const type = unitTypes[idx % unitTypes.length]; grid[pos[0]][pos[1]].unit = ...type, hp: type.hp, maxHp: type.hp ; grid[pos[0]][pos[1]].side = "attacker"; ); defenderPositions.forEach((pos, idx) => if (pos[0] < GRID_SIZE && pos[1] < GRID_SIZE) const type = unitTypes[(idx+3) % unitTypes.length]; grid[pos[0]][pos[1]].unit = ...type, hp: type.hp, maxHp: type.hp ; grid[pos[0]][pos[1]].side = "defender"; );

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

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

function addLog(msg) const logDiv = document.getElementById("combat-log"); const p = document.createElement("div"); p.innerHTML = `> $msg`; logDiv.appendChild(p); logDiv.scrollTop = logDiv.scrollHeight; if (logDiv.children.length > 30) logDiv.removeChild(logDiv.children[0]); ¡Lucha

// Cambiar turno function endTurn() if (checkVictory()) addLog("⚜️ La batalla ha terminado. Reinicia para seguir jugando."); return; currentTurn = (currentTurn === "attacker") ? "defender" : "attacker"; selectedUnit = null; updateUI(); addLog(`🔄 Turno cambiado: $currentTurn === "attacker" ? "ATACANTE 🔥" : "DEFENSOR 🛡️"`);

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)

def __str__(self): return f"self.iconself.type[0]" class LandBattle: def (self, size=8): self.size = size self.grid = [[None for _ in range(size)] for _ in range(size)] self.terrain = [[self.random_terrain() for _ in range(size)] for _ in range(size)] self.current_turn = "attacker" self.setup_armies()