Exemplo n.º 1
0
class Jugador:
    """

    Constructor del jugador
    Nombre: nombre del jugador

    """
    def __init__(self, nombre):
        self.nombre = nombre
        self.mano = []
        self.topCard = None
        self.mazo = Mazo()

    """

    Metodo encargado de que el jugador tome una carta del Mazo
    Mazo: cartas disponibles para tomar

    """

    def tomarCarta(self):
        if (len(self.mazo.getCartas()) > 0):
            self.mano.append(self.mazo.tomarCarta())
            return "Hay cartas"
        return "Ya no hay cartas"

    """Getter del atributo mano"""

    def getMano(self):
        return self.mano

    """

    Metodo encargado de recibir una carta
    a diferencia de tomar carta esta no la toma del mazo
    carta: carta a recibir

    """

    def recibeCarta(self, carta):
        self.mano.append(carta)
        self.topCard = carta

    """Metodo encargado de dejar la carta indidcada por el usuario"""

    def dejaCarta(self, iterator):
        if (iterator >= len(self.mano)):
            return self.mano[len(self.mano) - 1]
        return self.mano.pop(iterator)

    """Getter de la carta indicada por el usuario"""

    def getCarta(self, iterator):
        if (iterator >= len(self.mano)):
            return self.mano[len(self.mano) - 1]
        return self.mano[iterator]

    """Metodo encargado de mostrar la mano del usuario"""

    def mostrarMano(self):
        i = 0
        print(len(self.mano))
        for carta in self.mano:
            print(str(i) + ") ", end="")
            carta.mostrar()
            i = i + 1
        print("\n")

    """Getter del nombre del usuario"""

    def getName(self):
        return self.nombre

    """Getter de la ultima carta en la lista del usuario"""

    def getUltimaCarta(self):
        return self.mano[len(self.mano) - 1]

    """Getter de la penultima carta en la lista del usuario"""

    def getPenultimaCarta(self):
        return self.mano[len(self.mano) - 2]

    """Metodod encargado de retonar el tamaño de la mano de cartas restantes"""

    def getTamCartas(self):
        return len(self.mano)
Exemplo n.º 2
0
class IA(Jugador):
    def __init__(self, nombre, tablero):
        self.nombre = nombre
        self.mano = []  #Mano de la computadora
        self.mazo = Mazo()  #Objeto mazo para usar posteriormente
        self.cartas = self.mazo.getCartas(
        )  #Conjunto de cartas no jugadas y que no posee el CPU con el cual se verán las posibilidades
        self.posibilidades = Posibilidades(
        )  #Objeto manejador de posibilidades
        self.arbol = ArbolDecision()  #Objeto manejador del arbol de decisiones
        self.tablero = tablero  #Tablero en que se juega
        self.juegos = []  #Manejador de posibles juegos
        self.contador = 0

    """Metodo encargado de tomar una carta del mazo"""

    def tomarCarta(self):
        if (len(self.mazo.getCartas()) > 0):
            self.mano.append(self.mazo.tomarCarta())
            #Buscamos borrar del conjunto de cartas no jugado las cartas que posee el CPU
            for i in self.mano:
                for j in self.cartas:
                    if (j.toString() == i.toString()):
                        self.cartas.pop(self.cartas.index(j))
            return "Hay cartas"
        else:
            return "Ya no hay cartas"

    """Getter de la mano de la CPU"""

    def getMano(self):
        return self.mano

    """Metodo encargado de recibir una carta, no del mazo"""

    def recibeCarta(self, carta):
        self.mano.append(carta)

    """Metodo encargado de actualizar los juegos posibles a futuro e indicar si todavia posibilidades calculadas"""

    def actualizaPosibilidades(self):
        #tam=0
        self.getPosibilities()
        inDeck = False

        #Eliminamos la ultima carta jugada del conjunto de cartas posibles
        iter = 0
        for i in self.cartas:
            if (i.toString() == self.tablero.getUltimaCarta().toString()):
                self.cartas.pop(iter)
            iter = iter + 1

        #Checamos que la carta jugada se encuentre dentro de las posibilidades calculadas
        #De ser asi agregamos dichas posibilidades en la lista de nuevas posibilidades
        nuevoJuego = []
        for i in self.juegos:
            #print(i)
            if (len(i) > 0):
                if (i[0].toString() ==
                        self.tablero.getUltimaCarta().toString()):
                    #print(self.tablero.getUltimaCarta().toString())
                    inDeck = True
                    nuevoJuego.append(i)

        #print("Saliendo")

        #Si si se hay posibilidades las actualizamos
        if (inDeck == True):
            self.juegos = []
            for i in nuevoJuego:
                self.juegos.append(i)
        else:
            #Sino indicamos que no hay
            #return False
            return False
            #self.actualizaPosibilidades()

    """Funcion encargada de dejar la siguiente carta"""

    def dejaCarta(self):
        #Obtenemos las posibilidades (Siempre se ven n turnos a futuro)
        self.getPosibilities()
        print("Falg 1")
        #Si por algun motivo no hay jugadas y tras actualizar siguen sin haber posibles retornamos que no hay carta a dejar
        if (len(self.juegos) == 0):
            self.actualizaPosibilidades()
        if (len(self.juegos) == 0):
            return False

        print("Flag 2")
        #Checamos entre las mejores jugadas y elejimos un juego al azar
        out = False
        cont = 0
        numeros = []
        carta = None

        #Checamos que no se haya jugado un comodin anteriormente
        if (self.tablero.getUltimaCarta().getEfecto() != ""
                or (self.tablero.getPenultimaCarta().getEfecto() != ""
                    and self.tablero.getUltimaCarta().getValue() == "")):
            for i in self.mano:
                if (i.getColor() == self.tablero.getUltimaCarta().getColor()):
                    carta = i
                    break

        else:
            #Si quedan pocos juegos le damos prioridad a los comodines
            if (len(self.juegos[0]) <= 1
                    and self.tablero.getUltimaCarta().getEfecto() == ""
                    and self.tablero.getPenultimaCarta().getEfecto() == ""):
                for i in self.juegos:
                    #print("Flag 3")
                    if (len(i) > 0):
                        if (i[0].getEfecto() != "" and
                            (i[0].getColor() == "" or i[0].getColor()
                             == self.tablero.getUltimaCarta().getColor())):
                            print("Flag 4")
                            carta = i[0]
                            out = True
                            break
            if (carta == None):
                while (out == False):
                    carta = None
                    #Si no agarramos una de entre todas las cartas
                    r = random.randint(0, len(self.juegos) - 1)
                    if (numeros.count(r) == 0):
                        print(r)
                        numeros.append(r)
                        #Obtenemos el r-esimo juego y su primera carta
                        juego = self.juegos[r]
                        cont = cont + 1
                        if (len(juego) > 0):
                            carta = juego[0]
                            #Si la carta esta en la mano de la IA, que deberia, checamos si es valido usando PAT
                            #for     i in self.mano:
                            #if(i.toString() == carta.toString()):
                            out = jugadaValida([
                                self.tablero.getPenultimaCarta(),
                                self.tablero.getUltimaCarta(), carta
                            ])
                            #break
                    print("Jugada:", out)
                    #Igualmente checamos que no hayamos intentado ya con todas las posibilidades que hay
                    if (cont >= len(self.juegos)):
                        return False

        print("Saliendo")

        if (type(carta) is type(None)):
            return False

        #Ya que el juego es valido obtenemos todos los juegos que contienen esa carta en dicho paso
        nuevoJuego = []
        for i in self.juegos:
            if (len(i) > 0):
                if (type(i[0]) is type(carta)):
                    if (i[0].toString() == carta.toString()):
                        i.pop(0)
                        nuevoJuego.append(i)

        #Actualizamos la lista de juegos
        self.juegos = []
        for i in nuevoJuego:
            self.juegos.append(i)

        #Eliminamos la carta de nuestra mano
        iter = 0
        for i in self.mano:
            if (type(i) is type(carta)):
                if (i.toString() == carta.toString()):
                    self.mano.pop(iter)
                    break
            iter = iter + 1

        #La retornamos
        return carta

    """Metodo encargado de mostrar la mano de la computadora (usado para depuracion)"""

    def mostrarMano(self):
        iter = 0
        for carta in self.mano:
            print(str(iter) + ") ", end="")
            carta.mostrar()
            iter = iter + 1

    """Getter del atributo Nombre"""

    def getName(self):
        return self.nombre

    """Funcion encargada de obtener todos los posibles juegos"""

    def getPosibilities(self):
        #Reiniciamos la lista de opciones
        self.juegos = []
        #Hacemos que el arbol vuelva a calcular las posibilidades y las guardamos en una lista
        self.arbol.setRoot(self.tablero.getUltimaCarta())
        self.arbol.insertPosibilities(self.cartas, self.mano, 5,
                                      self.arbol.getRoot())
        juegos = self.posibilidades.getCards(self.arbol)

        for i in juegos:
            if (i[len(i) - 1].getEfecto() != ""):
                self.juegos.append(i)

        #Si las posibilidades siguen vacías obtenemos un n numero de jugadas
        #if(len(self.juegos)==0):
        numeros = []
        for i in range(0, len(juegos)):
            r = random.randint(0, len(juegos) - 1)
            if (numeros.count(r) == 0):
                numeros.append(r)
                self.juegos.append(juegos[r])

        #No se que hace esta linea, favor de no quitar
        for i in self.juegos:
            if (len(i) > 0):
                i.pop(0)

        #print("Juegos:",self.juegos)

    """Funcion encargada de ver si es un momento optimo para dejar un comodin +4"""

    def ifDejaMasCuatro(self):
        carta = False
        color = ""
        #Checamos que sea un momento optimo para tirarlo o que no tengamos mas cartas
        if (self.contador < 3 or self.actualizaPosibilidades() == False):
            iter = 0
            #Checamos que tengamos el comodin
            for i in self.mano:
                if (i.getEfecto() == "Comodin +4"):
                    carta = self.mano.pop(iter)
                    #Buscamos cual es el color mas presente en nuestra mano para cambiar a usar dicho color
                    colors = [0, 0, 0, 0]
                    for i in self.mano:
                        if (i.getColor() == "Azul"):
                            colors[0] = colors[0] + 1
                        elif (i.getColor() == "Rojo"):
                            colors[1] = colors[1] + 1
                        elif (i.getColor() == "Amarillo"):
                            colors[2] = colors[2] + 1
                        else:
                            colors[3] = colors[3] + 1
                    highest = 0
                    #Vemos de que color se presentan mas
                    for i in range(1, 3):
                        if (colors[i] > colors[i - 1]):
                            highest = highest + 1
                    opciones = ["Azul", "Rojo", "Amarillo", "Verde"]
                    #Retornamos la carta +4 y el color a que cambiaremos
                    color = opciones[highest]
                    return [carta, color]
                iter = iter + 1
        #Retornamos que no hay carta +4 y no cambiaremos de color
        return [carta, color]

    """Funcion encargada de ver si es un momento optimo para dejar un comodin cambio de color"""

    def ifDejaComodinColor(self):
        carta = False
        color = ""
        #Checamos que sea un momento optimo para tirarlo o que no tengamos mas cartas
        if (len(self.mano) == 2):
            for i in self.mano:
                #Vemos que tenemos el comodin en caso de que queden solo dos cartas
                if (i.getEfecto() == "Comodin"):
                    carta = i
                    #Checamos el color de la otra carta para cambiar a dicho color
                    if (self.mano[0].getColor() != ""):
                        color = self.mano[0].getColor()
                    else:
                        color = self.mano[1].getColor()
                    break
        elif (self.actualizaPosibilidades() == False):
            iter = 0
            #En caso de no tener cartas para tirar obtenemos la carta
            for i in self.mano:
                if i.getEfecto() == "Comodin":
                    break
                iter = iter + 1
            if (iter < len(self.mano)):
                carta = self.mano.pop(iter)
                #Proceso para ver cuantas cartas hay de cada color
                colors = [0, 0, 0, 0]
                for i in self.mano:
                    if (i.getColor() == "Azul"):
                        colors[0] = colors[0] + 1
                    elif (i.getColor() == "Rojo"):
                        colors[1] = colors[1] + 1
                    elif (i.getColor() == "Amarillo"):
                        colors[2] = colors[2] + 1
                    else:
                        colors[3] = colors[3] + 1
                #Vemos que carta hay de mas colores
                highest = 0
                for i in range(1, 3):
                    if (colors[i] > colors[i - 1]):
                        highest = highest + 1
                opciones = ["Azul", "Rojo", "Amarillo", "Verde"]
                color = opciones[highest]

        #Retornamos la carta +4 y el color a que cambiaremos o que no tenemos la carta segun el caso
        return [carta, color]

    """Funcion encargada de actualizar el contador de cartas del juego"""

    def setContador(self, cont):
        self.contador = cont

    """Metodod encargado de retonar el tamaño de la mano de cartas restantes"""

    def getTamCartas(self):
        return len(self.mano)