Después del primer sprint, el siguiente paso es conseguir que se pueda jugar con el juego.
Suena obvio, pero no todos los proyectos de software buscan asegurar este mínimo. Es decir. El juego ahora mismo es una birria, pero da absolutamente igual porque no se puede jugar. Por tanto, necesitamos proporcionar a las jugadoras potenciales de una forma de interaccionar con el código que ya tenemos para que, al menos, puedan entender la mecánica básica y darnos feedback.
The walking skeleton
El esqueleto andante es una forma de referirse a un pequeño desarrollo inicial con el que aseguramos que el sistema que estamos diseñando puede funcionar. Nos interesa que el sistema pueda levantarse, que esté accesible a las usuarias de la forma prevista, que los grandes componentes estén presentes, etc. Puede ser preparar un repositorio para el desarrollo, un pipeline para el despliegue, habilitar un servidor… lo que sea necesario.
Por ejemplo, en nuestro caso queremos que el juego se ejecute en la línea de comandos. Una forma de hacer esto es utilizar setuptools
y definir un archivo setup.py
que defina el entry point de la aplicación:
.
├── Pipfile
├── dungeon
│ ├── __init__.py
│ ├── __main__.py
│ ├── dungeon.py
│ ├── game.py
│ ├── room.py
│ ├── tests
│ │ ├── __init__.py
│ │ └── minimum_game_test.py
│ └── wall.py
└── setup.py
Aquí está setup.py:
from setuptools import setup
setup(
name="Dungeon",
version="0.1.0",
packages=["dungeon"],
entry_points={
"console_scripts": [
"dungeon = dungeon.__main__:main"
]
},
)
Y aquí tenemos nuestro entry point en dungeon/__main__.py
import sys
def main(args=None):
if args is None:
args = sys.argv[1:]
print("Welcome to the Dungeon")
if __name__ == "__main__":
sys.exit(main())
Con esto, podemos ejecutar el walking skeleton:
python -m dungeon
Y esto es lo que obtenemos:
❯ python -m dungeon
Welcome to the Dungeon
Ya tenemos un walking skeleton que nos permite asegurar que hay una aplicación que es ejecutable.
De todos modos, vamos a enriquecer un poquito este esqueleto, haciendo que se ejecute algo del juego. Aunque solo sea una especie de demo. Suficiente para saber que podemos conectar este entry point con el juego en sí. Con eso tendremos algo para enseñar.
Modifiquemos dungeon/__main__.py
import sys
from dungeon.game import Game
def main(args=None):
if args is None:
args = sys.argv[1:]
print("Welcome to the Dungeon")
print("-")
game = Game()
game.start()
print(game.execute("look around"))
print("-")
print(game.execute("go south"))
print("-")
print(game.execute("look around"))
print("-")
print(game.execute("go north"))
print("-")
if __name__ == "__main__":
sys.exit(main())
Y al ejecutar, obtenemos:
❯ python -m dungeon
Welcome to the Dungeon
-
North: There is a door
East: There is a wall
South: There is a wall
West: There is a wall
That's all
-
You hit a wall
-
North: There is a door
East: There is a wall
South: There is a wall
West: There is a wall
That's all
-
Congrats. You're out
-
Próximos pasos
Con esta iteración hemos podido entregar lo que ha resultado ser una demo del juego. No es jugable, pero permite hacerse una idea de por dónde van los tiros.
Y es muy interesante porque aunque tiene un montón de defectos ya nos garantiza podemos arrancar la aplicación y que el entry point escogido está vinculado con el código del juego en sí.
Incluso en esta pequeña demo podemos recoger feedback. Vamos a ver algunas ideas:
- Por el código sabemos que se ejecutan varias órdenes del juego. Sin embargo, no hacemos eco de ellas de modo que al ver el resultado de la demo, no queda claro cómo funcionaría pues únicamente muestra su resultado.
- La demo no es interactiva, aunque el juego esté muy limitado, no podemos poner a las usuarias a explorarlo, con lo que obtendríamos un feedback importante.
Por tanto, no estamos en condiciones de entregar el juego, pero ya sabemos qué hacer para lograrlo.
Otro aprendizaje importante es que estas iteraciones pequeñas nos permiten pivotar o cambiar de objetivos fácilmente. Por ejemplo, la entrega que acabamos de realizar ha puesto de relieve algunos problemas que de otro modo tal vez no se hubiesen puesto de manifiesto hasta un momento más tardío en el que fuesen más difíciles de solucionar.
Gracias a eso, por ejemplo, podemos ocuparnos de como tratar este “eco” de las acciones del usuario, lo que será información muy valiosa para avanzar en el diseño.
Así que nuestra próxima iteración irá enfocada a resolver este problema que ahora mismo consideramos más importante.