Batalla Por Terra ✦ | Authentic |
// 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"; );
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
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 batalla por terra
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()")
// 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; Rendirse") opt = input("Elige: ") if opt ==
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")
// 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 🛡️"`); Reinicia para seguir jugando
<script> // ---------- CONFIGURACIÓN ---------- const GRID_SIZE = 10; let grid = []; let currentTurn = "attacker"; // attacker or defender let selectedUnit = null; // x, y