# Juego de dados
# En un juego de dados, todos los participantes tienen el
# mismo número de dados (con 6 caras, de la 1 a la 6).
# En cada turno, cada jugador tira todos sus dados, sumando
# cada dado para obtener una puntuación.
# Gana el jugador con mejor puntuación tras tres turnos.
#
# jbgarcia@uvigo.es - (c) 2017 - Licencia MIT
 
 
import random
 
 
class Dado:
    """Representa un dado de seis caras, de 1 a 6."""
 
    def __init__(self):
        self.ultimo_resultado = 0
 
    def tirada(self):
        self.ultimo_resultado = random.randint(1, 6)
        return self.ultimo_resultado
 
    def __str__(self):
        return str(self.ultimo_resultado)
 
 
class Jugador:
    """Representa a un jugador que tiene x dados."""
 
    def __init__(self, nick, num_dados):
        """Crea un nuevo jugador.
 
            :param nick: El nick del jugador.
            :param num_dados: El num. de dados para la partida."""
 
        self.nick = nick
        self.num_dados = num_dados
        self.dados = []
        self.ultima_tirada = []
        for i in range(num_dados):
            self.dados += [Dado()]
 
    def tirada(self):
        """Realiza una tirada con todos los dados."""
 
        self.ultima_tirada = []
 
        for dado in self.dados:
            self.ultima_tirada += [dado.tirada()]
 
        return self.ultima_tirada
 
    def __str__(self):
        toret = self.nick + ": "
 
        for x in self.ultima_tirada:
            toret += str(x) + ' '
 
        return toret.strip()
 
 
class Juego:
    """Representa un juego de x jugadores e y turnos.
        Permitirá incorporar jugadores.
        El método juega() lanza los y turnos, guardando
        los resultados parciales y la puntuación total."""
 
    def __init__(self, num_turnos, num_dados):
        """Crea un nuevo juego.
 
                :param num_turnos: El num. de turnos a jugar.
                :param num_dados: El num. de dados para todos.
        """
 
        self.num_turnos = num_turnos
        self.num_dados = num_dados
        self.jugadores = []
        self.puntos_max = []
        self.puntos_parciales = []
        self.turnos = []
 
    def inserta_jugador(self, nick):
        self.jugadores += [Jugador(nick, self.num_dados)]
 
    def juega(self):
        self.puntos_max = [0] * len(self.jugadores)
        self.turnos = []
 
        for _ in range(self.num_turnos):
            self.puntos_parciales = [[]] * len(self.jugadores)
 
            for i, jugador in enumerate(self.jugadores):
                pts = jugador.tirada()
                self.puntos_max[i] += sum(pts)
                self.puntos_parciales[i] = list(jugador.ultima_tirada)
 
            self.turnos += [list(self.puntos_parciales)]
 
    def __str__(self):
        toret = str.format("Juego de {0} turnos y {1} dados.\n\n",
                            self.num_turnos, self.num_dados)
 
        for puntos in self.turnos:
            for i, pts in enumerate(puntos):
                toret += self.jugadores[i].nick + ": " + str(pts)
 
                toret += '\n'
            toret += '\n'
 
        toret += "Puntuaciones finales:\n"
        for i, pts in enumerate(self.puntos_max):
            toret += self.jugadores[i].nick + ": " + str(pts) + '\n'
 
        return toret
 
if __name__ == "__main__":
    random.seed()
    juego = Juego(random.randint(2, 6), random.randint(3, 6))
    juego.inserta_jugador("Baltasar")
    juego.inserta_jugador("Fulano")
    juego.inserta_jugador("Mengano")
    juego.inserta_jugador("Zutano")
    juego.juega()
    print(juego)