Materia
Ejercicios


Tarea 2: Mr.Frozzi

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 las cercanías del polo norte, vive Mr.Frozzi y su familia. Un día, producto del calentamiento global, un agujero apareció en la atmósfera y permitió que lluvias de meteoritos cayeran sobre esta tierra. Tu misión es impedir que los meteoritos toquen la tierra lanzando bolas de nieve y desintegrar la amenaza.

../../_images/bienvenida_screen.png

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.

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.

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 funciones.py, que es el archivo donde se deben implementar las funciones. Además se cuenta con las siguientes estructuras de datos que definen cierto parámetros de las funciones a desarrollar. Las variables escritas en mayúscula, son variables globales definidas en el archivo configuraciones.py. Puede manipular estos valores según le parezca (ej: tamaño de la ventana del juego).

radius = {'frozzi':FROZZI_SIZE/2,
        'copos_nieve': SNOW_SIZE/2,
        'bolas_fuego': FIRE_SIZE/2,
        'peces': FISH_SIZE/2}

speed_factor = {'frozzi': 15,
        'copos_nieve': 20,
        'bolas_fuego':4,
        'peces': 7}

frozzi = {'posicion':POSICION_INICIAL,
        'vidas':8,
        'municion':50,
        'peces':0,
        'bolas_fuego':0}

elementos = {'copos_nieve':{'direccion':'N','objetivo':'bolas_fuego'},
        'bolas_fuego':{'direccion':'S','objetivo':'frozzi'},
        'peces':{'direccion':'S','objetivo':'frozzi'}}

proyectiles_elementos = {'copos_nieve': set(),
        'bolas_fuego': set(),
        'peces': set()}
El mapa del juego consiste en una matriz de 720 x 600 pixeles, donde:
  • el pixel (0, 0) está ubicado en la esquina superior izquierda.
  • el pixel (719, 0) está ubicado en la esquina superir derecha.
  • el pixel (0, 599) está ubicado en la esquina inferior izquierda.
  • el pixel (719, 599) está ubicado en la esquina inferior derecha.

Las coordenadas dentro de mapa, están definidas como una tupla (x, y), con la posición específica del punto, y un radio, el cual define los límites que cubre la elemento descrito por las coordenadas.

¿Qué hay que implementar?

Cada equipo de trabajo deberá implementar 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_pinguino(posicion, direccion, radio, frozzi_speed_factor): retorna las coordenadas (x,y) donde se moverá el pingüino. De acuerdo a la posición actual, el pingüino debe moverse, acorde al factor recibido, en la dirección especificada si es una posición factible. Un movimiento es factible si no sobrepasa las coordenadas correspondientes a los límites de la pantalla y si no supera el letrero North Pole.

Parámetros:

  • posicion tupla que representa las coordenadas de Mr.Frozzi.
  • direccion es alguna de las letras que representan las direcciones en que puede moverse Mr.Frozzi (‘N’, ‘S’, ‘E’, ‘O’).
  • radio valor entero utilizado para aproximar la imagen a un círculo.
  • frozzi_speed_factor valor entero que posee la cantidad de pixeles que debe moverse Mr.Frozzi
../../_images/mover_pinguino.png

crear_proyectil(tipo, frozzi, proyectiles_elementos): función que añade un proyectil creado por Mr.Frozzi al diccionario proyectiles_elementos. Cuando esto ocurre, la munición de Mr.Frozzi se reduce. La función retorna None.

Parámetros:

  • tipo string que representa el tipo de proyectil a crear.
  • frozzi diccionario representación de Mr.Frozzi, el que almacena su posición actual, la cantidad de vidas, municiones y peces que posee, y la cantidad de bolas de fuego que ha logrado desintegrar.
  • proyectiles_elementos diccionario que posee conjuntos de proyectiles relacionados a cada elemento señalado por sus llaves, almacenando las coordenadas (x, y) de cada uno.

detectar_colision_borde_proyectil(coordenada, direccion): retorna un valor booleano cuando un proyectil impacta con el borde en la dirección recibida.

Parámetros:

  • coordenada tupla que representa la coordenada de un proyectil en el mapa
  • direccion string (‘N’ o ‘S’) que representa la dirección del proyectil.

mover_proyectiles(elementos, proyectiles_elementos, radios, speed_factor): función que actualiza la posición de todos los proyectiles en el mapa. La nueva dirección debe ser calculada en base al speed_factor y procurar que si un proyectil ha sobrepasado el borde, éste debe ser eliminado. Cuidado con modificar una estructura de datos al mismo tiempo que se recorre.

Parámetros:

  • elementos diccionario que almacena la dirección de movimiento y el objetivo que posee cada uno de los elementos en el mapa.
  • proyectiles_elementos diccionario con los elementos que caen del cielo y las distintas coordenadas en el mapa.
  • radios diccionario con los radios (valor) de los distintos elementos en el escenario (proyectiles y Mr.Frozzi).
  • speed_factor diccionario con los factores de movimiento (valor), cuantos pixeles deben moverse, de cada uno de los distintos elementos del escenario (proyectiles y Mr.Frozzi).
detectar_colisiones(frozzi, radios, elementos, proyectiles_elementos): retorna un diccionario, similar al de proyectiles_elementos, pero con las coordenadas de los proyectiles removidos del escenario. Esta función actualiza el estado del juego fruto de las colisiones entre los elementos:
  • Meteorito - Mr.Frozzi: la vida de Mr.Frozzi se reduce en uno y la cantidad de meteoritos que han impactado a Mr.Frozzi aumenta en 1.
  • Copo de nieve - meteorito: ambos elementos se anulan.
  • Pez - Mr.Frozzi: la cantidad de peces que posee Mr.Frozzi aumenta en 1.

Importante: Una colisión ocurre cuando la distancia entre los centros excede el máximo para traslaparse, no sólo cuando las coordenadas son iguales.

Parámetros:
  • frozzi diccionario representación de Mr.Frozzi, el que almacena su posición actual, la cantidad de vidas, municiones y peces que posee, y la cantidad de bolas de fuego que ha logrado desintegrar.
  • radios diccionario con los radios (valor) de los distintos elementos en el escenario (proyectiles y Mr.Frozzi).
  • elementos diccionario que almacena la dirección de movimiento y el objetivo que posee cada uno de los elementos en el mapa.
  • proyectiles_elementos diccionario con los elementos que caen del cielo y las distintas coordenadas en el mapa.

Entrega

La fecha de entrega es el Viernes 31 de Octubre 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 Tareas de la plataforma Aula, en el ramo de Programación IWI131.

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.

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, asista a las ayudantías o consulte en el grupo de facebook.