Materia
Ejercicios


Tarea 2: Python Galaxian

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 Python galaxian consiste en tomar el control de una nave espacial con el fin de eliminar todas las naves enemigas antes de que éstas lleguen a la posición del jugador o se terminen las municiones. El juego termina cuando eliminas a todas las naves enemigas, o te quedas sin municiones o las naves enemigas llegan a la posición del jugador. La misión es destruir a todos los enemigos para evitar la invasión del planeta.

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 que usted implemente el resto. Las características a implementar por usted son las siguientes:

  • Hacer que la nave del jugador se mueva de acuerdo a las teclas que presione el usuario (izquierda, derecha) y no sobrepase los límites de la pantalla.
  • Al ser presionada la barra espaciadora la nave 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 puedan recibir los enemigos.
  • Hacer que los enemigos se muevan de acuerdo a las direcciones que serán indicadas más adelante.

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)y de las estructuras de datos que ha visto en clases, además 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/Diagrama1.gif

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

Para el movimiento de los objetos móviles del juego, es decir, las naves 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_nave.gif

De la imagen de arriba, se puede ver que la nave del jugador (nave roja con celeste) está ubicado en la posición (540,300).

Cada nave (jugador y enemigos) es representada como un diccionario cuyas llaves son “posición”, “orientación” y “escudo”. En el caso de la nave 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 de la nave en un determinado momento.
  • “Escudo”: Número entero que representa la cantidad de escudos que posee una nave (por defecto es 1).
  • “Municion (solo nave del jugador)”: Número entero que representa la cantidad de munición que posee la nave del jugador (por defecto es 99).
  • “Tipo”: String “J” o “E” que representa el tipo de nave. “J” para la nave del Jugador y “E” para la nave enemiga.

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

jugador = {"posicion":(540,300),
        "orientacion":'N',
        "escudo": 1,
        "municion": 150,
        "tipo":"J"
        }

Mientras que una nave del enemigo podría ser

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

Existen 4 tipos de enemigos:

../../_images/Nave1.png

Nave

enemigo = {"posicion":(90,90),
        "orientacion":'S',
        "escudo": 1,
        "tipo": "E"
         }
../../_images/Nave2.png

Nave_nivel1

enemigo = {"posicion":(90,90),
        "orientacion":'S',
        "escudo": 2,
        "tipo": "F"
         }
../../_images/Nave3.png

Nave_nivel2

enemigo = {"posicion":(90,90),
        "orientacion":'S',
        "escudo": 3,
        "tipo": "G"
         }
../../_images/NaveM.png

Nave_madre

enemigo = {"posicion":(90,90),
        "orientacion":'S',
        "escudo": 4,
        "tipo": "M"
         }

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’, que señala la dirección en que fue lanzado el proyectil.

¿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): retorna el diccionario nave_jugador con sus valores actualizados de acuerdo al último movimiento dado por el usuario. Note que la nave no debe sobrepasar las coordenadas correspondientes a los límites de la pantalla.

Parámetros:

  • jugador es el diccionario que representa la nave del jugador.
  • direccion es alguna de las letras que representan las direcciones en que puede moverse un objeto del juego (‘E’,’O’).

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

Parámetros:

  • nave es el diccionario que representa una de las naves 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): 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 sobrepasar los límites de la pantalla 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.

constatar_impacto(jugador,enemigos,proyectiles,superficie,imagen_explosion): revisa si el jugador o alguna de las naves enemigos es impactada por un proyectil. Retorna tres elementos: jugador, enemigos y proyectiles, con sus valores actualizados luego de haber eliminado los proyectiles que impactaron a alguna nave y los enemigos que ya no tengan escudo.

Parámetros:

  • jugador es el diccionario que representa la nave del jugador.

  • enemigos es la lista de diccionarios que contiene todas los naves enemigas.

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

  • superficie es la variable que permitirá realizar el estampado de la imagen explosión.

  • imagen_explosion es la variable que posee los datos de la imagen para ser llamada antes que una nave desaparezca.

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

mover_enemigo(enemigo, contadorjugadas): retorna el enemigo con sus valores actualizados de acuerdo al último movimiento correspondiente. Note que la forma en que las naves deben moverse está graficado en el video de la tarea.

Parámetros:

  • enemigo es el diccionario que representa a la nave enemiga.
  • contadorjugadas es una variable del tipo int, que aumenta en 1 cada vez que se actualiza la ventana.

Bonificación

Además de las funciones anteriormente definidas, existirá la posibilidad de aumentar su puntaje a través de la implementación de las funciones que se especifican a continuación:

Actualizar_mapa(nivel): recibe la variable nivel, que aumenta en 1 cada vez que un jugador gana la partida, esta función deberá actualizar el mapa del juego utilizando alguno de los presentes en la carpeta mapas, o creadno alguno propio, debe retornar la variable mapa.

Aumentar_municion(jugador): esta función recibe como parámetro el diccionario jugador. Debe encargarse de aumentar la munición cada vez que el jugador elimine una nave madre. Esta función debe retornar el diccionario jugador actualizado.

Ayuda

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

Entrega

La fecha de entrega es el Viernes 06 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.

Las tareas atrasadas (máximo un día de retraso) tendrán el descuento especificado en la rúbrica de corrección. NO se recibirán tareas por 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.