245 lines
9.8 KiB
Python
245 lines
9.8 KiB
Python
|
#!/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()
|
||
|
|