tanques/guerra_tanques.py
2023-06-01 00:39:26 +02:00

244 lines
9.8 KiB
Python
Executable file

#!/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()