Materia
Ejercicios


Tarea 2: Mapyrio

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

Para esta tarea, usted y su equipo, deben completar el juego Mapyrio, que consiste en las aventuras de una pitón en un mundo de bloques. Los elementos principales de la tarea están implementados, pero ustedes deben programar las funcionalidades aquí descritas para que el juego funcione completamente. Para el desarrollo de la tarea necesita instalar el módulo pygame. Descargue el módulo.

Mapyrio trata de una pitón que debe ir avanzando por un mapa mientra recoge monedas y evita enemigos. Los archivos base de la tarea deben ser descargados desde este enlace. Luego, su tarea es completar las funciones que estan definidas en el archivo funciones.py, éstas permiten a Mapyrio moverse por el mapa, saltar, recolectar monedas, morir si toca a un enemigo y terminar el juego al llegar a la barra final.

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

El juego se ve en una ventana de 512x480 pixeles. Esta ventana no será necesesariamente el largo del escenario, ya que éste se irá desplazando/mostrando a medida que Mapyrio se mueve.

../../_images/2015-2_Referencias.png

Además, para el desarrollo de la tarea se disponen de varias estructuras de datos, las cuales son recibidas por las distintas funciones como parámetro.

El diccionario jugador almacena las información del jugador:

jugador = {
        'posicion': (0, 0),
        'vidas': 5,
        'cayendo': False,
        'direc': 'R',
        'salto': 0,
        'mov': 0,
        'monedas': 0,
        'fin': 0,
        'accelv': 0
}
Los elementos de diccionario son:
  • posicion es una tupla que indica la posición de Mapyrio en la pantalla,
  • monedas y vidas son contadores que deben cambiar cuando Mapyrio recoge monedas o muere,
  • cayendo es un booleano que indica si Mapyrio está cayendo o no,
  • direc indica hacia donde está mirando Mapyrio (derecha, Right, o izquierda, Left),
  • salto toma valores 1 o 0 dependiendo de si Mapyrio está saltando o no,
  • mov indica si Mapyrio se está moviendo o no (1 se mueve, 0 no se mueve),
  • fin vale 1 si a Mapyrio no le quedan vidas, 0 en caso contrario,
  • accelv es la aceleración vertical de Mapyrio, positiva o negativa dependiendo de si salta o si está cayendo, ésta regula su velocidad vertical. DATO: cuando Mapyrio cae constantemente se debe disminuir su aceleración en 1, cuando salta se le debe sumar 12.

Gráficamente el juego está compuesto por bloques, cuadrados de 32x32 pixeles, donde el punto que da la ubicación de cada uno corresponde a las coordenadas de la esquina superior izquierda.

../../_images/2015-2_Bloqueref.png ../../_images/2015-2_mapyref.png

El diccionario bloques almacena conjuntos con las posiciones (x, y) de los bloques del mapa según su tipo:

bloques = {
        'tipo1': set([(x1, y1), (x2, y2), ..., (xn, yn)]),
        'tipo2': set([(x12, y12), (x22, y22), ..., (x2n, y2n)]),
        # ...
}

Los tipos de bloques son:

../../_images/2015-2_Bloques.jpg
Además se tienen las siguientes variables como parámetros a las funciones:
  • unidad: representa la velocidad de Mapyrio cuando avanza.
  • velocidad_vertical: es la velocidad instantanea de Mapyrio
  • movmap: es un booleano que indica si el mapa se está moviendo.
  • despvar: variable que indica cuantos pixeles fue desplazado el mapa.
  • bloques0: copia de bloques donde realizar las actualizaciones a los bloques en el juego.

¿Qué hay que implementar?

Para el desarrollo de esta tarea, junto a su equipo deberán implementar las funciones que se encuentran declaradas en el archivo funciones.py. La descripción de las funciones, junto sus valores de retorno son las que se encuentra a continuación. Es importante señalar que los nombres y valores de retorno de las funciones deben ser iguales a los que se detallan en el archivo funciones.py

detectar_contacto(posicion, bloques): Función que, dada una posicion (x, y), retorna un diccionario con el tipo de bloque en sus contornos directos. El diccionario de contacto debe tener la siguiente estructura:

{'I': tipo, 'S': tipo, 'LD': tipo, 'LI': tipo}

donde I, S, LD, LI significan Inferior, Superior, Lateral Derecho y Lateral Izquierdo respectivamente. Y tipo es el tipo de bloque con el cual está en contacto en dicho lado. Si no contacta con ningún bloque del diccionario bloques, se coloca una A (Aire).

mover_jugador(jugador, unidad, velocidad_vertical, movmap, bloques): Función que actualiza la posición del jugador en base a si se puede mover sin chocar y sin pasar la mitad del mapa. Mapyrio no se mueve si pasa la mitad del mapa, son los bloques lo que lo hacen.

detectar_caida(jugador, bloques): Función que detecta si Mapyrio está cayendo, modificando el valor de cayendo del jugador.

consultamuerte(jugador, bloques): Función que retorna True si Mapyrio toca un bloque enemigo, actualizando la cantidad de vidas, la llave fin (si corresponde) y reubica a Mapyrio a la ubicación inicial.

recogermonedas(jugador, bloques, bloques0, despvar): Función que retorna True si Mapyrio captura una moneda, actualizando su número en jugador y eliminando la moneda del mapa (bloques0).

saltar(jugador): Función que determina si Mapyrio puede saltar o no. Si puede, aumenta la aceleración. Debe resguardar que sólo pueda realizar un salto a la vez.

Entrega

La tarea debe ser resuelta en equipos de dos o tres personas. De lo contrario habrá penalización en la nota.

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.

Revise la fecha de entrega en Aula. 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.