¿Qué queremos hacer?
Nos gustaría programar un juego cuyo escenario es un mapa en el que
intervienen distintos tipos de elementos: paredes, un Pac-Man, fantasmas,
y pastillas comestibles. El jugador controla al Pac-Man, y los fantasmas
se mueven de acuerdo con distintos criterios.
Vamos a hacer varias simplificaciones para poder trabajar con el juego en clase:
- Todas las posiciones en los extremos del mapa tienen paredes, de tal manera que los personajes no pueden caerse fuera del mapa.
- El Pac-Man comienza ubicado sobre la coordenada (1, 1), que no tiene paredes.
- Todas las pastillas son del mismo tipo.
- Cuando el Pac-Man entra en contacto con una pastilla, la pastilla desaparece y el jugador gana un punto.
- Cuando el Pac-Man entra en contacto con un fantasma, el jugador pierde una vida y el Pac-Man se reubica sobre la coordenada (1, 1).
- No nos vamos a preocupar por lo que pasa cuando el jugador llega a tener 0 vidas («pierde») o llega a comer todas las pastillas («gana»).
¿Cómo podríamos programar un Pac-Man en Gobstones?
Siempre que programamos, lo que hacemos es representar la realidad usando datos: números, booleanos, listas, registros, etc. Es prácticamente imposible representar toda la realidad; lo que hacemos es representar los aspectos y las partes de la realidad que nos interesan en un contexto determinado. Una vez que elegimos una manera de representar la parte de la realidad que nos interesa, podemos resolver problemas de la realidad trabajando con los datos que la representan.
Notemos que la representación de la realidad usando datos, y la interpretación de los datos para entenderlos como parte de la realidad, son tareas exclusivamente humanas, que quedan fuera del alcance de lo que puede hacer una computadora. Los programas, a lo sumo, pueden servir para convertir una representación en otra.
También puede ser interesante notar que los dibujitos de las manzanas no son las manzanas de la realidad. Son a su vez una representación de la realidad.
Ejercicio 1
¿Cuál es la parte de la realidad que queremos representar en el caso de nuestro juego de Pac-Man? ¿Cómo podemos representarla usando números, booleanos, listas y registros?
Vamos a discutir cómo podríamos definir un registro Juego que sirva para representar los aspectos de un juego de Pac-Man que nos interesan.
- No hay una sola manera de representar un juego de Pac-Man. ¿Se les ocurren otras maneras?
- Algunas maneras de representar un juego de Pac-Man pueden ser más convenientes que otras. Vamos a comparar las representaciones que propusimos.
- ¿Cuál es el invariante que debe cumplir un registro del tipo Juego para representar efectivamente un juego de Pac-Man?
- ¿Cómo se podría modificar la representación para que haya otros tipos de pastillas?
Ejercicio 2
El siguiente tipo sirve para representar la configuración de colores con la que se dibujan los elementos del juego en la pantalla:
type ConfigColores is record { field colorPacman // color con que se dibuja el Pac-Man field colorFantasma // color con que se dibujan los fantasmas field colorPastilla // color con que se dibujan las pastillas field colorPared // color con que se dibujan las paredes }
Programar el procedimiento RenderJuego(juego, config) que recibe
un juego de Pac-Man y una configuración de colores, y dibuja el juego en el tablero de Gobstones, usando los colores indicados en la configuración.
Ejercicio 3
En Introducción a la Programación no estudiamos cómo
hacer programas que puedan interactuar con el usuario por medio del teclado.
Esto es porque el usuario y el teclado pertenecen a la realidad, pero
la programación no se basa en manejar la realidad, sino fundamentalmente en manejar datos que representan la realidad.
Programar la función moverPacman(juego, tecla) que recibe
un juego de Pac-Man y una dirección, que representa la tecla presionada por el jugador, y denota el juego de Pac-Man que resultaría de mover el Pac-Man hacia esa dirección. Observaciones:
- Si hay una pared, el Pac-Man debe quedar donde estaba.
- Si hay una pastilla, el Pac-Man debe comerla y ganar un punto.
- Si hay un fantasma, el Pac-Man debe volver a la coordenada (1, 1) y perder una vida.
Ejercicio 4 (abierto)
Programar la función moverFantasmas(juego) que recibe un juego de Pac-Man y denota el juego de Pac-Man que resultaría de mover los fantasmas, usando algún criterio para moverlos. Si alguno de los fantasmas entra en contacto con el Pac-Man, el Pac-Man debe volver a la coordenada (1, 1) y perder una vida.
En el juego original de Pac-Man, cada fantasma tiene su propia personalidad. Por ejemplo, el fantasma rojo persigue al Pac-Man, mientras que el fantasma rosa trata de ubicarse en el lugar hacia donde el Pac-Man está yendo.
Un criterio sencillo (que no daría lugar a un juego muy divertido) podría ser que cada fantasma se mueva hacia la primera dirección (N, E, S, O) hacia donde no haya una pared. Un criterio un poco más interesante sería que cada fantasma se mueva
hacia la dirección que más lo acerque a la coordenada donde el Pac-Man se encuentra actualmente.