Materia
Ejercicios


Tarea 2: La pitón voraz

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

El juego snake es un clásico juego que consiste en mover una culebra (acá la llamaremos pitón) para que pueda comer todo tipo de frutas. A medida que va comiendo, la pitón va creciendo. El juego termina si la pitón sale del campo de juego o choca con algún obstáculo.

En esta tarea usted, junto a su equipo de trabajo, deberá implementar este juego empleando el módulo de python para juegos 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 permitirán generar la pantalla del juego y mostrar la pitón. Usted debe implementar el resto del juego con las características principales:

  • crear los movimientos de la pitón de acuerdo a las teclas que presione el usuario (hacia la derecha, izquierda, arriba, abajo),
  • que las frutas aparezcan de manera aleatoria en el campo del juego (por supuesto nunca encima de la pitón ni arriba de algún obstáculo),
  • que la pitón crezca al comer una fruta,
  • determinar si la pitón choca con un obstáculo o se sale del campo de juego. En ese caso finaliza el juego.

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

El juego principal está en el archivo main.py y éste llamará a funciones.py que es el archivo donde 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 la siguiente imagen animada:

../../_images/2012-2-animacion_tarea2.gif

Cada iteración representa un movimiento de la pitón (recuerde que en el juego la pitón no se detiene nunca). El usuario puede cambiar la dirección de la pitón con las flechas del teclado. Note en la imagen que en cada repetición se recibe una tecla del usuario, la variable dirección queda con el valor N (norte), S (sur), E (este) u O (oeste), dependiendo de la tecla presionada por el usuario.

La función recibir_tecla_usuario() ya está implementada. Lo importante es que usted sepa utilizar la variable direccion correctamente para determinar el siguiente movimiento de la pitón.

Para el movimiento de la pitón, se debe considerar que el mapa es una grilla de 20 x 15 cuadros de 40 x 40 pixeles cada uno. Cada cuadro en el mapa se describe por medio de las coordenadas x e y (medidas en pixeles) desde la esquina superior izquierda (representadas en rojo en el esquema).

../../_images/grilla_piton.png

Del ejemplo de arriba, una porción de la pitón sería la siguiente lista de tuplas (coordenadas):

piton = [ (480, 160), (440, 160), (400, 160), (400, 200), (400, 240), ... ]

Si el siguiente movimiento fuese a la derecha (E), observe los cambios que se realizan en la lista pitón respecto a la figura:

piton = [ (520, 160), (480, 160), (440, 160), (400, 160), (400, 200), ... ]

Note que en algunos casos cambia la coordenada x y en otras la coordenada y. Para saber cómo se mueve la pitón es necesario que considere una lista de movimientos. La función actualizar_lista_movimientos() retorna una lista con los últimos movimientos realizados por la pitón. Esta función ya está implementada. Ustedes deben saber cómo utilizar la variable movimiento. Es importante notar que la última dirección dada por el usuario es agregada a la lista de movimientos antes del llamado a la función piton_mover(). Por ejemplo, considerando la imagen anterior, si el movimiento actual es E, la lista quedaría:

movimiento = [ 'E', 'E', 'E', 'N', 'N', 'E', ... ]

Note que el movimiento más reciente está en la posición 0 de la lista: E.

Por otro lado, el diccionario alimentos (definido en constantes.py), contiene el nombre del alimento (es la llave), el nombre de la imagen y el puntaje. Por ejemplo:

alimentos = {'naranja': ('naranja.png', 40), ... }

Esto indica que la imagen del alimento naranja es naranja.png (ubicada en el directorio img/) y tiene 40 puntos. Por supuesto, usted puede cambiar o agregar alimentos.

La representación de la comida en el mapa también corresponde a un cuadro de 40 x 40 pixeles. En la imagen de más arriba, la variable comida tiene el siguiente valor (suponer que es una naranja):

comida = ('naranja', (640, 160) )

¿Qué hay que implementar?

Cada equipo de trabajo deberá implementar al menos las siguientes funciones que permitirán que la pitón realice todas las acciones características 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:

piton_mover(p, movimientos, obstaculo): retorna la lista pitón con los valores actualizados de acuerdo al último movimiento dado por el usuario. Retorna False si la pitón ha chocado con su cuerpo, si se ha salido del campo de juego o choca con un obstáculo.

Parámetros:

  • p es la lista que representa la pitón.
  • movimientos es la lista que contiene los últimos movimientos realizados por la cabeza de la pitón. E
  • obstaculo es una lista de tuplas que representa el obstáculo (opcional, ver más abajo). Si no hay obstáculo, el parámetro será None.

piton_comer(piton, comida): función que determina si la pitón comió un alimento o no. Retorna True si come un alimento o de lo contrario False.

Parámetros:

  • piton es la lista que representa a la pitón.
  • comida es una tupla del nombre del alimento y las coordenadas donde está ubicada la comida.

piton_crecer(piton, movimientos): retorna la lista que representa a la pitón, pero con un cuadro extra (tener cuidado de no desarticular el cuerpo de la pitón).

Parámetros:

  • piton es la lista que representa a la pitón.
  • movimientos es la lista que contiene los últimos movimientos realizados por la cabeza de la pitón.

aparece_comida(piton, alimento, obstaculo): la función debe hacer aparecer un nuevo alimento de manera aleatoria en cualquier parte del mapa. Tenga cuidado que el alimento no aparezca sobre la pitón ni sobre un obstáculo (en caso de que exista). Note que hay dos elementos aleatorios: el tipo de alimento (del diccionario) y las coordenadas para determinar su posición. Un ejemplo de retorno es (‘frutilla’, (400, 320)).

Parámetros:

  • piton es la lista que representa a la pitón.
  • alimento es el diccionario de alimentos (presenten en constantes.py).
  • obstaculo es la lista de tuplas que representa un obstáculo (opcional, ver más abajo). Si no hay obstáculo, el parámetro será None.

actualizar_puntaje(comida, alimentos, puntaje_actual): esta función debe retornar el puntaje actualizado según el alimento que la pitón comió.

Parámetros:

  • comida es la tupla del nombre del alimento y coordenada. Ej. (‘platano’, (200, 400))
  • alimentos es el diccionario alimentos.

Bonificación

Implementar esta función (adicional a las anteriores), tendrá una bonificación en el puntaje.

crear_obstaculo(): Al comienzo del programa, la función debe crear un obstáculo en el campo de juego. La coordenada de cada cuadro debe estar en una tupla. La lista de tuplas representará el obstáculo completo. Si la pitón choca con el bloque, el juego termina. Note que esta función sólo crea el obstáculo en el mapa. Usted debe modificar las funciones anteriores para asegurarse de que el juego termine al chocar la pitón con un obstáculo.

La función no recibe parámetros.

Debe retornar una lista de tuplas. Cada tupla es la coordenada de un cuadro del obstáculo en el mapa.

Ayuda

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

Entrega

La fecha de entrega es el domingo 21 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 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.