Este proyecto es una práctica para reforzar conceptos de programación estructurada y programación orientada a objetos (POO) en Python. Comienza con una versión funcional usando funciones y luego se refactoriza a clases.
-
Funciones:
La versión inicial resuelve la lógica principal con funciones sueltas:generar_mapa(): genera la matriz del mapa.validar_coordenadas(): comprueba que una posición esté dentro de los límites.imprimir_mapa(): muestra la cuadrícula.main(): organiza el flujo de ejecución.
-
Clases:
La versión refactorizada encapsula todo dentro de clases:Mapa: representa la cuadrícula, valida posiciones, gestiona inicio, salida y obstáculos.Juego: controla la interacción con el usuario y usaMapapara construir la lógica general.
-
Mapa:- Se encarga de crear y mantener el estado del mapa.
- Valida coordenadas.
- Permite agregar inicio, salida y obstáculos.
- Se ocupa de imprimir su propio contenido.
-
Juego:- Orquesta la interacción con el usuario.
- Pide datos al usuario para ubicar obstáculos.
- Llama a los métodos de
Mapasegún corresponda. - Mantiene separado el flujo de ejecución de la lógica interna del mapa.
- Encapsular la lógica en clases hace que el código sea más modular, legible y reutilizable.
- El código se vuelve más fácil de mantener, porque cada clase tiene una responsabilidad clara.
- Aprendí a convertir un programa procedural en POO, trasladando funciones a métodos y pasando de variables globales a atributos de instancia.
- Practiqué la creación de métodos constructores
__init__, el uso deselfy la correcta gestión de atributos de instancia.
-
Separar en dos clases (
MapayJuego):
Para que la lógica del mapa y la lógica del flujo de juego estén desacopladas. Esto facilita reutilizarMapaen otros programas o pruebas automáticas. -
Inicializar
inicioysalidacomoNone:
Porque no siempre se conoce su valor al crear el mapa. Se colocan después con métodos específicos. -
Mantener validación dentro de
Mapa:
Así, se garantiza que no haya posiciones inválidas sin importar desde dónde se use la clase. -
Mantener la interacción de usuario solo en
Juego:
Para queMapasea una clase pura, sininput()niprint()directos excepto el métodoimprimir(). Esto separa la lógica de negocio de la interacción.
- ✔️ Versión funcional procedural.
- ✔️ Refactorización a POO.
- ✔️ Flujo de ejecución organizado en una clase
Juego.