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)
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)
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()
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
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()
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
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)]
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
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
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
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
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
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
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
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)
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()