Ejemplo n.º 1
0
    def handleKey(self, event, monsterList):
        """
        Handle the key-event when the user press down arrows. If it is a legal move, it move the player in that direction which user pressed (Arrows-keys)
        """

        # Si el jugador presiona la tecla [Izquierda]
        if event.key == pygame.K_LEFT:
            if self.isMovimientoValido(
                    Punto(self.getCoordenadaX() - 1, (self.getCoordenadaY())),
                    monsterList):
                self.mover(-1, 0)

        # Si el jugador presiona la tecla [Derecha]
        elif event.key == pygame.K_RIGHT:
            if self.isMovimientoValido(
                    Punto(self.getCoordenadaX() + 1, (self.getCoordenadaY())),
                    monsterList):
                self.mover(1, 0)

        # Si el jugador presiona la tecla [Arriba]
        elif event.key == pygame.K_UP:
            if self.isMovimientoValido(
                    Punto((self.getCoordenadaX()),
                          self.getCoordenadaY() - 1), monsterList):
                self.mover(0, -1)

        # Si el jugador presiona la tecla [Abajo]
        elif event.key == pygame.K_DOWN:
            if self.isMovimientoValido(
                    Punto((self.getCoordenadaX()),
                          self.getCoordenadaY() + 1), monsterList):
                self.mover(0, 1)
Ejemplo n.º 2
0
    def configurarEscenario1(self):
        """
        Configuramos el escenario 1.
        """

        global punto1
        global punto2
        global punto3

        punto1 = Punto(69, 69)
        punto2 = Punto(69, 69)
        punto3 = Punto(69, 36)
Ejemplo n.º 3
0
    def isMovimientoValido(self, destino: Punto, monsterList: list) -> bool:
        """
        Método que verifica si el movimiento a realizar es válido.
        @return: True si el movimiento a realizar es válido, False en caso contrario.
        @rtype: bool
        """

        for m in monsterList:
            if m.getCoordenadaX() is destino.getCoordenadaX(
            ) and m.getCoordenadaY() is destino.getCoordenadaY():
                return False

        return self.mapa[destino.getCoordenadaY()][
            destino.getCoordenadaX()].isTransitable()
Ejemplo n.º 4
0
    def OnFactoryMonsters(self, screen, mapa, MONSTERS_TILES: list,
                          dungeonLevel: int):
        """
        Los enemigos cambian sus estadistidas y son asesinados en cada nivel, asi que creamos nuevos enemigos cada
        nuevo nivel que el jugador avance.
        @param screen: La ventana de juego para dibujar.
        @param mapa: El mapa.
        @param MONSTERS_TILES: Imagenes de los enemigos.
        @param dungeonLevel: El nivel actual de la mazmorra.
        @return: Lista con los enemigos creados.
        """

        monsters: list = []

        MAX_ENEMIGOS_NIVEL: int = Constantes.MAXIMO_ENEMIGOS_NIVEL.value

        for i in range(MAX_ENEMIGOS_NIVEL):
            monsters.append(
                Monster(screen,
                        coordenada=Punto(random.randrange(0, self.MAPA_ANCHO),
                                         random.randrange(0, self.MAPA_ALTO)),
                        imagen=MONSTERS_TILES[random.randint(
                            0,
                            len(MONSTERS_TILES) - 1)],
                        mapa=mapa,
                        dungeon_level=dungeonLevel))

        return monsters
Ejemplo n.º 5
0
    def isMovimientoValido(self, puntoDistinto: Punto, monsterList: list,
                           player: Player) -> bool:
        """
        Método que verifica si el movimiento a realizar es válido.
        @return: True si el movimiento a realizar es válido, False en caso contrario.
        @rtype: bool
        """

        for m in monsterList:
            if m.coordenada.equals(puntoDistinto):
                return False

        if player is not None and player.getCoordenadaX(
        ) is puntoDistinto.getCoordenadaX() and player.getCoordenadaY(
        ) is puntoDistinto.getCoordenadaY():
            return False

        return self.mapa[puntoDistinto.getCoordenadaY()][
            puntoDistinto.getCoordenadaX()].isTransitable()
Ejemplo n.º 6
0
    def encontrarJugador(self, player: Player, monsterList: list):
        """Find out if a player is in range for a monster, if a player is in range of max 5 tiles. The monster move towards the player to attack it
           @return: 1 if the player is in range
           @return: -1 if the player is not in range
        """

        #Find out how far the player is
        costFromMonsterToPlayer = (
            abs(self.getCoordenadaX() - player.getCoordenadaX()) +
            abs(self.getCoordenadaY() - player.getCoordenadaY()))

        #Move towards the player if the player is in rage
        if costFromMonsterToPlayer <= 5:

            #Are the player to the left or to the rigt of the monster
            if self.getCoordenadaX() > player.getCoordenadaX():
                dirX = -1
            elif self.getCoordenadaX() < player.getCoordenadaX():
                dirX = 1
            else:
                dirX = 0

            #Are the player to the left  or to the rigt of the monster
            if self.getCoordenadaY() > player.getCoordenadaY():
                dirY = -1
            elif self.getCoordenadaY() < player.getCoordenadaY():
                dirY = 1
            else:
                dirY = 0

            #Can we move to the new position?
            if self.isMovimientoValido(
                    Punto(self.getCoordenadaX() + dirX, self.getCoordenadaY()),
                    monsterList, player):
                self.mover(dirX, 0)
                return 1
            elif self.isMovimientoValido(
                    Punto(self.getCoordenadaX(),
                          self.getCoordenadaY() + dirY), monsterList, player):
                self.mover(0, dirY)
                return 1
        else:
            return -1
Ejemplo n.º 7
0
    def walk(self, monsterList: list, player: Player):
        """Move a monster in a random direction, if it hit a wall or another monster, we choose a new random direction
        """
        if self.direction == 'L':
            if self.isMovimientoValido(
                    Punto(self.getCoordenadaX() - 1, (self.getCoordenadaY())),
                    monsterList, player):
                self.mover(-1, 0)
            else:
                self.direction = self.DIRECTION[random.randint(
                    0,
                    len(self.DIRECTION) - 1)]

        elif self.direction == 'R':
            if self.isMovimientoValido(
                    Punto(self.getCoordenadaX() + 1, (self.getCoordenadaY())),
                    monsterList, player):
                self.mover(1, 0)
            else:
                self.direction = self.DIRECTION[random.randint(
                    0,
                    len(self.DIRECTION) - 1)]

        elif self.direction == 'U':
            if self.isMovimientoValido(
                    Punto((self.getCoordenadaX()),
                          self.getCoordenadaY() - 1), monsterList, player):
                self.mover(0, -1)
            else:
                self.direction = self.DIRECTION[random.randint(
                    0,
                    len(self.DIRECTION) - 1)]

        elif self.direction == 'D':
            if self.isMovimientoValido(
                    Punto((self.getCoordenadaX()),
                          self.getCoordenadaY() + 1), monsterList, player):
                self.mover(0, 1)
            else:
                self.direction = self.DIRECTION[random.randint(
                    0,
                    len(self.DIRECTION) - 1)]
Ejemplo n.º 8
0
    def onFactoryJugador(self, screen, mapa, dungeonLevel):

        rutaImagen = EnumImage.JUGADOR.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        jugador = Player(screen=screen,
                         coordenada=Punto(x, y),
                         imagen=imagen,
                         mapa=mapa,
                         dungeon_level=dungeonLevel)

        return jugador
Ejemplo n.º 9
0
    def onFactoryMummy(self, screen, mapa, dungeonLevel):

        rutaImagen = EnumImage.MUMMY.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        mummy = Monster(screen=screen,
                        coordenada=Punto(x, y),
                        imagen=imagen,
                        mapa=mapa,
                        dungeon_level=dungeonLevel)

        return mummy
Ejemplo n.º 10
0
    def onFactoryOgroMago(self, screen, mapa, dungeonLevel):

        rutaImagen = EnumImage.OGRO_MAGO.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        ogroMago = Monster(screen=screen,
                           coordenada=Punto(x, y),
                           imagen=imagen,
                           mapa=mapa,
                           dungeon_level=dungeonLevel)

        return ogroMago
Ejemplo n.º 11
0
    def onFactoryArmadura(self, screen, mapa):

        rutaImagen = EnumImage.ARMADURA.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        armadura = Item(screen=screen,
                        coordenada=Punto(x, y),
                        imagen=imagen,
                        mapa=mapa,
                        tag=Tag.ARMADURA.value,
                        nombre="armor",
                        bonus=1)

        return armadura
Ejemplo n.º 12
0
    def onFactoryPuertaMadera(self, screen, mapa):

        rutaImagen = EnumImage.PUERTA_MADERA.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        puertaMadera = Item(screen=screen,
                            coordenada=Punto(x, y),
                            imagen=imagen,
                            mapa=mapa,
                            tag=Tag.PUERTA.value,
                            nombre="Puerta de Madera",
                            bonus=0)

        return puertaMadera
Ejemplo n.º 13
0
    def onFactoryPocion(self, screen, mapa):

        rutaImagen = EnumImage.POCION.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        pocion = Item(screen=screen,
                      coordenada=Punto(x, y),
                      imagen=imagen,
                      mapa=mapa,
                      tag=Tag.POCION.value,
                      nombre="food",
                      bonus=20)

        return pocion
Ejemplo n.º 14
0
    def onFactoryEspada(self, screen, mapa):

        rutaImagen = EnumImage.ESPADA.value
        imagen = pygame.image.load(rutaImagen).convert_alpha()

        x = random.randrange(0, self.MAPA_ANCHO)
        y = random.randrange(0, self.MAPA_ALTO)

        espada = Item(screen=screen,
                      coordenada=Punto(x, y),
                      imagen=imagen,
                      mapa=mapa,
                      tag=Tag.ARMAS.value,
                      nombre="weapon",
                      bonus=1)

        return espada
Ejemplo n.º 15
0
    def legalStartPosition(self, x: int, y: int) -> Punto:
        """
        Revisa si la posicion pasada por parámetro es válidad para una posicion inicial.
        Funcion recursiva.
        @param x: Coordenada en el eje X.
        @type x: int
        @param y: Coordenada en el eje Y.
        @type y: int
        @return: Devuelve una tupla (x: int, y: int) cuando está es válidad como una posicion inicial.
        @rtype: tuple(int, int)
        """

        #Is this tile a wall, True if not, False if it is a wall
        if self.mapa[y][x].isTransitable():
            return Punto(x, y)
        else:
            # Generamos dos números random y los pasamos por párametro.
            x = random.randrange(0, len(self.mapa[0]))
            y = random.randrange(0, len(self.mapa))
            return self.legalStartPosition(x, y)
Ejemplo n.º 16
0
    def OnRunGame(self, cave: object, monster_tiles: list, SCREEN_ALTO: int,
                  SCREEN_ANCHO: int):
        """
        Run the game and the contains the main game loop
        @param cave: the map
        @type cave: object
        @param player: the player object
        @type player: Player
        @param monster_tiles: monster images
        @type monster_tiles: list
        @param SCREEN_ALTO: the map heith (playable area) in pixels
        @type SCREEN_ALTO: int
        @param SCREEN_ANCHO: the map width (playable area) in pixels
        @type SCREEN_ANCHO: int
        """

        global screen
        global panelMazmorra
        global panelMensajes
        global panelEstadisticas
        global mazmorra

        # create player object
        player = Factory().onFactoryJugador(self.screen, mazmorra,
                                            self.mazmorraLevel)

        #Make list of monsters
        monsters = Factory().OnFactoryMonsters(self.screen, cave,
                                               monster_tiles,
                                               self.mazmorraLevel)
        items = Factory().OnFactoryItems(self.screen, cave)

        #get clock so we can control frames per second
        clock = pygame.time.Clock()
        gameMessage: str = ""

        #Main game loop - should probably be refactored (if time)
        while True:

            clock.tick(5)  #Limit the screen to 5 FPS

            #go through events
            for event in pygame.event.get():

                #player clicked close button
                if event.type == pygame.QUIT:
                    self.OnExitApp()

                #a key has been pressed
                if event.type == pygame.KEYDOWN:

                    #move player
                    player.handleKey(event, monsters)
                    gameMessage = self.monsterMoveAndAttack(
                        monsters, player, self.screen)

                    if event.key == pygame.K_s:
                        #Use item
                        gameMessage = self.monsterMoveAndAttack(
                            monsters, player, self.screen)

                        for item in items:
                            if item.coordenada.equals(player.coordenada):
                                if item.getTag() == Tag.PUERTA.value:
                                    #Increase dungeonlevel
                                    #make new cave
                                    self.mazmorraLevel += 1
                                    cave = Mazmorra().InitMazmorra(self.screen)
                                    # El nuevo mundo lo pasamos por parametro.
                                    panelMazmorra.setMundo(cave)
                                    #update player object
                                    player.update(
                                        cave,
                                        Punto(
                                            random.randrange(
                                                0, SCREEN_ANCHO / 16),
                                            random.randrange(
                                                0, SCREEN_ALTO / 16)))
                                    #make new monster list
                                    monsters = Factory().OnFactoryMonsters(
                                        self.screen, cave, monster_tiles,
                                        self.mazmorraLevel)
                                    items = Factory().OnFactoryItems(
                                        self.screen, cave)
                                    gameMessage = "Nuevo nivel de mazmorra! " + gameMessage
                                    panelMensajes.mostrarMensaje(gameMessage)

                                elif item.getTag() == Tag.ARMAS.value:
                                    player.incrementarAtaqueFisico(
                                        item.usarBonusItem())
                                    gameMessage = "Has recogido una espada! Tu poder de ataque se incrementa en " + str(item.usarBonusItem()) \
                                                   + "! " + gameMessage
                                    items.remove(item)
                                    panelMensajes.mostrarMensaje(gameMessage)

                                elif item.getTag() == Tag.ARMADURA.value:
                                    player.incrementarDefensa(
                                        item.usarBonusItem())
                                    gameMessage = "Has recogido una pieza de armadura! Tu armadura se incrementa en " + str(item.usarBonusItem()) \
                                                   + "! " + gameMessage
                                    items.remove(item)
                                    panelMensajes.mostrarMensaje(gameMessage)

                                elif item.getTag() == Tag.POCION.value:
                                    player.incrementarVitalidad(
                                        item.usarBonusItem())
                                    gameMessage = "Has recogido una pocion! Hit points increased by " + str(item.usarBonusItem()) \
                                                   + "! " + gameMessage

                                    items.remove(item)
                                    panelMensajes.mostrarMensaje(gameMessage)

                    #player attack (A key pressed)
                    elif event.key == pygame.K_a:

                        attackDir = 'D'  #DEFAULT DIRECTION

                        panelMensajes.mostrarMensaje("Donde quieres atacar?")
                        pygame.display.flip()
                        pygame.event.set_blocked(
                            pygame.KEYUP
                        )  #Block KEYUP so its not added to the event queue
                        attackWhere = pygame.event.wait()  #Wait for an event

                        #get attack direction
                        if attackWhere.key == pygame.K_DOWN:
                            attackDir = 'D'

                        elif attackWhere.key == pygame.K_UP:
                            attackDir = 'U'

                        elif attackWhere.key == pygame.K_LEFT:
                            attackDir = 'L'

                        elif attackWhere.key == pygame.K_RIGHT:
                            attackDir = 'R'

                        #calculate battle outcome
                        battleresult = SystemBattle.playerAttack(
                            monsters, player, attackDir)
                        monsterAttackMessage = self.monsterMoveAndAttack(
                            monsters, player, self.screen)

                        if battleresult[0]:
                            gameMessage = "Golpeas al enemigo por {0}! Has matado al enemigo! ".format(str(battleresult[1])) + \
                            monsterAttackMessage
                            panelMensajes.mostrarMensaje(gameMessage)

                        elif battleresult[1] == 0:
                            gameMessage = "No hay nada que golpear aqui! {0}".format(
                                monsterAttackMessage)
                            panelMensajes.mostrarMensaje(gameMessage)

                        else:
                            gameMessage = "Golpeas al enemigo por {0}! {1}".format(
                                str(battleresult[1]), monsterAttackMessage)
                            panelMensajes.mostrarMensaje(gameMessage)

                        self.removeMonster(monsters)

                    #Dig down wall(D key pressed)
                    elif event.key == pygame.K_d:

                        panelMensajes.mostrarMensaje("Donde quieres cavar?")
                        pygame.display.flip()

                        pygame.event.set_blocked(
                            pygame.KEYUP
                        )  #Block KEYUP so its not added to the event queue
                        digWhere = pygame.event.wait()  #Wait for an event

                        try:
                            if digWhere.key == pygame.K_DOWN:
                                Mazmorra().actualizarMazmorra(
                                    self.screen, cave, 'D',
                                    player.coordenada.getCoordenadaX(),
                                    player.coordenada.getCoordenadaY())
                                gameMessage = "You dig down"
                                panelMensajes.mostrarMensaje(gameMessage)

                            elif digWhere.key == pygame.K_UP:
                                Mazmorra().actualizarMazmorra(
                                    self.screen, cave, 'U',
                                    player.coordenada.getCoordenadaX(),
                                    player.coordenada.getCoordenadaY())
                                gameMessage = "You dig up"
                                panelMensajes.mostrarMensaje(gameMessage)

                            elif digWhere.key == pygame.K_LEFT:
                                Mazmorra().actualizarMazmorra(
                                    self.screen, cave, 'L',
                                    player.coordenada.getCoordenadaX(),
                                    player.coordenada.getCoordenadaY())
                                gameMessage = "You dig left"
                                panelMensajes.mostrarMensaje(gameMessage)

                            elif digWhere.key == pygame.K_RIGHT:
                                Mazmorra().actualizarMazmorra(
                                    self.screen, cave, 'R',
                                    player.coordenada.getCoordenadaX(),
                                    player.coordenada.getCoordenadaY())
                                gameMessage = "You dig right"
                                panelMensajes.mostrarMensaje(gameMessage)

                            gameMessage = self.monsterMoveAndAttack(
                                monsters, player, self.screen)
                        except:
                            print("DEBUG: Event bugged out")

                    break  #only one event is handled at a time, so break out of the event loop after one event is finished

            #Divide by 16 to get correct tile index
            panelMazmorra.dibujarMapa()

            #draw player, monsters and items
            player.dibujar()

            for m in monsters:
                m.dibujar()

            for i in items:
                i.dibujar()

            #Make stats box and display it
            panelEstadisticas.mostrarEstadisticas(player, self.mazmorraLevel)

            #Display
            pygame.display.flip()