#!/usr/bin/python import sys import time import pygame import random from settings import Settings from clase_tanque import Tanque from clase_fondo import Fondo from clase_bala import Bala from clase_enemigo import Enemigo from clase_puntuaciones import Puntuacion from clase_vidas import Vida from clase_boton import Boton class GuerraTanque: ''' Clase general para gestionar recursos y juego ''' def __init__(self): ''' Inicializar el juego y crear recursos ''' pygame.init() # Leemos valores de configuracion del juego self.settings = Settings() # Leemos numero de vidas self.vidas = self.settings.vidas self.juego_activo = False # Puntuacion a Cero self.puntuacion = 0 # Preparamos pantalla self.screen = pygame.display.set_mode((self.settings.pantalla_ancho , self.settings.pantalla_alto)) pygame.display.set_caption("GUERRA DE TANQUES - 'ESC' para salir") pygame.display.set_icon(pygame.image.load('imagenes/tanque_derecha_01.png')) # Incluir Fondo self.fondo_juego = Fondo(self) # Incluimos la puntuacion self.puntuacion = Puntuacion(self) # Incluimos las vidas self.tanques_que_nos_quedan = pygame.sprite.Group() self._crear_vidas() # Iniciar tanque self.tanque = Tanque(self) self.balas = pygame.sprite.Group() self.mirando_hacia='Arr' # Iniciar enemigos self.enemigos = pygame.sprite.Group() self._crear_escuadron() self.ruido_cadenas = pygame.mixer.Sound('sonidos/ruido_cadenas_tanque.wav') self.boton_iniciar = Boton(self, "Iniciar") def run_game(self): #pygame.mixer.Sound('sonidos/retro-sound.mp3').play() #time.sleep(0.5) #pygame.mixer.stop() ''' Bucle infinito del juego ''' while True: self.fondo_juego ''' Leemos eventos de teclado y raton ''' self.chequear_eventos() if self.juego_activo: # Solo si esta el juego activo ''' Actualizar tanque ''' self.tanque.update() ''' Gestionamos los disparos y las balas ''' self._actualizar_bala() ''' Gestionamos los enemigos ''' self.enemigos.update() # Si chocamos con enemigo morimos if pygame.sprite.spritecollideany(self.tanque,self.enemigos): self._chequear_vidas() ''' Actualizar pantalla ''' self.actualizar_pantalla() def _chequear_vidas(self): # Chocamos con un tanque... Quitamos una vida self.vidas -= 1 self.puntuacion.nivel -= 1 self.tanques_que_nos_quedan.remove() # Situamos tanque en posicion inicial self.tanque.rect.midbottom = self.screen.get_rect().midbottom # Vaciamos de enemigos self.enemigos.empty() self.tanques_que_nos_quedan.empty() # Cheequeamos si hay que pintar el game over if self.vidas > 0: pygame.mixer.Sound('sonidos/explosion_tanque.wav').play() # Hacemos una pequeña pausa time.sleep(0.5) else: self.puntuacion.nivel += 1 # Mensaje de GAME OVER print("G A M E O V E R") pygame.mixer.Sound('sonidos/game_over.wav').play() self.juego_activo = False pygame.mouse.set_visible(True) def actualizar_pantalla(self): ''' Redibujar la pantalla ''' # Recargar imagenes y cambiar nueva pantalla # Relleno de color del fondo self.screen.fill(self.settings.color_fondo) # Incluir recursos del juego self.fondo_juego.blitme() self.tanque.blitme() if self.vidas == 0: img_fin_juego = pygame.image.load('imagenes/game_over.png') self.screen.blit(img_fin_juego, (120, 300)) pygame.display.set_caption("GUERRA DE TANQUES - 'ESC' para salir") ''' Balas/Disparos''' for disparo in self.balas.sprites(): disparo.pintar_bala() ''' Escuadron enemigo ''' self.enemigos.draw(self.screen) ''' Vamos grabando la puntuacion del juego ''' self.puntuacion.mostrar_puntacion() # Pintamos grupo de mini-tanques que indican la vida self.tanques_que_nos_quedan.draw(self.screen) # Dibujar boton de iniciar partida si juego inactivo if not self.juego_activo: self.boton_iniciar.dibujar_boton() # Pintamos la ultima pantalla que hemos dibujado en memoria pygame.display.flip() def _crear_escuadron(self): ''' Crear un escuadron de 5 tanques enemigos ''' enemigo = Enemigo(self) random.seed() num_enemigos = 5 for i in range(num_enemigos): enemigo = Enemigo(self) enemigo.velocidad = (self.puntuacion.nivel / 4) + 0.5 iniX = int((800/num_enemigos) * int(i)) finX= int(iniX + (800/num_enemigos)) #print(f"iniX {iniX}") #print(f"finX {finX}") enemigo.x = random.randrange(iniX, finX) y = 300 enemigo.y = random.randrange(0, y) enemigo.rect.x = enemigo.x enemigo.rect.y = enemigo.y self.enemigos.add(enemigo) def _crear_vidas(self): ''' Crear tantos mini-tanques de vidas como vidas queden ''' mini_tanque = Vida(self) vidas_quedan = self.vidas for i in range(vidas_quedan): mini_tanque = Vida(self) mini_tanque.x = (28 * i) + 5 mini_tanque.y = 0 mini_tanque.rect.x = mini_tanque.x mini_tanque.rect.y = mini_tanque.y self.tanques_que_nos_quedan.add(mini_tanque) def _disparar_bala(self): ''' Crear una bala nueva e incluirla en Group ''' if len(self.balas) < self.settings.balas_permitidas: nueva_bala = Bala(self, self.mirando_hacia) self.balas.add(nueva_bala) pygame.mixer.Sound('sonidos/sonido_bala.wav').play() def _actualizar_bala(self): ''' Crear nuevas balas y eliminar las viejas ''' # Posicion y movimiento de las balas self.balas.update() # Eliminamos balas que se salen de la pantalla pantalla = self.screen.get_rect() for disparo in self.balas.copy(): if disparo.rect.bottom <= 0 or disparo.rect.top >= 600 or disparo.rect.left <= 0 or disparo.rect.left >= 800: self.balas.remove(disparo) # Chequear si destruyo enemigo # Bala choca con Enemigo => Se destruye Bala (True), Se destruye Enemigo (True) colision = pygame.sprite.groupcollide(self.balas, self.enemigos, True, True) # Si hay datos en colision es que alcanzamos al enemigo if len(colision) > 0: # 5 puntos por tanque self.puntuacion.puntos += 5 pygame.mixer.Sound('sonidos/explosion_enemigo.wav').play() # Si no hay enemigos creo un nuevo escuadron if not self.enemigos: # 7 puntos por acabar con escuadra completa self.puntuacion.puntos += 7 self.puntuacion.nivel += 1 # Eliminar Balas self.balas.empty() # Crear escuadron self._crear_escuadron() # Vidas self._crear_vidas() def _chequear_boton_iniciar(self, posicion_raton): ''' Si pulsa raton iniciamos juego ''' if self.boton_iniciar.rect.collidepoint(posicion_raton): self.juego_activo = True pygame.mouse.set_visible(False) def chequear_eventos(self): ''' Leemos eventos de teclado y raton ''' for evento in pygame.event.get(): if evento.type == pygame.QUIT: sys.exit() elif evento.type == pygame.KEYDOWN: # Detectar que se presiona tecla self.ruido_cadenas.play(-1) # Teclas: S, Q o ESC finalizan el juego if evento.key == pygame.K_s or evento.key == pygame.K_q or evento.key == pygame.K_ESCAPE: pygame.QUIT sys.exit() #if evento.key == pygame.K_i: # Iniciar # self.juego_activo = True if evento.key == pygame.K_RIGHT: # mover tanque a la derecha self.tanque.mover_derecha = True self.mirando_hacia = 'Dcha' if evento.key == pygame.K_LEFT: # mover tanque a la izquierda self.tanque.mover_izquierda = True self.mirando_hacia = 'Izda' if evento.key == pygame.K_UP: # mover tanque hacia arriba self.tanque.mover_arriba = True self.mirando_hacia = 'Arr' if evento.key == pygame.K_DOWN: # mover tanque hacia abajo self.tanque.mover_abajo = True self.mirando_hacia = 'Aba' if evento.key == pygame.K_SPACE: self._disparar_bala() elif evento.type == pygame.KEYUP: # Detener movimientos self.ruido_cadenas.stop() self.tanque.mover_izquierda = False self.tanque.mover_derecha = False self.tanque.mover_arriba = False self.tanque.mover_abajo = False elif evento.type == pygame.MOUSEBUTTONDOWN: # Si aprieta raton (en cualquier sitio) posicion_raton = pygame.mouse.get_pos() self._chequear_boton_iniciar(posicion_raton) self.puntuacion.nivel = 1 self.puntuacion.puntos = 0 self.vidas = 3 if __name__ == '__main__': ''' Creamos instancia del juego y lo iniciamos ''' juego = GuerraTanque() juego.run_game()