Programar el juego Sokoban en una versión retro para consola.
-
Aplicar los conocimientos básicos de programación orientada a objetos con Python (Clases, Objetos, Métodos, Variables, Arrays, Bucles, Leer desde teclado, Decisiones, etc.).
-
Utilizar ingeniería de software para analizar, diseñar y desarrollar el juego.
-
Utilizar Kanban para dar seguimiento a las actividades a realizar ToDo, Doing, Done.
-
Utilizar Hitos (Milestones) para cada una de las etapas del desarrollo.
-
Documentar el código generado.
El juego sokoban consiste en recorrer un mapa en forma de laberinto para empujar cajas que estan repartidas en el mapa, hacia puntos determinados por las metas, y tiene las siguientes reglas:
- El personaje se puede mover hacia arriba, abajo, izquierda y derecha.
- El personaje solo puede empujar 1 caja hacia arriba, abjo, izquierda o derecha.
- El personaje se moverá en un mapa predefinido.
- Para terminar el nivel se tienen que acomodar todas las cajas sobre las metas.
- Cada nivel tiene distinto número de cajas y metas.
- El nivel de dificultad no está determinado necesariamente por la cantidad de cajas y metas.
Sokoban tiene 2 partes principales de juego, el mapa donde se va jugar y los elementos (personaje, cajas, metas, paredes y piso).
Cada nivel del juego se colocará dentro de una array bidimensional, colocando números para representar los elementos de juego, a continuación se tiene un ejemplo básico de nivel.
mapa = [
[3,3,3,3,3,3,3],
[3,4,4,4,4,4,3],
[3,4,0,4,1,2,3],
[3,4,4,4,4,4,3],
[3,3,3,3,3,3,3]
]
Para esta versión del sokoban se utilizarán numeros para representar cada uno de los elementos del juego.
Número | Interpretación |
---|---|
0 | Personaje |
1 | Cajas |
2 | Metas |
3 | Paredes |
4 | Piso |
5 | Pesonaje_meta |
6 | Caja_meta |
Para moverse en el juego el usuario utilizará alguna de las siguientes letras para indicar hacia adonde se quiere mover:
Letra | Dirección del movimiento |
---|---|
a | Izquierda |
d | Derecha |
w | Arriba |
s | Abajo |
El juego consiste mostrar el mapa y solicitar al usuario que escriba la letra hacia donde se quiere mover, despúes de colocar la letra se presiona enter, se evalua el moviento, si es un movimiento valido se realiza el cambio en el array, es decir se actualiza el mapa, y se repite este proceso forma infinita, hasta que se hayan terminado de acomodar todas las cajas sobre las metas.
Después de realizar un análisis del juego sokoban se identifican funciones necesarias para completarlo, a continuación se crea una tabla con la lista de estas funciones para tener un mejor control sobre el avance del desarrollo del juego.
Para llevar un mejor control del avance del desarrollo se utiliza la metodología Kanban, indicando en que estatus de desarrollo se encuentra cada función del juego
Valor | Interpretación |
---|---|
ToDo | Por hacer |
Doing | Programando y validando |
Done | Programada y validada con éxito |
No. | Función | Kanban | Fecha terminación |
---|---|---|---|
0. | Cargar el siguiente nivel. | ToDo | - |
Nota: En este sentido para un mejor control se podrían agregar las columnas asignación (en caso de que sea un trabajo en equipo) y fecha de inicio, para conocer los tiempos que estan llevando realizar cada una de las funciones.
No. | Función | Asignación | ToDo | Doing | Done | Fecha inicio | Fecha terminación |
---|---|---|---|---|---|---|---|
0. | Cargar el siguiente nivel. | Salvador | - | - | X | 18/Mar/2024 | 19/Mar/2024 |
1. | Repetir el juego hasta terminar el nivel. | Salvador | - | X | - | 19/Mar/2024 | - |
No. | Función | Kanban | Fecha terminación |
---|---|---|---|
0. | Cargar el siguiente nivel. | - | - |
1. | Repetir el juego hasta terminar el nivel. | - | - |
2. | Imprimir mapa. | - | - |
3. | Leer el movimiento. | - | - |
4. | Evaluar el movimiento del usuario. | - | - |
Ejemplo de movimientos Inicio y Fin:
- Personaje, Espacio [0,4] -> Espacio, Personaje [4,0] |
No. | Función | Kanban | Inicio | Fin | Fecha terminación |
---|---|---|---|---|---|
5. | Personaje, espacio | - | [ ] | [ ] | - |
6. | Personaje, meta | - | [ ] | [ ] | - |
7. | Personaje, caja, espacio | - | [ ] | [ ] | - |
8. | Personaje, caja, meta | - | [ ] | [ ] | - |
9. | Personaje, caja_meta, espacio | - | [] | [] | - |
10. | Personaje, caja_meta, meta | - | [] | [] | - |
11. | Personaje_meta, espacio | - | [] | [] | - |
12. | Personaje_meta, meta | - | [] | [] | - |
13. | Personaje_meta, caja, espacio | - | [] | [] | - |
14. | Personaje_meta, caja, meta | - | [] | [] | - |
15. | Personaje_meta, caja_meta, espacio | - | [] | [] | - |
16. | Personaje_meta, caja_meta, meta | - | [] | [] | - |
No. | Función | Kanban | Inicio | Fin | Fecha terminación |
---|---|---|---|---|---|
17. | Personaje, espacio | - | [] | [] | - |
18. | Personaje, meta | - | [] | [] | - |
19. | Personaje, caja, espacio | - | [] | [] | - |
20. | Personaje, caja, meta | - | [] | [] | - |
21. | Personaje, caja_meta, espacio | - | [] | [] | - |
22. | Personaje, caja_meta, meta | - | [] | [] | - |
23. | Personaje_meta, espacio | - | [] | [] | - |
24. | Personaje_meta, meta | - | [] | [] | - |
25. | Personaje_meta, caja, espacio | - | [] | [] | - |
26. | Personaje_meta, caja, meta | - | [] | [] | - |
27. | Personaje_meta, caja_meta, espacio | - | [] | [] | - |
28. | Personaje_meta, caja_meta, meta | - | [] | [] | - |
No. | Función | Kanban | Inicio | Fin | Fecha terminación |
---|---|---|---|---|---|
29. | Personaje, espacio | - | [][] | [][] | - |
30. | Personaje, meta | - | [][] | [][] | - |
31. | Personaje, caja, espacio | - | [][] | [][] | - |
32. | Personaje, caja, meta | - | [][] | [][] | - |
33. | Personaje, caja_meta, espacio | - | [][] | [][] | - |
34. | Personaje, caja_meta, meta | - | [][] | [][] | - |
35. | Personaje_meta, espacio | - | [][] | [][] | - |
36. | Personaje_meta, meta | - | [][] | [][] | - |
37. | Personaje_meta, caja, espacio | - | [][] | [][] | - |
38. | Personaje_meta, caja, meta | - | [][] | [][] | - |
39. | Personaje_meta, caja_meta, espacio | - | [][] | [][] | - |
40. | Personaje_meta, caja_meta, meta | - | [][] | [][] | - |
No. | Función | Kanban | Inicio | Fin | Fecha terminación |
---|---|---|---|---|---|
41. | Personaje, espacio | - | [][] | [][] | - |
42. | Personaje, meta | - | [][] | [][] | - |
43. | Personaje, caja, espacio | - | [][] | [][] | - |
44. | Personaje, caja, meta | - | [][] | [][] | - |
45. | Personaje, caja_meta, espacio | - | [][] | [][] | - |
46. | Personaje, caja_meta, meta | - | [][] | [][] | - |
47. | Personaje_meta, espacio | - | [][] | [][] | - |
48. | Personaje_meta, meta | - | [][] | [][] | - |
49. | Personaje_meta, caja, espacio | - | [][] | [][] | - |
50. | Personaje_meta, caja, meta | - | [][] | [][] | - |
51. | Personaje_meta, caja_meta, espacio | - | [][] | [][] | - |
52. | Personaje_meta, caja_meta, meta | - | [][] | [][] | - |
Está función determina si todas las cajas estan en una meta, cuando esto sucede se debe cargar el siguiente nivel de juego.
No. | Función | Kanban | Fecha terminación |
---|---|---|---|
53. | Evaluar si el nivel esta terminado (Esto sucede cuando todas las cajas estan sobre las metas), SI el nivel esta terminado cargar el siguiente nivel (Los niveles de juego estarán en archivos de texto independiente). | - | - |
54. | Reiniciar el mapa (Con la letra r, se vuelve a cargar el nivel que se esta jugando) | - | - |
Como parte del reto de programar un Sokoban, hay que agregar alguna función especial al juego, como por ejemplo bajo ciertas condiciones empujar 2 cajas, colocar un temporizador por nivel, etc.
No. | Función | Kanban | Fecha terminación |
---|---|---|---|
55. | Función adicional o powerup (descripción). | - | - |