Estoy desarrollando un juego con el material de la pagina y pilas, el mono, la banana y la bomba , El juego es sencillo. Lo que busco ahora es generar aleatoria mente la posición de X cantidad de bananas, pero no logro hacerlo:
#!/usr/bin/env python # -*- coding: utf-8 -*-
#Modulos import pygame from pygame.locals import* import sys
#Constantes WIDHT = 640 HEIGHT = 480
#variables
#Clases class Mono(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("/home/irving/Desktop/mbpy/mono1.png") self.rect = self.image.get_rect() self.rect.x = 5 self.rect.y = 360 def mover(self,time,tecla): if tecla[pygame.K_LEFT]: self.rect.x -=10 if self.rect.x <=0: self.rect.x = 0 if tecla[pygame.K_RIGHT]: self.rect.x +=10 if self.rect.x >= 483: self.rect.x = 483
def main(): screen =pygame.display.set_mode((WIDHT,HEIGHT)) pygame.display.set_caption("Monkey Banana") fondo = pygame.image.load("/home/irving/Desktop/mbpy/fondo.png") mono = Mono() banana = Banana() clock = pygame.time.Clock() while True: time = clock.tick(60) tecla = pygame.key.get_pressed() for eventos in pygame.event.get(): if eventos.type == QUIT: sys.exit(0) screen.blit(fondo,(0,0)) screen.blit(mono.image,mono.rect) for i in range(20): screen.blit(banana.image,(banana.rect.x*i+2*20,banana.rect.y)) mono.mover(time,tecla) #if tecla[pygame.K_LEFT]: # xmono -= 10 pygame.display.flip() return 0
if __name__ == '__main__': pygame.init() main()
Quiero que las bananas aparezcan en diferentes lugares de la pantalla para que no salgan todas en una misma posición, pero aun no se bien como va esto , si me pueden orientar estaría muy agradecido.
hugoruscitti escribió:Buenas, hay un modulo de python llamado random que te permite calcular numeros elatorios.
Por ejemplo, si quiero un numero entre 0 y 600 puedo escribir:
>>> import random >>> random.randint(0, 600) 477
Creo que en tu codigo, el retorno de esa funcion se las prodrias asignar a "self.rect.x", en el metodo __init__ de la clase Banana.
Avisanos si te sirve...
Saludos.
Gracias me sirvió.
Ya conocía ese modulo, incluso lo empece a utilizar después de hacer la pregunta, solo que dentro del bucle y lo que hacia era generar una posición aleatoria a cada pasada del bucle. Ya poniéndolo donde me has dicho funciona perfecto, aun no como quiero pero funciona
Básicamente lo que quiero lograr es que las bananas se generen de forma aleatoria en X y en Y fuera de la pantalla para que después caigan poco a poco y el mono las pueda tomar. Tipo esos juegos de atrapar cosas. Mira dejo un vídeo:
um... no pudé ver el video, porque creo que ya no está disponible.
Igualmente, creo que te entendí, si quieres que las bananas "caigan" desde la parte superior de la ventana, podrías asignarle una posición inicial, fuera de la pantalla y luego ir haciendola bajar poco a poco:
y en el bucle while tienes que llamar regularmente:
banana.update()
Ten en cuenta que si quieres que caigan muchas bananas, lo mas indicado es ir creando una banana por vez, por ejemplo cada 3 segundos. pygame tiene algo llamado grupos que te puede ser de utilidad para hacer eso.
Raro lo del vídeo, no lo he borrado, supongo que fue un error de enlace. Lo dejo aquí:
Y ya he hecho algunos cambios, donde hago que funcione mejor el efecto, me falta agregar algo de sprites y colisiones, que ya estoy estudiando, haber si las implemento en un rato mas. Ahora mismo me pasa algo que si cualquier banana pasa de la pantalla todas las del "grupo" empiezan a desaparecer. Te dejo el código, y al ultimo el vídeo de como va.
#!/usr/bin/env python # -*- coding: utf-8 -*-
#Modulos import pygame from pygame.locals import* import sys import random
#Constantes WIDHT = 640 HEIGHT = 480
#variables
#Clases class Mono(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("/home/irving/Desktop/mbpy/mono_normal.png") self.rect = self.image.get_rect() self.rect.x = 5 self.rect.y = 360 def mover(self,time,tecla): """movimiento del personaje""" if tecla[pygame.K_LEFT]: self.rect.x -=10 if self.rect.x <=0: self.rect.x = 0 if tecla[pygame.K_RIGHT]: self.rect.x +=10 if self.rect.x >= 483: self.rect.x = 483
Escribo para agregar que sigo trabajando en el juego, le agregue un contador de puntos y también colisiones entre bananas y el mono, solo que no logro hacer el efecto de las bananas vuelvan a una posición definida de la pantalla, así como cuando pasan el limite, ahora mismo sólo me doy cuenta que hay colisión debido a que aumentan los puntos. Dejo mi código por si me pueden echar un cable con lo de las colisiones y también de las imágenes, me gustaría que el mono cambie de cara cuando toma la banana.
#!/usr/bin/env python # -*- coding: utf-8 -*-
#Modulos import pygame from pygame.locals import* import sys import random
#Constantes WIDHT = 640 HEIGHT = 480
#Clases class Mono(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("/home/irving/Desktop/mbpy/mono_normal.png") self.rect = self.image.get_rect() self.rect.x = 5 self.rect.y = 390 def mover(self,time,tecla): """movimiento del personaje""" if tecla[pygame.K_LEFT]: self.rect.x -=10 if self.rect.x <=0: self.rect.x = 0 if tecla[pygame.K_RIGHT]: self.rect.x +=10 if self.rect.x >= 540: self.rect.x = 540
class Banana(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("/home/irving/Desktop/mbpy/banana.png") self.rect = self.image.get_rect() self.rect.x = random.randint(0,600) self.rect.y = random.randint(80,120)*-random.randint(1,6) def mover(self): self.rect.y += 4 #Si se sale de la pantalla localizamos el objeto en otra posición if self.rect.y >=480: self.rect.x = random.randint(0,600) self.rect.y = -70*random.randint(1,6)-random.randint(20,50)
class Bomba(pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load("/home/irving/Desktop/mbpy/bomba.png") self.rect = self.image.get_rect() self.rect.x = random.randint(0,550) self.rect.y = random.randint(80,120)*-random.randint(1,6)-50 def mover(self): self.rect.y += 3 if self.rect.y >= 480: #Si se sale de la pantalla localizamos el objeto en otra posición self.rect.x = random.randint(0,550) self.rect.y = random.randint(80,120)*-random.randint(1,6)-50
Tendrias que buscar repetir código para las bombas y bananas o crear una función dondé con parametros te evites "duplicar" código.
Otra cosilla, porque en lugar de escribir "Banana()" n veces y otras tantas la clase Bomba en sus respectivas variables: bananas y bombas, utilizas algo como
bananas=[] for i in range(6): bananas.append(Banana())
y si cambias el número por una variable, por ejemplo nBananas=6.
Por ejemplo algo asi creo que puede ser útil:
# Constantes y Variables nBananas = 6 #Número de bananas nBombas = 4 #Número de bombas # --- bananas = bombas =[]
# Funciones def crear_N_i(lista,num,elemento): ''' Se añaden N vece el elemento a la lista , ya existente, indicada.''' for i in range(num): lista.append(elemento)
# Uso crear_N_i(bananas,nBananas,Banana()) crear_N_i(bombas,nBombas,Bomba())
Son sugerencias, pero tú eres el único que sabe como te vas a aclarar y trabajar mejor