Materia
Ejercicios


Tarea 2: La Batalla de los Tanques

Objetivos de aprendizaje

Después de resolver la tarea 2, usted será capaz de:

  • Implementar un programa que requiera entradas y salidas
  • Diseñar e implementar programas simples usando algunas sentencias elementales de Python (asignaciones, if, for y while);
  • Utilizar estructuras de datos (listas, tuplas, diccionarios, conjuntos) para almacenar y capturar datos.
  • Entender la lógica que hay detrás de un juego empleando el módulo de pygame.
  • Implementar un conjunto de funciones siguiendo ciertas instrucciones y utilizando un módulo externo (pygame).

Enunciado

En esta tarea usted, junto a su equipo de trabajo, deberá implementar este juego empleando el módulo de python para videojuegos llamado pygame. Descargue el módulo.

El juego La batalla de los tanques consiste en tomar el control de un tanque con el fin de eliminar todos los tanques enemigos antes de que éstos acaben con el tanque del jugador. El juego termina cuando al tanque del jugador se le acaban los escudos (vidas), tu misión es soportar la mayor cantidad de tiempo con vida.

Para el desarrollo del juego se les entregará un conjunto de archivos que deben descargarlo de este enlace y que servirán de base para qu usted implemento el resto. Las características a implementar por usted son las siguientes:

  • Hacer que el tanque del jugador se mueva de acuerdo a las teclas que presione el usuario (izquierda, derecha, arriba y abajo) .
  • Al ser presionada la barra espaciadora el tanque del jugador debe disparar un proyectil.
  • Hacer que todos los proyectiles se muevan a través del mapa, en la dirección en que fueron disparados.
  • Revisar y determinar la forma de proceder ante los posibles impactos de proyectiles que pueda recibir el tanque del jugador y los tanques enemigos.

Nota

No es necesario estudiar el módulo pygame, usted sólo debe crear las funciones con los conocimientos que ya posee de python (if, for, while, funciones). De las estructuras de datos puede documentarse leyendo el material en línea de listas, tuplas, conjuntos y diccionarios.

Representación

La mayor parte del juego se encuentra implementada en el archivo main.py, desde donde se llamarán las funciones del módulo de funciones.py, que es el archivo donde se deben implementar las funciones. Una versión simplificada de cómo main.py llama a las funciones que usted implementará en funciones.py se muestra en el siguiente diagrama de flujo:

../../_images/Diagrama.gif

En el diagrama se puede ver que los cuadros escritos en negrita corresponden a las funciones que usted debe implementar (Incluyendo las de bonificacion).

Para el movimiento de los objetos móviles del juego, es decir, los tanques y proyectiles, se debe considerar que el mapa es una grilla de 21 x 20 cuadros de 30 x 30 pixeles cada uno. Cada cuadro en el mapa se describe por medio de las coordendas x e y (medidas en pixeles) desde la esquina superior izquierda (representadas en rojo en el esquema).

../../_images/grilla_tanque.png

De la imagen de arriba, se puede ver que el tanque del jugador (Tanque verde) está ubicado en la posición (480,480).

Cada tanque (jugador y enemigos) es representado como un diccionario cuyas llaves son “posición”, “orientación” y “escudo”. En el caso del tanque del jugador existe la llave adicional “munición”.

Ver descripción de los campos del diccionario :

  • “Posicion”: Corresponde a una tupla (x,y) de coordenadas en el plano.
  • “Orientacion”: String ‘N’, ‘S’,’O’,’E’ que determina la dirección en que apunta el cañón del tanque en un determinado momento.
  • “Escudo”: Número entero que representa la cantidad de escudos que posee un tanque.
  • “Municion (solo tanque del jugador)”: Número entero que representa la cantidad de munición que posee en el tanque del jugador.
  • “Tipo”: String “J” o “E” que representa el tipo de tanque. “J” para el tanque del Jugador y “E” para el tanque enemigo.

Considerando el esquema descrito arriba, el tanque del jugador estaría representado de la siguiente forma

jugador = {"posicion":(480,480),
        "orientacion":'N',
        "escudo": 9,
        "municion": 99,
        "tipo":"J"
        }

Mientras que el tanque enemigo podría ser

enemigo = {"posicion":(90,480),
        "orientacion":'S',
        "escudo": 1,
        "tipo": "E"
         }

Los bloques de murallas son representados como un conjunto de tuplas(x,y) de sus coordenadas en el plano. Usted tendrá que asegurarse de que ningún tanque pase por sobre estos bloques.

Los proyectiles son representados como un conjunto de tuplas ((x,y), objetivo, direccion), donde el primer elemento es una tupla que indica la posición del proyectil en un instante dado, el segundo elemento es un String “J” o “E” dependiendo de cuál es el objetivo del proyectil y el tercer elemento es un string ‘N’, ‘S’, ‘E’, ‘O’ que señala la dirección en que fue lanzado el proyectil. El proyectil que aparece en el esquema está representado por la tupla ((480,390),’E’,’N’), lo que quiere decir que el tanque se encuentra en la posición (480,390), su objetivo es un enemigo (ya que ha sido disparado por el jugador) y se dirige hacia el norte.

Un potenciador es representado por una tupla (tipo,(x,y)), donde tipo corresponde al String “escudo” o “municion”, lo cual representa una recarga de escudo o de munición, según corresponda. El segundo elemento de la tupla es una tupla con las coordenadas en el plano en donde se encuentra el potenciador.

¿Qué hay que implementar?

Cada equipo de trabajo deberá implementar al menos las siguientes funciones que permitirán el correcto funcionamiento del juego. Dichas funciones deben ser implementadas en el archivo funciones.py.

Los nombres y valores de retorno de las funciones deben ser iguales a los que se detallan a continuación:

mover_jugador(jugador, direccion, bloques_muralla): retorna el diccionario tanque_jugador con sus valores actualizados de acuerdo al último movimiento dado por el usuario. Note que el tanque no debe pasar por encima de las murallas, pero sí se permite que pase por encima de otros tanques.

Parámetros:

  • jugador es el diccionario que representa el tanque del jugador.
  • direccion es alguna de las letras que representan las direcciones en que puede moverse un objeto del juego (‘N’,’S’,’E’,’O’).
  • bloques_muralla es un conjunto de tuplas (x,y) que repesentan las coordenadas del mapa en que existe un bloque de muralla.

disparar(tanque, proyectiles): retorna el conjunto de proyectiles luego de agregar un nuevo proyectil cuyo origen es la posición actual del tanque. Esta función permitirá que tanto el tanque del jugador como los tanques enemigos abran fuego. Note que, en el caso del jugador, debe reducir la munición del tanque en 1 al disparar. Para el caso del jugador, considere que la función solo será llamada cuando éste posea munición.

Parámetros:

  • tanque es el diccionario que representa uno de los tanques del mapa.

  • proyectiles es un conjunto de tuplas, donde cada tupla representa un proyectil en el mapa.

    Ver más arriba la estructura de cada una de estas tuplas.

mover_proyectiles(proyectiles, bloques_muralla): retorna el conjunto de proyectiles con la posición de cada proyectil actualizada de acuerdo a la dirección en que fue lanzado. Note que los proyectiles no pueden posicionarse sobre un bloque de muralla y que, por tanto, deben desaparecer al colisionar con uno de estos elementos.

Parámetros:

  • proyectiles es un conjunto de tuplas, donde cada tupla representa un proyectil en el mapa.

    Ver más arriba la estructura de cada una de estas tuplas.

  • bloques_muralla es un conjunto de tuplas (x,y) que representan las coordenadas del mapa en que existe un bloque de muralla.

constatar_impacto(jugador,enemigos,proyectiles): revisa si el jugador o alguno de los tanques enemigos es impactado por un proyectil. Retorna tres elementos: jugador, enemigos y proyectiles, con sus valores actualizados luego de haber eliminado los proyectiles que impactaron a algún tanque y los enemigos que ya no tengan escudo.

Parámetros:

  • jugador es el diccionario que representa el tanque del jugador.

  • enemigos es la lista de diccionarios que contiene todos los tanques enemigos.

  • proyectiles es un conjunto de tuplas, donde cada tupla representa un proyectil en el mapa.

    Ver más arriba la estructura de cada una de estas tuplas.

Bonificación

Implementar las siguientes funciones (adicionales a las anteriores), tendrá una bonificación en el puntaje de su tarea.

crear_potenciador(bloques_muralla): retorna una tupla que representa un potenciador en el mapa. Como restricción se debe considerar que un potenciador no se puede crear sobre un bloque de muralla, pero no hay problema en que aparezca en el mismo cuadro que el jugador, un proyectil o un enemigo.

Parámetros: * bloques_muralla es un conjunto de tuplas (x,y) que representan las coordenadas del mapa en que existe un bloque de muralla.

obtiene_potenciador(jugador,potenciador): retorna True si el jugador está sobre el potenciador y False en caso contrario.

Parámetros:

  • jugador es el diccionario que representa el tanque del jugador.
  • potenciador es la tupla que representa un potenciador en el mapa.

activar_potenciador(jugador,potenciador): retorna el diccionario que representa el tanque del jugador, pero con sus valores actualizados luego de aplicar el efecto potenciador.

Parámetros:

  • jugador es el diccionario que representa el tanque del jugador.
  • potenciador es la tupla que representa un potenciador en el mapa.

Ayuda

Usted puede hacerse miembro del grupo facebook Tarea 2: La batalla de los Tanques. Ahí habrá ayudantes y profesores que podrían ayudarlo con dudas o consultas de la tarea.

Entrega

La fecha de entrega es el Domingo 09 de Junio a las 23:00.

La tarea debe ser resuelta en equipos de dos o tres personas.

Sólo uno de los integrantes del equipo debe subir la tarea en la sección Entrega de tareas de la plataforma Moodle, ingresando al campus que corresponda. ¡No la suba a la sección de su paralelo!

Se debe entregar un archivo comprimido (.zip) que debe contener todos los archivos para hacer funcionar la tarea con el nombre tarea-2-RUT.zip, reemplazando RUT con el RUT del integrante que subirá la tarea. Sólo debe ir la parte del RUT hasta antes de la raya. Por ejemplo: tarea-2-18000123.zip.

Al principio del archivo funciones.py se debe poner un comentario indicando los RUT de los integrantes del equipo, como en el siguiente ejemplo:

# Integrantes:
# 18000123-0 Perico Los Palotes
# 18000456-7 Fulanita de Tal
# 18000890-k Federico Santa Maria

No se puede subir ningún archivo adicional.

Evite dejar para última hora la entrega de la tarea. Cerca del plazo final, la plataforma seguramente estará sobrecargada.

No se recibirá tareas fuera de plazo, ni por correo electrónico.

Recuerde que para que todos los miembros del equipo sean evaluados, deben estar matriculados en “Entrega de Tareas - CAMPUS” (donde CAMPUS es el campus al cual usted pertenece).

Los equipos de trabajo pueden ser los mismos de la tarea anterior, pero recuerde que deben ser de 2 ó 3 personas.

Políticas de copia

Usted puede discutir la tarea con compañeros de otros grupos, pero bajo ningún motivo puede compartir o copiar el código de su tarea. Cada equipo debe escribir su propio código.

Las políticas de copia de la asignatura rigen para la tarea.

En caso de tener problemas con el desarrollo de la tarea, consulte a su profesor o asista a las ayudantías.