Challenge 1 de the huddle. Juego por turnos con Programación Orientada a Objetos.
Juego de combate por turnos en consola: un pingüino (jugador) enfrenta a un conjunto de depredadores marinos, con la ayuda de un aliado. El desafío exigía modelar el sistema completo aplicando los 4 pilares de POO (abstracción, herencia, polimorfismo y encapsulamiento), con una clase Game como motor del loop, sin lógica de reglas flotando en el main.
- Python
- abc (clases abstractas)
- random (libreria de python)
Iceforge
├── characters.py → Dominio: Character (abstracta), Player, Enemy, Orca, Delfin, Ally
├── motor.py → Motor: clase Game (coordinación del loop y turnos)
├── UI.py → Consola: inputs y prints
├── main.py → Punto de entrada
└── README.md
python main.pyEl juego pide por consola a qué enemigo atacar en cada turno del pingüino; el resto de las acciones (aliado, enemigos) son automáticas.
Separación en characters.py, motor.py y UI.py.
Es uno de los requisitos obligatorios del challenge, apuntado directamente a los pilares de POO: cada archivo tiene una única responsabilidad (dominio, coordinación, interfaz), lo que permite escalar el juego —por ejemplo agregar un enemigo nuevo— sin tocar código que no le corresponde a esa responsabilidad.
Character como clase abstracta con ABC.
No existe un "personaje genérico" en el juego — siempre es un pingüino, una orca, un delfín o un aliado. Character no se instancia directamente y obliga a sus hijas a implementar atacar, que cada una hace de forma distinta (polimorfismo).
Atributos con _ en vez de __.
Con __ Python aplica name mangling y las clases hijas no pueden acceder al atributo del padre, ni siquiera con super(). Como Player, Enemy y Ally necesitan usar atributos definidos en Character (como el daño base), se usó _ — protegido por convención, pero accesible desde las subclases — y se expusieron nombre y vida como solo lectura con @property para las consultas desde fuera de las clases.
Delfín con daño reducido.
El delfín ataca a los dos objetivos (pingüino y aliado) en el mismo turno, a diferencia de los demás enemigos que atacan a uno solo. Para no romper el balance del juego, su daño se redujo — es su forma particular de implementar atacar, mostrando polimorfismo real y no solo una copia del comportamiento de Enemy.
- Clase abstracta como contrato del sistema (
Character, no instanciable). - Mínimo 3 clases hijas con herencia y polimorfismo (
Player,Enemy→Orca/Delfin,Ally). - Encapsulamiento real del estado (atributos protegidos +
@property). - Clase
Gamecomo motor: inicializa, coordina turnos y determina el fin de la partida. - Código modularizado en 3 zonas lógicas (dominio, motor, UI consola), sin reglas sueltas en
main.
Fede Alarcón Scura — Estudiante de Penguin Academy Challenge desarrollado como parte del programa de formación.