Saltar a contenido

Trabajo Práctico Final: Pac-Man#

Nota

Es posible proponer otro proyecto como trabajo final. En ese caso, se debe escribir una consigna de estilo similar a esta y presentarla a los docentes de la práctica. Ellos determinarán si la propuesta es o no viable. Procuren decidir esto a la brevedad, para maximizar el tiempo disponible para el desarrollo del trabajo.

Introducción#

Era 1979 cuando Toru Iwatani, un joven diseñador de Namco, se propuso crear un videojuego que pudiera atraer a un público más amplio que los shooters espaciales que dominaban los arcades de la época. Según cuenta la leyenda, la inspiración llegó al mirar una pizza a la que le faltaba una porción. Así nació Pac-Man: un personaje simple, sin armas, cuyo único objetivo era comer.

El juego fue lanzado en Japón en mayo de 1980 bajo el nombre Puck Man (por el sonido que hace al comer) y rápidamente se convirtió en un fenómeno cultural. Su llegada a los Estados Unidos ese mismo año lo catapultó a la fama mundial: fue el primer videojuego en tener su propio merchandising masivo, incluyendo ropa, juguetes y hasta una serie animada. A principios de los ‘80, había más de 100.000 máquinas arcade de Pac-Man instaladas solo en Estados Unidos.

Lo que pocos notaban mientras jugaban era la sofisticación escondida detrás de su aparente simplicidad. Cada uno de los cuatro fantasmas (Blinky, Pinky, Inky y Clyde) tiene un algoritmo de persecución distinto, con objetivos y personalidades propias. Su interacción genera patrones de comportamiento emergentes que los jugadores expertos aprendieron a explotar para sobrevivir indefinidamente. En 1999, Billy Mitchell logró la primera partida perfecta de la historia: 3.333.360 puntos, el máximo posible, comiendo cada punto, fruta y fantasma en los 256 niveles del juego.

Más de cuatro décadas después, Pac-Man sigue siendo uno de los videojuegos más reconocidos de la historia y un objeto de estudio clásico en inteligencia artificial y diseño de juegos. En este trabajo, vas a implementar tu propia versión, con algunos giros propios.

Animación de Pac-Man
Animación de Pac-Man

Desarrollo#

Se debe implementar una versión jugable de Pac-Man en Python utilizando la librería PyGame. El objetivo es reproducir la jugabilidad del juego original de Namco (1980), incluyendo los algoritmos de movimiento de los fantasmas, las velocidades y los tiempos, incorporando además las extensiones que se describen a continuación.

Mapa#

El mapa del juego se carga desde un archivo de texto (.txt) al iniciar el juego. Se incluye como archivo base el laberinto del juego original, pero los grupos son libres de modificarlo o diseñar mapas propios, siempre que respeten el formato descripto a continuación y que el mapa base provisto funcione correctamente.

Mapa de Pac-Man
Mapa original de Pac-Man (fuente: The Pac-Man Dossier)

Formato del archivo de mapa#

Cada carácter representa un tile del laberinto según la siguiente convención:

Carácter Tile
X Pared
. Punto (dot)
o Punto de poder (power pellet)
Pasillo vacío
G Interior de la ghost house
- Puerta de la ghost house
P Posición inicial de Pac-Man
T Túnel lateral

El juego debe verificar que el archivo es válido al cargarlo y lanzar una excepción descriptiva si el formato no es correcto: caracteres desconocidos, filas de distinto largo, ausencia de la posición de Pac-Man o de la ghost house, entre otros casos posibles. El mapa debe ser de \(28 \times 31\) tiles, pero se pueden agregar paredes adicionales alrededor para facilitar la implementación.

El mapa base provisto con el juego es el siguiente:

XXXXXXXXXXXXXXXXXXXXXXXXXXXX
X............XX............X
X.XXXX.XXXXX.XX.XXXXX.XXXX.X
XoXXXX.XXXXX.XX.XXXXX.XXXXoX
X.XXXX.XXXXX.XX.XXXXX.XXXX.X
X..........................X
X.XXXX.XX.XXXXXXXX.XX.XXXX.X
X.XXXX.XX.XXXXXXXX.XX.XXXX.X
X......XX....XX....XX......X
XXXXXX.XXXXX XX XXXXX.XXXXXX
XXXXXX.XXXXX XX XXXXX.XXXXXX
XXXXXX.XX          XX.XXXXXX
XXXXXX.XX XXX--XXX XX.XXXXXX
XXXXXX.XX XGGGGGGX XX.XXXXXX
T     .   XGGGGGGX   .     T
XXXXXX.XX XGGGGGGX XX.XXXXXX
XXXXXX.XX XXXXXXXX XX.XXXXXX
XXXXXX.XX          XX.XXXXXX
XXXXXX.XX XXXXXXXX XX.XXXXXX
XXXXXX.XX XXXXXXXX XX.XXXXXX
X............XX............X
X.XXXX.XXXXX.XX.XXXXX.XXXX.X
X.XXXX.XXXXX.XX.XXXXX.XXXX.X
Xo..XX.......P .......XX..oX
XXX.XX.XX.XXXXXXXX.XX.XX.XXX
XXX.XX.XX.XXXXXXXX.XX.XX.XXX
X......XX....XX....XX......X
X.XXXXXXXXXX.XX.XXXXXXXXXX.X
X.XXXXXXXXXX.XX.XXXXXXXXXX.X
X..........................X
XXXXXXXXXXXXXXXXXXXXXXXXXXXX

Jugabilidad#

Durante el juego:

  • Pac-Man se mueve continuamente en la dirección indicada por el jugador (flechas del teclado). El jugador puede “pre-ingresar” la próxima dirección: si hay una pared en esa dirección, Pac-Man sigue en la actual y gira en cuanto sea posible.
  • El jugador comienza con 3 vidas. Pierde una vida cada vez que un fantasma activo lo toca. Luego de perder una vida, Pac-Man y los fantasmas regresan a sus posiciones iniciales.
  • Al perder todas las vidas, el juego termina (Game Over).
  • Si Pac-Man consume todos los puntos del nivel, el juego se reinicia avanzando al siguiente nivel, el cual es idéntico al anterior. El puntaje y las vidas se mantienen.
  • El juego debe mostrar en pantalla el puntaje actual, el puntaje máximo histórico (high score, persistido en un archivo) y las vidas restantes.

Puntuación#

El sistema de puntuación debe respetar el del juego original:

Evento Puntos
Punto (dot) 10
Punto de poder (power pellet) 50
1er fantasma eliminado 200
2do fantasma eliminado 400
3er fantasma eliminado 800
4to fantasma eliminado 1600

Los multiplicadores de fantasmas se reinician al terminar el efecto de cada power pellet. Se otorga una vida extra al alcanzar los 10.000 puntos (solo una vez por partida).

Velocidades y tiempos#

A continuación se detallan los valores de las velocidades para el juego (expresados como fracción de la velocidad máxima del sistema, donde 100% equivale a 7,5 tiles/segundo):

Entidad Velocidad
Pac-Man (normal) 80%
Pac-Man (con power pellet) 90%
Fantasma (normal) 75%
Fantasma (en túnel) 40%
Fantasma (asustado) 50%
Fantasma (ojos, volviendo) 150%

El modo asustado dura 6 segundos en el nivel 1. Los últimos 2 segundos, los fantasmas parpadean para indicar que el efecto está por terminar.

Fantasmas#

Selección de fantasmas#

Antes de comenzar cada partida, el jugador debe seleccionar 4 de los 6 fantasmas disponibles y asignar cada uno a una de las cuatro esquinas del mapa, que actuará como su tile de esquina en modo Scatter. Esta elección afecta directamente la estrategia de cada fantasma durante la partida.

Modos globales: Scatter y Chase#

Los fantasmas alternan cíclicamente entre el modo Scatter y el modo Chase. En el nivel 1, el ciclo es el siguiente:

Fase Modo Duración
1 Scatter 7 s
2 Chase 20 s
3 Scatter 7 s
4 Chase 20 s
5 Scatter 5 s
6 Chase 20 s
7 Scatter 5 s
8 Chase indefinido

Al cambiar de modo, los fantasmas invierten su dirección inmediatamente. La activación de un power pellet interrumpe el ciclo e inicia el modo asustado; al finalizar, el ciclo se retoma desde donde fue interrumpido.

Movimiento#

Los fantasmas no pueden detenerse ni invertir su dirección voluntariamente (salvo al cambiar de modo). En cada intersección, eligen el tile adyacente que minimiza la distancia euclidiana al tile objetivo, descartando la dirección de la que vienen.

Tile objetivo en modo Scatter#

En modo Scatter, cada fantasma tiene un tile objetivo fijo, ubicado en una de las cuatro esquinas del mapa. El jugador asigna cada fantasma a una esquina durante la pantalla de selección previa a la partida.

Tiles de esquina para Scatter
Los tiles de esquina asignados a cada fantasma durante Scatter (fuente: The Pac-Man Dossier)

Catálogo de fantasmas (Modo Chase)#

El juego debe implementar 6 fantasmas, de los cuales el jugador elige 4:

Blinky (rojo): El perseguidor. Su tile objetivo en Chase es la posición actual de Pac-Man.

Pinky (rosado): El emboscador. Su tile objetivo en Chase es el tile ubicado 4 posiciones adelante de la dirección actual de Pac-Man. Intenta cortarle el paso por delante.

Inky (celeste): El flanqueador. Su tile objetivo se calcula en dos pasos: primero se toma el tile ubicado 2 posiciones adelante de Pac-Man; luego se traza un vector desde la posición de Blinky hasta ese tile y se duplica. Si Blinky no está en la partida, se utiliza al azar alguno de los otros fantasmas.

Cálculo del tile objetivo de Inky
Cálculo del tile objetivo de Inky: el vector desde Blinky al punto intermedio se duplica para obtener el destino final (fuente: The Pac-Man Dossier)

Clyde (naranja): El tímido. Si su distancia a Pac-Man es mayor a 8 tiles, su target es la posición de Pac-Man. Si está a 8 tiles o menos, su target pasa a ser su esquina de Scatter. Evita acercarse demasiado.

También se deben implementar dos fantasmas adicionales con comportamientos propios. Cada fantasma debe tener su color y personalidad distintiva, claramente reflejados en su algoritmo de movimiento.

Salida de la ghost house#

Los cuatro fantasmas seleccionados salen en orden según su posición en la lista de selección. El primero sale inmediatamente; los siguientes salen al comer 30, 60 y 90 puntos respectivamente.

Modo asustado#

Al consumir un power pellet, todos los fantasmas activos invierten su dirección, cambian de color y eligen direcciones al azar en las intersecciones. Al ser eliminados, solo sus ojos regresan a la ghost house; una vez allí, el fantasma renace y retoma el ciclo normal.

Interfaz#

La interfaz debe estar implementada con PyGame y mostrar claramente:

  • El laberinto con dots, power pellets cargado desde el archivo de texto.
  • Pac-Man y los cuatro fantasmas activos con sus animaciones (boca, movimiento, modo asustado, modo ojos).
  • El puntaje actual, el high score y las vidas restantes (como íconos de Pac-Man).
  • Una pantalla de selección antes de cada partida donde el jugador elige 4 de los 6 fantasmas disponibles y los asigna a las cuatro esquinas del mapa.
  • Una pantalla de inicio, una de Game Over y una animación de nivel completado.
  • Sonidos y música: al menos los efectos de comer puntos, perder una vida, y el jingle de inicio.
Ejemplo simple de como podría verse el juego codeado por la cátedra

Personalización

Son libres de personalizar la estética del juego: cambiar colores, nombres de los personajes, temática del laberinto, etc. Lo importante es que la jugabilidad, los algoritmos de movimiento de los fantasmas y los tiempos sean fieles a la descripción de esta consigna y cumplan con los requisitos mínimos.

Recursos útiles#

Sobre Pac-Man#

Sobre PyGame#

Entrega#

El trabajo se realizará en grupos de no más de cuatro estudiantes. El desarrollo del trabajo se realizará en un repositorio privado de Github que debe ser compartido a los docentes de la materia (pueden encontrar los usuarios de los docentes aquí).

Además, cada grupo debe realizar un video de no más de 5 minutos mostrando el funcionamiento del programa. En el video deben mostrarse todas las funciones del programa y cómo se juega una partida completa, incluyendo la pantalla de selección de fantasmas. Debe quedar claro qué se está mostrando; de ser necesario, pueden agregar narración en off. El video debe ser subido a YouTube como “no listado”. La calidad del video tendrá un impacto leve en la nota final.

La entrega del trabajo se realizará subiendo el link del repositorio y del video de YouTube a la tarea correspondiente en el campus del curso. La fecha de entrega se encuentra en la misma tarea y en el calendario del curso.

Se recuerda a los estudiantes que las entregas deben ser un producto original de cada estudiante, por lo que se les pide revisar la sección 6 del programa de la materia y el Código de Honor y Ética.

Evaluación#

A diferencia de los trabajos prácticos anteriores, este trabajo práctico tiene una nota numérica individual asociada. La misma será definida por los docentes de la materia y se basará en la calidad del trabajo entregado y en la defensa oral del mismo.

Para aprobar, es fundamental que el código se ejecute correctamente sin lanzar excepciones; cumpliendo con los requerimientos de la consigna. Además, se evaluará la calidad del código y la calidad de los comentarios y documentación. Cualquier detalle adicional que agreguen será tenido en cuenta para la nota final.

La defensa oral se realizará en la semana de finales de la materia. En la misma, se les pedirá a los estudiantes que presenten su trabajo y respondan preguntas sobre el mismo. No es necesario que se arme una presentación, pero es recomendable que traigan alguna computadora con el codigo para poder verlo junto al docente en el momento. La defensa oral es obligatoria y es un requisito para aprobar la materia.