# Examen ALS 16/3/2018 Juego de estrategia Baltasar <baltasarq@gmail.com>
import random as rnd
import time as tm
class Unidad:
"""Clase base para todas las unidades."""
def __init__(self, num_soldados):
"""Crea una unidad con unos soldados.
:param num_soldados: Los soldados iniciales.
"""
self._num_soldados = num_soldados
@property
def num_soldados(self):
"""Devuelve los soldados actuales."""
return self._num_soldados
def puntos_defensa(self):
"""Devuelve los puntos de defensa."""
return 10
def puntos_ataque(self):
"""Devuelve los puntos de ataque."""
return round(10 * self.num_soldados * rnd.random())
def __gt__(self, ud2):
"""Devuelve True si esta unidad tiene mayores efectivos."""
toret = False
if isinstance(ud2, Unidad):
toret = self.num_soldados > us2.num_soldados
return toret
def __lt__(self, ud2):
"""Devuelve True si esta unidad tiene menors efectivos."""
toret = False
if isinstance(ud2, Unidad):
toret = self.num_soldados < us2.num_soldados
return toret
def combate(self, ud2):
"""Resuelve el combate de esta unidad con otra.
:param ud2: La otra unidad.
"""
Unidad.ataca(self, ud2)
Unidad.ataca(ud2, self)
@staticmethod
def ataca(ud1, ud2):
"""Establece el ataque de una unidad a otra.
:param ud1: La primera unidad combatiente.
:param ud2: La segunda unidad combatiente.
"""
atq = ud2.puntos_ataque()
dfs = ud2.puntos_defensa()
if atq != 0:
soldados = (dfs/atq) * rnd.random() * ud1.num_soldados
if soldados < ud1.num_soldados:
ud1._num_soldados -= round(soldados)
def __str__(self):
return str.format("SLD {} DEF {} ATQ {}",
self.num_soldados,
self.puntos_defensa(),
self.puntos_ataque())
class Caballeria(Unidad):
"""Caballeria (bonifica ataque al 50%, penaliza defensa al 60%)"""
def __init__(self, num_soldados):
super().__init__(num_soldados)
def puntos_ataque(self):
return round(super().puntos_ataque() * 1.50)
def puntos_defensa(self):
return round(super().puntos_defensa() * 0.4)
def __str__(self):
return "Caballeria " + super().__str__()
class Arqueros(Unidad):
"""Arqueros bonifica ataque 10%, defensa 100%"""
def __init__(self, num_soldados):
super().__init__(num_soldados)
def puntos_ataque(self):
return round(super().puntos_ataque() * 1.10)
def puntos_defensa(self):
return round(super().puntos_defensa() * 2)
def __str__(self):
return "Arqueros " + super().__str__()
class Infanteria(Unidad):
"""Infantes, penaliza ataque 30%, bonifica defensa 150%"""
def __init__(self, num_soldados):
super().__init__(num_soldados)
def puntos_ataque(self):
return round(super().puntos_ataque() * .7)
def puntos_ataque(self):
return round(super().puntos_defensa() * 2.5)
def __str__(self):
return "Infanteria " + super().__str__()
class Maniobra:
"""Engloba varias unidades."""
def __init__(self):
self._unidades = []
def inserta(self, ud):
"""Inserta una unidad ud en la maniobra."""
self._unidades.append(ud)
def __getitem__(self, i):
return self._unidades[i]
def __setitem__(self, i, val):
self._unidades[i] = val
def __len__(self):
return len(self._unidades)
def __str__(self):
toret = "UDS: " + str(len(self._unidades)) + '\n'
for ud in self._unidades:
toret += str(ud) + "\n"
return toret
if __name__ == "__main__":
rnd.seed(tm.time())
m = Maniobra()
m.inserta(Infanteria(25))
m.inserta(Arqueros(25))
m.inserta(Caballeria(25))
print(m)
m[0].combate(m[1])
print(m)