Materia
Ejercicios


Tarea 2: PyTetris USM

Objetivos de aprendizaje

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

  • 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 oportunidad, usted y su equipo, han sido contratados para completar el juego PyTetris USM.

Para el desarrollo de la tarea, se necesita instalar el módulo pygame. Descargue el módulo.

Su objetivo será terminar las funciones principales, detalladas más abajo, para que el juego pueda ejecutarse de manera correcta.

Los archivos base de la tarea deben ser descargados desde este enlace.

Representación

El juego está estructurado en tres archivos principales, funciones.py, main.py y constantes.py; el primero, correspode al archivo que deberan construir para que el juego pueda funcionar. El segundo archivo corresponde al código de desarrollo del juego, y el tercero corresponde a las variables constantes que se usarán. Dentro de éstas variables se destaca el diccionario PIEZAS, el cual contiene todas las formas de los bloques.

Para este caso, las piezas utilizadas serán las clásicas del juego, las cuales tan representadas en las listas de listas FORMA_S_TEMPLATE, FORMA_Z_TEMPLATE, FORMA_J_TEMPLATE, FORMA_L_TEMPLATE, FORMA_I_TEMPLATE, FORMA_O_TEMPLATE y FORMA_T_TEMPLATE.

El desarrollo del juego será a travéz de una matriz de listas de 10 filas y 20 columnas, las cuales correponderán al tablero. Cada casilla será llenada con el string ‘.’ , ver siguiente imágen.

../../_images/matrixtablero.png

¿Qué hay que implementar?

Para el desarrollo de esta tarea, deberán completar las funciones definidas en el archivo funciones.py las cuales son esenciales para el desarrollo del juego. Estas son:

  • estaEnTablero(x, y): La cual recibe como parámetro los enteros x e y. La función retorna True si los valores se encuentran dentro de las medidas del tablero, especificadas en el archivo CONSTANTES.PY.

  • estadoLineaCompleta(tablero, y): La cual recibe como parámetro la lista de listas tablero y el entero y que especifica el número de la columna actual. Esta funcion está encargada de verificar si se ha completado la columna. Una columna está completa cuando en ninguno de sus casilleros se encuentra el caracter ‘.’. La función retorna False si encuentra al menos un espacio vacio (‘.’) en el tablero y True en caso contrario.

  • removerLineaCompleta(tablero): Esta funcion recibe como parámetro la matriz tablero. La función debe verificar si existe o no una línea (columna) completa, en caso de existir debe quitarla del tablero (desplazar las columnas del tablero hacia la columna completa, el número de columnas del tablero no se modifica). La función debe retornar un entero indicando la cantidad de líneas que fueron removidas, si es que se pudo remover, cero en caso contrario.

  • obtenerTableroEnBlanco(): Esta función no recibe parámetro. Debe retornar la lista de listas tablero lista para ser usado en el juego, es decir llena de espacios en blanco.

  • obtenerNuevaPieza(): Esta función no recibe parámetro y su objetivo es retornar la nueva pieza que aparecerá en el tablero. La pieza se representa con un diccionario con la siguiente estructura:

    DICCIONARIO = {
            "forma": "Debe tener una de las 7 piezas del diccionario *PIEZAS* seleccionada de forma aleatoria",
            "rotacion": "Número entero que corresponde a cualquiera de las rotaciones posibles para la pieza, verlas en el archivo *constantes.py*.",
            "x": "número entero que corresponde a la semi-diferencia entre el ancho del tablero y el ancho de los template de las piezas. Considerar la parte entera del resultado",
            "y": "corresponde al valor de la columna donde está el bloque, cuando se crea corresponde a la columna cero",
            "color": "Corresponde a un entero aleatorio para obtener un color de la tupla *COLORES* ubicada en el archivo *constantes.py*."
    }
    
  • esPosicionValida(tablero, pieza, adjX=0, adjY=0): Esta función recibe como parámetro, las variables tablero que corresponde a la lista de listas que contienen las posiciones actuales del tablero, el diccionario pieza que corresponde a la pieza que se utilizará para jugar, y las variables adjx y adjy que corresponden a las posiciones de la fila y columna en el plano x,y, hacia donde se quiere mover la pieza. Estas corresponden a valores enteros. La función debe retornar True si la pieza se mantiene dentro del tablero, False en caso contrario.

  • agregarTablero(tablero, pieza): Esta función recibe como parámetro el tablero que corresponde a la lista de listas que contienen las posiciones actuales del tablero y el diccionario pieza que corresponde a la pieza que se quiere agregar al tablero. Para agregar una pieza al tablero se debe utilizar el diccionario pieza, usando la llave correspondiente, e ingresando la rotación respectiva con las coordenadas del tablero, para ello se debe recorrer el tablero y posicionar la pieza dentro de este. Esta función no debe retornar nada.

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 en formato .zip, el cual 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 del guión del dígito verificador.

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.

La fecha de entrega de la tarea 2 es el Miércoles 11 de Mayo hasta las 23:00 hrs vía 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.