commit 6b6b500cf0a27b21a1a03020b9beb0f3b2ec5e5e Author: luisgulo Date: Thu Jun 1 00:39:26 2023 +0200 subida a repo propio diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000..105ce2d --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/juego_tanque.iml b/.idea/juego_tanque.iml new file mode 100644 index 0000000..74d515a --- /dev/null +++ b/.idea/juego_tanque.iml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..14dd84c --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..9f1bc64 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..5e1725a --- /dev/null +++ b/README.md @@ -0,0 +1,33 @@ +# tanques +Juego de tanques 2D desarrollado en Python con pygame +

+

+ +Requisitos: Tener instalado python y pip + +Como usarlo: + +1.- Descargar codigo del repositorio: + +$ cd + +$ git clone https://gitea.soloconlinux.org.es/luisgulo/tanques.git + +$ cd tanques + + +2.- Instalar modulo pygame + +$ source venv/bin/activate + +$ pip install pygame + + +3a.- Lanzar juego (modo directo): + +$ chmod +x guerra_tanques.py + +$ ./guerra_tanques.py + +3b.- Lanzar juego (mediante python) +$ python ./guerra_tanques.py diff --git a/__pycache__/clase_bala.cpython-39.pyc b/__pycache__/clase_bala.cpython-39.pyc new file mode 100644 index 0000000..6c4f302 Binary files /dev/null and b/__pycache__/clase_bala.cpython-39.pyc differ diff --git a/__pycache__/clase_boton.cpython-39.pyc b/__pycache__/clase_boton.cpython-39.pyc new file mode 100644 index 0000000..7c305ce Binary files /dev/null and b/__pycache__/clase_boton.cpython-39.pyc differ diff --git a/__pycache__/clase_enemigo.cpython-39.pyc b/__pycache__/clase_enemigo.cpython-39.pyc new file mode 100644 index 0000000..6e6db83 Binary files /dev/null and b/__pycache__/clase_enemigo.cpython-39.pyc differ diff --git a/__pycache__/clase_fondo.cpython-39.pyc b/__pycache__/clase_fondo.cpython-39.pyc new file mode 100644 index 0000000..6f25d12 Binary files /dev/null and b/__pycache__/clase_fondo.cpython-39.pyc differ diff --git a/__pycache__/clase_puntuaciones.cpython-39.pyc b/__pycache__/clase_puntuaciones.cpython-39.pyc new file mode 100644 index 0000000..76aa781 Binary files /dev/null and b/__pycache__/clase_puntuaciones.cpython-39.pyc differ diff --git a/__pycache__/clase_tanque.cpython-39.pyc b/__pycache__/clase_tanque.cpython-39.pyc new file mode 100644 index 0000000..9a911b5 Binary files /dev/null and b/__pycache__/clase_tanque.cpython-39.pyc differ diff --git a/__pycache__/clase_vidas.cpython-39.pyc b/__pycache__/clase_vidas.cpython-39.pyc new file mode 100644 index 0000000..e37e8a2 Binary files /dev/null and b/__pycache__/clase_vidas.cpython-39.pyc differ diff --git a/__pycache__/settings.cpython-39.pyc b/__pycache__/settings.cpython-39.pyc new file mode 100644 index 0000000..3ece3cd Binary files /dev/null and b/__pycache__/settings.cpython-39.pyc differ diff --git a/capturas_juego/captura_fin.png b/capturas_juego/captura_fin.png new file mode 100644 index 0000000..610cbf2 Binary files /dev/null and b/capturas_juego/captura_fin.png differ diff --git a/capturas_juego/captura_inicio.png b/capturas_juego/captura_inicio.png new file mode 100644 index 0000000..a26e89b Binary files /dev/null and b/capturas_juego/captura_inicio.png differ diff --git a/clase_bala.py b/clase_bala.py new file mode 100644 index 0000000..a55d045 --- /dev/null +++ b/clase_bala.py @@ -0,0 +1,47 @@ +import pygame +from pygame.sprite import Sprite +#from clase_tanque import Tanque + +class Bala(Sprite): + ''' Clase para gestionar las balas disparadas ''' + def __init__(self, juego, direccion): + ''' Crear objeto desde posicion del tanque ''' + super().__init__() + self.screen = juego.screen + self.settings = juego.settings + self.color = self.settings.bala_color + # Crear rectangulo para la bala en posicion (0,0) y luego la colocamos + self.rect = pygame.Rect(0,0, self.settings.bala_ancho, self.settings.bala_largo) + self.rect.midtop = juego.tanque.rect.midtop + self.direccion_bala = direccion + # defecto + self.x = float(self.rect.x) + self.y = float(self.rect.y) + if self.direccion_bala == 'Arr': + self.x = float(self.rect.x) + self.y = float(self.rect.y) + if self.direccion_bala == 'Aba': + self.x = float(self.rect.x) + self.y = float(self.rect.y) + 64 + if self.direccion_bala == 'Dcha': + self.x = float(self.rect.x) + 31 + self.y = float(self.rect.y) + 30 + if self.direccion_bala == 'Izda': + self.x = float(self.rect.x) - 31 + self.y = float(self.rect.y) + 30 + + def update(self): + if self.direccion_bala == 'Arr': + self.y -= self.settings.bala_velocidad + if self.direccion_bala == 'Aba': + self.y += self.settings.bala_velocidad + if self.direccion_bala == 'Dcha': + self.x += self.settings.bala_velocidad + if self.direccion_bala == 'Izda': + self.x -= self.settings.bala_velocidad + + self.rect.x = self.x + self.rect.y = self.y + + def pintar_bala(self): + pygame.draw.rect(self.screen, self.color, self.rect) \ No newline at end of file diff --git a/clase_boton.py b/clase_boton.py new file mode 100644 index 0000000..13baffc --- /dev/null +++ b/clase_boton.py @@ -0,0 +1,28 @@ +import pygame.font + +class Boton: + def __init__(self, juego, mensaje): + ''' Inicializar atributos del boton ''' + self.screen = juego.screen + self.screen_rect = self.screen.get_rect() + # Ajustar dimensiones y propiedades del boton + self.width, self.height = 200, 50 + self.button_color = (0, 155, 0) + self.text_color = (255, 255, 255) + self.font = pygame.font.SysFont(None, 48) + # Crear objeto rectangular del boton y centrarlo + self.rect = pygame.Rect(0, 0, self.width, self.height) + self.rect.center = self.screen_rect.center + # Preparamos el mensaje del boton (1 sola vez) + self._preparar_mensaje(mensaje) + + def _preparar_mensaje(self, mensaje): + ''' Convertir el mensaje en imagen ''' + self.msg_image = self.font.render(mensaje, True, self.text_color, self.button_color) + self.msg_image_rect = self.msg_image.get_rect() + self.msg_image_rect.center = self.rect.center + + def dibujar_boton(self): + ''' Dibujamos boton vacio y luego el texto ''' + self.screen.fill(self.button_color, self.rect) + self.screen.blit(self.msg_image, self.msg_image_rect) \ No newline at end of file diff --git a/clase_enemigo.py b/clase_enemigo.py new file mode 100644 index 0000000..9f48216 --- /dev/null +++ b/clase_enemigo.py @@ -0,0 +1,97 @@ +import pygame +import random +from pygame.sprite import Sprite + +class Enemigo(Sprite): + ''' Clase para representar un enemigo ''' + + def __init__(self, juego): + ''' Inicializa al enemigo y lo coloca ''' + super().__init__() + self.screen = juego.screen + self.direccion = 'Aba' + # Cargamos imagen del enemigo + direccion = random.randrange(1,5) + if direccion == 1: + self.direccion = 'Aba' + self.rutaImagen = 'imagenes/enemigo_abajo_01.png' + if direccion == 2: + self.direccion = 'Arr' + self.rutaImagen = 'imagenes/enemigo_arriba_01.png' + if direccion == 3: + self.direccion = 'Dcha' + self.rutaImagen = 'imagenes/enemigo_derecha_01.png' + if direccion == 4: + self.direccion = 'Izda' + self.rutaImagen = 'imagenes/enemigo_izquierda_01.png' + self.velocidad = 1 + self.avance = random.randrange(25,200) + self.vEnemigo = True + self.image = pygame.image.load(self.rutaImagen) + self.rect = self.image.get_rect() + # Colocar al enemigo en su posicion + self.rect.x = self.rect.width + self.rect.y = self.rect.height + # guardamos posicion exacta del enemigo + self.x = float(self.rect.x) + self.y = float(self.rect.y) + + def update(self): + ''' Mover a los enemigos ''' + if self.vEnemigo: + if self.direccion == 'Aba': + self.rutaImagen = 'imagenes/enemigo_abajo_01.png' + if self.direccion == 'Arr': + self.rutaImagen = 'imagenes/enemigo_arriba_01.png' + if self.direccion == 'Dcha': + self.rutaImagen = 'imagenes/enemigo_derecha_01.png' + if self.direccion == 'Izda': + self.rutaImagen = 'imagenes/enemigo_izquierda_01.png' + else: + if self.direccion == 'Aba': + self.rutaImagen = 'imagenes/enemigo_abajo_02.png' + if self.direccion == 'Arr': + self.rutaImagen = 'imagenes/enemigo_arriba_02.png' + if self.direccion == 'Dcha': + self.rutaImagen = 'imagenes/enemigo_derecha_02.png' + if self.direccion == 'Izda': + self.rutaImagen = 'imagenes/enemigo_izquierda_02.png' + self.vEnemigo = not self.vEnemigo + # Desplazar tanque enemigo + if self.avance <= 0: + self.avance = random.randrange(25,200) + direccion = random.randrange(1, 5) + if direccion == 1: + self.direccion = 'Aba' + self.rutaImagen = 'imagenes/enemigo_abajo_01.png' + if direccion == 2: + self.direccion = 'Arr' + self.rutaImagen = 'imagenes/enemigo_arriba_01.png' + if direccion == 3: + self.direccion = 'Dcha' + self.rutaImagen = 'imagenes/enemigo_derecha_01.png' + if direccion == 4: + self.direccion = 'Izda' + self.rutaImagen = 'imagenes/enemigo_izquierda_01.png' + else: + if self.direccion == 'Arr': + self.rect.y -= self.velocidad + if self.direccion == 'Aba': + self.rect.y += self.velocidad + if self.direccion == 'Dcha': + self.rect.x += self.velocidad + if self.direccion == 'Izda': + self.rect.x -= self.velocidad + # Restamos movimiento realizado + self.avance -= self.velocidad + # Cambiar direccion si se sale de pantalla + pantalla = self.screen.get_rect() + if self.rect.x <= pantalla.left: # choca lado izdo + self.direccion = 'Dcha' + if self.rect.x >= pantalla.right - 64: + self.direccion = 'Izda' + if self.rect.y <= pantalla.top: + self.direccion = 'Aba' + if self.rect.y >= pantalla.bottom - 64: + self.direccion = 'Arr' + self.image = pygame.image.load(self.rutaImagen) \ No newline at end of file diff --git a/clase_fondo.py b/clase_fondo.py new file mode 100644 index 0000000..bf347c9 --- /dev/null +++ b/clase_fondo.py @@ -0,0 +1,11 @@ +import pygame + +class Fondo: + def __init__(self, juego): + self.screen = juego.screen + self.rutaImagen = 'imagenes/fondo.png' + self.image = pygame.image.load(self.rutaImagen) + + def blitme(self): + ''' Pintar fondo actual ''' + self.screen.blit(self.image, (0, 0)) \ No newline at end of file diff --git a/clase_puntuaciones.py b/clase_puntuaciones.py new file mode 100644 index 0000000..50af8a4 --- /dev/null +++ b/clase_puntuaciones.py @@ -0,0 +1,43 @@ +import pygame.font + +class Puntuacion: + ''' Clase par mostrar informacion de la puntuacion ''' + + def __init__(self, juego): + ''' Inicializar puntuacion ''' + self.screen = juego.screen + self.screen_rect = self.screen.get_rect() + self.settings = juego.settings + self.puntos = 0 + self.nivel = 1 + ''' Ajuste de la fuente de la puntuacion ''' + self.text_color = (30, 30, 30) + self.font = pygame.font.SysFont(None,48) + self.preparar_puntuacion() + self.preparar_nivel() + + def preparar_puntuacion(self): + ''' Convertir puntuacion en imagen renderizada ''' + score_str = "Ptos: " + str(self.puntos) + self.score_image = self.font.render(score_str, True, self.text_color) + ''' Puntuacion en parte superior derecha ''' + self.score_rect = self.score_image.get_rect() + self.score_rect.right = self.screen_rect.right - 20 + self.score_rect.top = 40 + + def preparar_nivel(self): + ''' convertir texto en imagen ''' + nivel_str = f"Nivel: {self.nivel}" + self.nivel_image = self.font.render(nivel_str, True, self.text_color) + ''' Nivel en parte sup. derecha y debajo de los puntos ''' + self.nivel_rect = self.nivel_image.get_rect() + self.nivel_rect.right = self.screen_rect.right - 20 + self.nivel_rect.top = 10 + + def mostrar_puntacion(self): + ''' dibujar la puntacion ''' + self.preparar_puntuacion() + self.screen.blit(self.score_image, self.score_rect) + ''' dibujar el nivel ''' + self.preparar_nivel() + self.screen.blit(self.nivel_image, self.nivel_rect) \ No newline at end of file diff --git a/clase_tanque.py b/clase_tanque.py new file mode 100644 index 0000000..0e586b9 --- /dev/null +++ b/clase_tanque.py @@ -0,0 +1,59 @@ +import pygame +from settings import Settings + +class Tanque: + ''' Esta clase gestiona el tanque ''' + def __init__(self, juego): + self.settings = Settings() + ''' Iniciar tanque y fija su posicion ''' + self.screen = juego.screen + self.screen_rect = juego.screen.get_rect() + ''' Leer imagen y cargar su rectangulo ''' + self.vTanque = True + self.rutaImagen = 'imagenes/tanque_arriba_01.png' + ''' Permitir movimiento continuo con teclas ''' + self.mover_derecha = False + self.mover_izquierda = False + self.mover_arriba = False + self.mover_abajo = False + self.image = pygame.image.load(self.rutaImagen) + self.rect = self.image.get_rect() + ''' Posicion inicial (abajo en el centro) ''' + self.rect.midbottom = self.screen_rect.midbottom + + def update(self): + if self.mover_derecha: + ruta = 'imagenes/tanque_derecha_' + self.rect.x += self.settings.velocidad_tanque + if self.rect.x >= 800 - 64: + self.rect.x = 800 - 64 + elif self.mover_izquierda: + ruta = 'imagenes/tanque_izquierda_' + self.rect.x -= self.settings.velocidad_tanque + if self.rect.x <= 0: + self.rect.x = 0 + elif self.mover_arriba: + ruta = 'imagenes/tanque_arriba_' + self.rect.y -= self.settings.velocidad_tanque + if self.rect.y <= 0: + self.rect.y = 0 + elif self.mover_abajo: + ruta = 'imagenes/tanque_abajo_' + self.rect.y += self.settings.velocidad_tanque + if self.rect.y >= 600 - 64: + self.rect.y = 600 - 64 + else: + trocear = self.rutaImagen.split('_') + ruta = trocear[0] + '_' + trocear[1] + '_' + ''' Simular moviento ruedas tanque ''' + if self.vTanque == True: + ruta = ruta + '01.png' + else: + ruta = ruta + '02.png' + self.rutaImagen = ruta + self.image = pygame.image.load(ruta) + self.vTanque = not self.vTanque + + def blitme(self): + ''' Pintar tanque en posicion actual ''' + self.screen.blit(self.image, self.rect) \ No newline at end of file diff --git a/clase_vidas.py b/clase_vidas.py new file mode 100644 index 0000000..b51cb53 --- /dev/null +++ b/clase_vidas.py @@ -0,0 +1,21 @@ +import pygame +from pygame.sprite import Sprite + +class Vida(Sprite): + ''' Clase para gestionar las vidas restantes ''' + def __init__(self, juego): + super().__init__() + self.vidas_quedan = juego.vidas + self.screen = juego.screen + self.rutaImagen = 'imagenes/tanque_vida.png' + self.image = pygame.image.load(self.rutaImagen) + self.rect = self.image.get_rect() + # Colocar la vida en su posicion + self.rect.x = self.rect.width + self.rect.y = self.rect.height + # guardamos posicion exacta de la vida + self.x = float(self.rect.x) + self.y = float(self.rect.y) + + def update(self): + self.image = pygame.image.load(self.rutaImagen) \ No newline at end of file diff --git a/guerra_tanques.py b/guerra_tanques.py new file mode 100755 index 0000000..7ce7f2c --- /dev/null +++ b/guerra_tanques.py @@ -0,0 +1,244 @@ +#!/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() + diff --git a/imagenes/enemigo_abajo_01.png b/imagenes/enemigo_abajo_01.png new file mode 100644 index 0000000..8782797 Binary files /dev/null and b/imagenes/enemigo_abajo_01.png differ diff --git a/imagenes/enemigo_abajo_02.png b/imagenes/enemigo_abajo_02.png new file mode 100644 index 0000000..4562990 Binary files /dev/null and b/imagenes/enemigo_abajo_02.png differ diff --git a/imagenes/enemigo_arriba_01.png b/imagenes/enemigo_arriba_01.png new file mode 100644 index 0000000..a2bf539 Binary files /dev/null and b/imagenes/enemigo_arriba_01.png differ diff --git a/imagenes/enemigo_arriba_02.png b/imagenes/enemigo_arriba_02.png new file mode 100644 index 0000000..7eb4816 Binary files /dev/null and b/imagenes/enemigo_arriba_02.png differ diff --git a/imagenes/enemigo_derecha_01.png b/imagenes/enemigo_derecha_01.png new file mode 100644 index 0000000..3e91829 Binary files /dev/null and b/imagenes/enemigo_derecha_01.png differ diff --git a/imagenes/enemigo_derecha_02.png b/imagenes/enemigo_derecha_02.png new file mode 100644 index 0000000..4d34094 Binary files /dev/null and b/imagenes/enemigo_derecha_02.png differ diff --git a/imagenes/enemigo_izquierda_01.png b/imagenes/enemigo_izquierda_01.png new file mode 100644 index 0000000..b98849d Binary files /dev/null and b/imagenes/enemigo_izquierda_01.png differ diff --git a/imagenes/enemigo_izquierda_02.png b/imagenes/enemigo_izquierda_02.png new file mode 100644 index 0000000..148827a Binary files /dev/null and b/imagenes/enemigo_izquierda_02.png differ diff --git a/imagenes/fondo.png b/imagenes/fondo.png new file mode 100644 index 0000000..69b6d35 Binary files /dev/null and b/imagenes/fondo.png differ diff --git a/imagenes/game_over.png b/imagenes/game_over.png new file mode 100644 index 0000000..146eedf Binary files /dev/null and b/imagenes/game_over.png differ diff --git a/imagenes/tanque_abajo_01.png b/imagenes/tanque_abajo_01.png new file mode 100644 index 0000000..48e14b8 Binary files /dev/null and b/imagenes/tanque_abajo_01.png differ diff --git a/imagenes/tanque_abajo_02.png b/imagenes/tanque_abajo_02.png new file mode 100644 index 0000000..4fa539e Binary files /dev/null and b/imagenes/tanque_abajo_02.png differ diff --git a/imagenes/tanque_arriba_01.png b/imagenes/tanque_arriba_01.png new file mode 100644 index 0000000..105edd1 Binary files /dev/null and b/imagenes/tanque_arriba_01.png differ diff --git a/imagenes/tanque_arriba_02.png b/imagenes/tanque_arriba_02.png new file mode 100644 index 0000000..dbbdfdd Binary files /dev/null and b/imagenes/tanque_arriba_02.png differ diff --git a/imagenes/tanque_derecha_01.png b/imagenes/tanque_derecha_01.png new file mode 100644 index 0000000..9a68aec Binary files /dev/null and b/imagenes/tanque_derecha_01.png differ diff --git a/imagenes/tanque_derecha_02.png b/imagenes/tanque_derecha_02.png new file mode 100644 index 0000000..bfe9582 Binary files /dev/null and b/imagenes/tanque_derecha_02.png differ diff --git a/imagenes/tanque_izquierda_01.png b/imagenes/tanque_izquierda_01.png new file mode 100644 index 0000000..7acdaf4 Binary files /dev/null and b/imagenes/tanque_izquierda_01.png differ diff --git a/imagenes/tanque_izquierda_02.png b/imagenes/tanque_izquierda_02.png new file mode 100644 index 0000000..3e2b12e Binary files /dev/null and b/imagenes/tanque_izquierda_02.png differ diff --git a/imagenes/tanque_vida.png b/imagenes/tanque_vida.png new file mode 100644 index 0000000..3101f14 Binary files /dev/null and b/imagenes/tanque_vida.png differ diff --git a/requeriments.txt b/requeriments.txt new file mode 100644 index 0000000..247ea34 --- /dev/null +++ b/requeriments.txt @@ -0,0 +1 @@ +pygame==2.4.0 diff --git a/runtime.txt b/runtime.txt new file mode 100644 index 0000000..15f1ac1 --- /dev/null +++ b/runtime.txt @@ -0,0 +1 @@ +Python 3.9.2 diff --git a/settings.py b/settings.py new file mode 100644 index 0000000..2e4e2e7 --- /dev/null +++ b/settings.py @@ -0,0 +1,18 @@ +class Settings: + ''' Esta clase es para guardar toda la configuracion del juego ''' + def __init__(self): + ''' Inicializar los valores del juego ''' + # Resolucion + self.pantalla_ancho = 800 + self.pantalla_alto = 600 + # Color fondo + self.color_fondo = (0, 50, 0) + self.velocidad_tanque = 1 + ''' Configuracion de las balas ''' + self.bala_velocidad = 2 + self.bala_ancho = 8 + self.bala_largo = 8 + self.bala_color = (60, 60, 60) + self.balas_permitidas = 3 # Num de disparos permitidos + self.vidas = 3 + self.puntos = 0 diff --git a/sonidos/explosion_enemigo.wav b/sonidos/explosion_enemigo.wav new file mode 100644 index 0000000..1ea5a88 Binary files /dev/null and b/sonidos/explosion_enemigo.wav differ diff --git a/sonidos/explosion_tanque.wav b/sonidos/explosion_tanque.wav new file mode 100644 index 0000000..e2094b7 Binary files /dev/null and b/sonidos/explosion_tanque.wav differ diff --git a/sonidos/game_inicio.wav b/sonidos/game_inicio.wav new file mode 100644 index 0000000..b62f38c Binary files /dev/null and b/sonidos/game_inicio.wav differ diff --git a/sonidos/game_over.wav b/sonidos/game_over.wav new file mode 100644 index 0000000..1c99ecb Binary files /dev/null and b/sonidos/game_over.wav differ diff --git a/sonidos/retro-sound.mp3 b/sonidos/retro-sound.mp3 new file mode 100644 index 0000000..86d1fa4 Binary files /dev/null and b/sonidos/retro-sound.mp3 differ diff --git a/sonidos/ruido_cadenas_tanque.wav b/sonidos/ruido_cadenas_tanque.wav new file mode 100644 index 0000000..0e60419 Binary files /dev/null and b/sonidos/ruido_cadenas_tanque.wav differ diff --git a/sonidos/sonido_bala.wav b/sonidos/sonido_bala.wav new file mode 100644 index 0000000..eadb169 Binary files /dev/null and b/sonidos/sonido_bala.wav differ