Batalla Por Terra Apr 2026

function updateUI() renderGrid(); const turnSpan = document.getElementById("turn"); turnSpan.innerHTML = `🎲 Turno: $currentTurn === "attacker" ? "ATACANTE 🔥" : "DEFENSOR 🛡️"`; document.getElementById("attacker-stats").innerText = countUnits("attacker"); document.getElementById("defender-stats").innerText = countUnits("defender");

def calculate_damage(self, attacker, defender, att_terrain, def_terrain): base = attacker.atk - defender.defense if base < 2: base = 2 damage = int(base * att_terrain["dmg_atk"] * def_terrain["dmg_def"]) + random.randint(-1, 3) return max(1, damage)

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 display(self): os.system('cls' if os.name == 'nt' else 'clear') print("\n" + "="*60) print("⚔️ BATALLA POR TIERRA ⚔️".center(60)) print(f"Turno: self.current_turn.upper()".center(60)) print("="*60) print(" " + " ".join(f"j:2" for j in range(self.size))) for i in range(self.size): row_display = f"i:2 " for j in range(self.size): unit = self.grid[i][j] terrain_char = "Plain":"🌾","Forest":"🌲","Hill":"⛰️"[self.terrain[i][j]["name"]] if unit: row_display += f"unit.iconunit.hp:2 " else: row_display += f" terrain_char " print(row_display) print("-"*60) batalla por terra

// Atacar function attack(attackerX, attackerY, defenderX, defenderY) const attackerCell = grid[attackerX][attackerY]; const defenderCell = grid[defenderX][defenderY]; if (!attackerCell.unit

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()")

def attack(self, ax, ay, dx, dy): attacker = self.grid[ax][ay] defender = self.grid[dx][dy] if not attacker or not defender: return False, "No hay unidad" if attacker.side == defender.side: return False, "No puedes atacar aliados" if attacker.side != self.current_turn: return False, "No es tu turno" if not self.in_range(ax, ay, dx, dy, attacker.range): return False, "Fuera de rango" damage = self.calculate_damage(attacker, defender, self.terrain[ax][ay], self.terrain[dx][dy]) defender.hp -= damage msg = f"attacker.icon ataca a defender.icon y causa damage de daño!" if defender.hp <= 0: msg += f" defender.icon ha muerto!" self.grid[dx][dy] = None return True, msg function updateUI() renderGrid(); const turnSpan = document

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()

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

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. // Tipos de unidad const UNITS = INFANTRY:

// Tipos de unidad const UNITS = INFANTRY: name: "⚔️", baseAtk: 8, baseDef: 5, range: 1, hp: 20, icon: "⚔️" , ARCHER: name: "🏹", baseAtk: 6, baseDef: 3, range: 3, hp: 15, icon: "🏹" , CAVALRY: name: "🐎", baseAtk: 10, baseDef: 4, range: 1, hp: 18, icon: "🐎" ;

class Unit: def (self, unit_type, side): self.type = unit_type self.side = side if unit_type == "Infantry": self.atk, self.defense, self.range, self.max_hp = 8, 5, 1, 20 self.icon = "⚔️" elif unit_type == "Archer": self.atk, self.defense, self.range, self.max_hp = 6, 3, 3, 15 self.icon = "🏹" else: # Cavalry self.atk, self.defense, self.range, self.max_hp = 10, 4, 1, 18 self.icon = "🐎" self.hp = self.max_hp

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