Gran Cerdo
Realizado durante el año 2022
Este proyecto fue la entrega final de la materia Laboratorio I de la carrera Técnico Universitario en Programación - (UTN). El desafío era particular: no tenía libertad para inventar el juego; las reglas, el inicio y el fin ya estaban definidos por la cátedra de Angel Simon.
Lejos de verlo como una limitación, lo tomé como una oportunidad para pensar en la arquitectura del proyecto. ¿Hasta dónde la podía escalar?
1. Separando Lógica de la Vista
El error común en proyectos de consola es mezclar cout y cin con la lógica del negocio, creando un “código espagueti” difícil de mantener.
Mi objetivo principal fue separar la Lógica (reglas, puntajes, estados) de la GUI (lo que ve el usuario). Para esto, utilicé la librería rlutil, que me permitió manipular el cursor y los colores de la consola, pero manteniéndolo aislado en su propia capa de presentación.
// La lógica no sabe de colores, solo de datos
int calcularPuntaje(int dados[], int cantidad) {
// ... algoritmo de cálculo de combinaciones
return puntaje;
}
// La vista solo se encarga de "pintar"
void dibujarInterfaz(int puntajeActual) {
rlutil::setColor(rlutil::CYAN);
rlutil::locate(10, 5);
cout << "Puntaje Actual: " << puntajeActual;
}
2. El Algoritmo de los Dados
Esta fue, sin dudas, la parte más satisfactoria del desarrollo. Aunque el enunciado limitaba el juego a 2 o 3 dados, me hice la pregunta inevitable: “¿Y si mañana cambian las reglas y piden 5, o 10?”.
Me negué a “hardcodear” posiciones fijas. Quería un sistema capaz de renderizar dinámicamente cualquier cantidad de dados que recibiera en un array.
El problema real apareció al querer alinearlos horizontalmente. La consola escribe de forma lineal (de arriba a abajo); si dibujaba un dado completo y pasaba al siguiente, quedaban apilados uno debajo del otro. Para ponerlos lado a lado, tuve que cambiar la lógica y pensar como si fuera el cabezal de una impresora:
El algoritmo no dibuja “un dado entero”, sino que dibuja la primera línea superior de TODOS los dados, hace un salto de línea, dibuja la segunda parte de TODOS los dados, y así sucesivamente.
Tuve que coordinar ese barrido horizontal con la lógica interna de cada cara (detectar si el número es par o impar para saber si lleva punto en el centro, ubicar las esquinas, etc.).
El resultado: Un bloque de lógica de unas 100 líneas. Quizás no sea el código más óptimo del mundo, pero resolver ese rompecabezas de renderizado manual fue donde realmente disfruté programando.
3. Gráficos en un entorno de texto
Al final llegó la librería rlutils. No era obligatoria, pero enseguida comprendí que era lo que me estaba faltando para terminar de darle forma al programa. Trabajar en consola puede ser visualmente aburrido. Me esforcé por pulir todo lo que se viera utilizando rlutil para limpiar la pantalla de manera eficiente, manejar inputs sin necesidad de presionar Enter constantemente y dar feedback visual con colores cuando el jugador ganaba o perdía puntos.
Conclusión: Este proyecto fue agotador por la exigencia de los detalles, pero fue la primera vez que sentí la presión del tiempo y el deseo de terminar de superar el desafío.
Tecnologías:
- Lenguaje: C++
- Librerías: rlutil (Manejo de consola)
- Paradigma: Procedural con separación de responsabilidades.