Batalla Por Terra Page
// Calcular daño con terreno function calculateDamage(attacker, defender, attackerTerrain, defenderTerrain) let baseDmg = attacker.baseAtk - defender.baseDef; if (baseDmg < 2) baseDmg = 2; let terrainAtkMod = attackerTerrain.dmgModAttacker; let terrainDefMod = defenderTerrain.dmgModDefender; let finalDamage = Math.floor(baseDmg * terrainAtkMod * terrainDefMod); finalDamage += Math.floor(Math.random() * 4); // azar pequeño if (finalDamage < 1) finalDamage = 1; return finalDamage;
// Lógica de selección y ataque function handleCellClick(x, y) if (checkVictory()) return; const cell = grid[x][y]; // Si tenemos unidad seleccionada if (selectedUnit) const sel = selectedUnit; if (cell.side && cell.side !== currentTurn) // Atacar attack(sel.x, sel.y, x, y); selectedUnit = null; updateUI(); const winner = checkVictory(); if (!winner) // Después de atacar no se cambia turno automáticamente (opcional, puedes cambiarlo) // Por diseño: ataque consume turno? En muchos juegos sí. Aquí decidimos que después de atacar termina turno // Descomentar si quieres que atacar termine turno: endTurn(); updateUI(); else // Selección inválida addLog("❌ No puedes atacar ahí"); selectedUnit = null; updateUI(); // Si no hay selección, seleccionar unidad propia si es el turno correcto else if (cell.side === currentTurn && cell.unit !== null) selectedUnit = x, y ; addLog(`✅ Unidad $cell.unit.icon seleccionada en ($x,$y)`); updateUI(); else addLog("⚠️ Selecciona una unidad de tu ejército.");
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 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 batalla por terra
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)
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]);
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) ¡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()")
def in_range(self, ax, ay, dx, dy, rng): return abs(ax-dx) + abs(ay-dy) <= rng
function randomTerrain() const r = Math.random(); if (r < 0.5) return TERRAIN.PLAIN; if (r < 0.75) return TERRAIN.FOREST; return TERRAIN.HILL; "ATACANTE 🔥" : "DEFENSOR 🛡️"`); // Contar unidades
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
function resetGame() initGrid(); placeArmies(); currentTurn = "attacker"; selectedUnit = null; updateUI(); addLog("⚔️ La batalla por Tierra comienza de nuevo. ¡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 🛡️"`);
// Contar unidades restantes function countUnits(side) let count = 0; for (let i = 0; i < GRID_SIZE; i++) for (let j = 0; j < GRID_SIZE; j++) if (grid[i][j].side === side && grid[i][j].unit !== null) count++; return count;