Batalla Por Terra ⚡ Fully Tested

// Renderizar grid function renderGrid() const gridContainer = document.getElementById("battle-grid"); gridContainer.innerHTML = ""; for (let i = 0; i < GRID_SIZE; i++) for (let j = 0; j < GRID_SIZE; j++) const cell = grid[i][j]; const cellDiv = document.createElement("div"); cellDiv.className = `cell $cell.terrain.name === "🌾" ? "plain" : (cell.terrain.name === "🌲" ? "forest" : "hill")`; if (selectedUnit && selectedUnit.x === i && selectedUnit.y === j) cellDiv.classList.add("selected"); let innerHtml = `<div class="unit $cell.side ">$cell.terrain.name</div>`; if (cell.unit) const sideClass = cell.side === "attacker" ? "attacker" : "defender"; innerHtml = `<div class="unit $sideClass">$cell.unit.icon</div> <div class="hp">❤️$cell.unit.hp/$cell.unit.maxHp</div>`; cellDiv.innerHTML = innerHtml; cellDiv.addEventListener("click", (function(x,y) return function() handleCellClick(x,y); ; )(i,j)); gridContainer.appendChild(cellDiv);

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

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)

// 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: "🐎" ; batalla por terra

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

// 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 🛡️"`);

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

def random_terrain(self): r = random.random() if r < 0.5: return Terrain.PLAIN elif r < 0.75: return Terrain.FOREST else: return Terrain.HILL

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

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") FOREST: name: "🌲"

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

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

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

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)

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]);

© 2009-2025 Tubidy