Materia
Ejercicios


Tarea 2: Locura de Insectos

Objetivos de aprendizaje

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

  • Implementar un programa que requiera entradas y salidas de datos.
  • Diseñar e implementar programas usando 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 un juego que llamaremos locuras de insectos empleando el módulo de python para videojuegos llamado pygame. Descargue el módulo.

El juego Locura de insectos consiste en atrapar sólo los insectos del tipo que se indica como objetivo, evitando a toda costa tocar el resto, sobre todo al tipo de insecto marcado como peligroso. El tipo objetivo y el tipo peligroso van cambiando cada cierto tiempo durante el juego, por lo que el jugador debe estar muy atento!

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

  • Que al momento de hacer click en algún lugar de la pantalla se compruebe qué insectos están siendo capturados para tomar las acciones que corresponda.
  • Que cuando el cursor alcance un montículo donde habitan colonias de insectos, estos aparezcan a su alrededor.
  • Una función que obtenga el número de insectos de cada tipo que fueron capturados, además de la forma en la que se hizo.
  • Lleva a código la fórmula para calcular el puntaje final del jugador.
  • Una función que retorne estadísticas interesantes de una partida.

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/Flujo.png

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

Para la ubicación de los objetos del juego, vale decir, los insectos y montículos, se debe considerar que el mapa es un rectángulo de 800 x 500 pixeles inscrito en un plano cartesiano, cuyo origen (0,0) se encuentra en la esquina superior izquierda de la ventana. Llamaremos eje x al eje horizontal y eje y al eje vertical. Las coordenadas x e y son números reales.

../../_images/Plano.png

Cada insecto es representado como una tupla cuyas componentes son, en este orden, tipo y posición.

El tipo es un String y la posición es una tupla de las coordenadas (x,y) del insecto en el plano. En el esquema de arriba, la abeja estaría representada por la tupla:

Insecto = (‘E’,(254.3, 180.2))

Para manejar de forma eficiente a muchos insectos, se utiliza una lista para contenerlos. Siguiendo con el esquema, la lista que contiene a los insectos sería:

Insectos = [('E', (254.3, 180.2)), ('H', (123.7, 313.0)), ('H', (391.4, 230.5))]

Por defecto, y como mínimo, los tipos de insectos disponibles son: A,B,C,D,E,F,G,H. Usted puede agregar más tipos si lo desea.

Un montículo se representa como una tupla (x, y) de sus coordenadas en el plano. Por ejemplo, uno de los montículos presentes en el esquema está representado por la tupla:

monticulo = (600.2, 355.0)

De manera similar a los insectos, se utiliza una estructura de datos para manejar un gran número de montículos. Debido a que no tiene sentido que dos montículos estén ubicados en la misma posición, se escogió la estructura conjunto (set en inglés) para contenerlos.

monticulos = {(600.2, 355.0), (553.1, 107.6), ...}

El cursor circular está comandado en todo momento por el movimiento del mouse del usuario. Puede pensarse al cursor como una red que utiliza el usuario para capturar insectos. Se representa como una tupla que consta del valor de su radio (número entero) y la posición de su centro. En el ejemplo, el cursor sería:

cursor = ((438.5, 342.0), 30)

¿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, cualquier diferencia en los nombres y/o valores de retorno pueden ocasionar problemas en alguna otra sección del programa:

atrapar_insectos(cursor, insectos, atrapados, objetivo, peligro): retorna dos valores, la lista insectos luego de haber quitado de ella los insectos atrapados por el cursor, y la lista atrapados que contiene tuplas que indican los insectos que han sido capturados durante el juego.

Parámetros:

  • cursor es la tupla que representa la red de insectos que utiliza el jugador.
  • insectos es la lista que contiene todos los insectos del juego.
  • atrapados es una lista que contiene tuplas de la forma (tipo, captura), donde tipo es alguno de los tipos de insectos y captura es un string ‘O’, ‘P’ o ‘N’ que indica si un insecto fue capturado en calidad de Objetivo, Peligro o Normal, respectivamente.
  • objetivo es el string que indica el tipo del insecto que se busca capturar.
  • peligro es el string que indica el tipo del insecto más peligroso.

brote_de_insectos(cursor, insectos, monticulos, tipos_insectos, cantidad, alcance): retorna el conjunto de montículos luego de haber activado el efecto y posteriormente quitado del mapa los montículos alcanzados por el cursor. El efecto de un montículo consiste en añadir, de manera aleatoria, tantos insectos como indique la variable cantidad en el área cuadrada cuyo centro son las coordenadas (x, y) y cuyo semi-lado está dado por la variable alcance. Si bien el área cuadrada puede abarcar posiciones que se encuentran fuera de la ventana del juego, usted debe limitar la aparición de insectos a la ventana (es decir, no se debe crear insectos que no se puedan ver).

Parámetros:

  • cursor es la tupla que representa la red de insectos que utiliza el jugador.
  • insectos es la lista que contiene todos los insectos del juego.
  • monticulos es un conjunto de tuplas que contiene las posiciones de cada montículo del mapa.
  • tipos_insectos es una lista de strings de todos los tipos de insectos del juego.
  • cantidad es un número entero que indica cuántos insectos viven en cada montículo.
  • alcance es un número entero que representa el tamaño de un semi-lado del cuadrado centrado en las coordenadas (x, y) de un montículo.
../../_images/Monticulos.png

En la imagen de la izquierda, se observa que el cuadro rojo limita el área donde deben aparecer los insectos. La magnitud de la línea negra corresponde a un semi-lado del cuadrado. En la imagen de la derecha se muestra un ejemplo de lo que ocurre al momento de que el cursor alcanza un montículo. En este caso, la cantidad de insectos que viven en los montículos es 10 y el alcance es de 100 pixeles. Note que esta imagen es solo ilustrativa, en el desarrollo del juego el montículo debe desaparecer del mapa al momento de ser activado.

obtener_resultados(atrapados, tipos_insectos): retorna un diccionario que asocia cada tipo de insecto con una tupla de tres elementos que en orden, corresponden al número de veces en que un insecto de tal tipo fue capturado en calidad de Objetivo, Peligro y Normal, respectivamente.

Parámetros:

  • atrapados es una lista que contiene tuplas de la forma (tipo, captura), donde tipo es alguno de los tipos de insectos y captura es un string ‘O’, ‘P’ o ‘N’ que indica si un insecto fue capturado en calidad de Objetivo, Peligro o Normal, respectivamente.
  • tipos_insectos es una lista que contiene todos los tipos de insectos disponibles.

calcular_puntaje(resultados, nivel): retorna un número entero que representa el puntaje obtenido. La fórmula para calcularlo es la siguiente:

../../_images/Formula.png

Parámetros:

  • resultados es el diccionario que retorna la función obtener_resultados.
  • nivel es un número entero que indica el nivel de dificultad con que juega el usuario.

obtener_estadisticas(resultados): retorna un diccionario que asocia los nombres de distintas estadísticas del juego con su valor correspondiente.

Parámetros:

  • resultados es el diccionario que retorna la función obtener_resultados.
Las estadísticas a considerar son:
  • Tipo de insecto más capturado en calidad de objetivo.

  • Tipo de insecto menos capturado en calidad de objetivo.

  • Índice de acierto a la hora de capturar, es decir, el porcentaje de insectos atrapados en calidad de objetivo del total de insectos capturados.

  • Categoría del jugador en base al índice de acierto. Las categorías son:
    • Principiante: índice de acierto menor que 40%
    • Amateur: índice de acierto mayor o igual a 40% y menor que 60%
    • Regular: índice de acierto mayor o igual a 60% y menor que 80%
    • Avanzado: índice de acierto mayor o igual a 80% y menor que 90%
    • Experto: índice de acierto mayor o igual a 90%

Un ejemplo del diccionario a retornar sería:

Estadísticas = {
“mayor”:’A’, “menor”:’E’, “acierto”:45.6 “categoria”:”Amateur” }

Ayuda

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

Entrega

La fecha de entrega es el Jueves 28 de Noviembre 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.