Año 2077.
Córdoba ya no es la que conocías.
Los barrios están gobernados por inteligencias artificiales corporativas.
Los recursos son escasos.
Las decisiones importan.
Y cada algoritmo puede cambiar el destino del sistema.
Bienvenido/a al proyecto integrador de Algoritmos y Estructuras de Datos.
Este no es solo un trabajo práctico.
Es un laboratorio vivo donde cada estructura que implementes tendrá impacto real en el mundo del juego.
- Gabi Valenzuela (@GabrielEValenzuela) - Lider de proyecto.
- Ramiro Navarro (@RamiroNavarro01) - Desarrollador.
- Marcos Rusconi (@b0nusonline) - Desarrollador
- Erick Economou (@ErickEconomou) - Desarrollador
- Lautaro Flores (@lautyfg) - Desarrollador
- Alejandro Kodjadelian (@Alejandro-unc) - Desarrollador
- Diego Romero (@diego3435) - Desarrollador
- Martin Compagnucci (@Martin2026-AyE) - Desarrollador
- Marcos Bravin (@marcosbravin7) - Desarrollador
- Leandro Bassi (@LeandroBassi) - Desarrollador
- Agustina Marasini (@agustinaa-arch) - Desarrollador
- Marcos Bravin (@marcosbravin7) - Desarrollador
- Agustin Mella Romero (@mellantastico) - Desarrollador
- Santiago Fernandez (@SantiFernandezGit) - Desarrollador
- Alejo Sosa Luna (@asosalunaa) - Desarrollador
- Lautaro Perez (@Lautazz11) - Desarrollador
- Alejo Sosa Luna (@asosalunaa) - Desarrollador
- Juani Aguero (@juaniaguero) - Desarrollador
- Valentin Suppo (@valesppo) - Desarrollador
- Benjamin Vasconsellos (@benjaminvasconsellos) - Desarrollador
- Santiago Riera (@SantiiRiera) - Desarrollador
- Facundo Lugones (@Facu01332) -Desarrollador
- Sofia Romero (@nqtsqfy) - Desarrollador
- Alexis Garay(@Garay1913) - Desarrollador
- Ivan Pastrana (@ivanpastrana-dev) - Desarrollador
- Facundo Michaud (@FacuM225) - Desarrollador
- Camila Soto (@camila-soto) - Desarrollador
- Santiago Bertocco (@santi-bertocco) - Desarrollador
- Leonardo Rincon (@LeoRincon03) - Desarrolador
- Juan Ignacio Fernandez(@JuanIFSB) - Desarrollador
- Luis Enrique Palacio (@luis-palacio-unc) - Desarrollador
- Pilar Fernandez Bonilla(@Pilarfbonilla)-Desarrollador
- Ángela Marioni (@Angela-M-01) - Desarrollador
- Matias Martin Fenizi (@matiasfenizi-a11y) - Desarrollador
- Geronimo Borda Bossana(@granitsilber-e36) - Desarrollador
- Fabricio Lucero(@fabriciobit) - Desarrollador
Es un RPG 2D top-down desarrollado con raylib, donde el motor gráfico ya está provisto por la cátedra.
Tu misión no es dibujar el mundo.
Tu misión es diseñar la lógica que lo gobierna.
Cada estructura de datos que construyas será el corazón del sistema:
- 📦 El inventario será una estructura dinámica (lista).
- 🔄 El sistema de “undo” usará una pila.
- 🕒 Los eventos y turnos se gestionarán con colas.
- 🌳 Las habilidades se organizarán con árboles.
- 🗺 El mapa de la ciudad será un grafo.
- ⚡ La navegación y rutas dependerán de algoritmos como Dijkstra.
- 🧠 Las decisiones estratégicas usarán estrategias algorítmicas (voraces, etc.).
- 🗃 El acceso eficiente a recursos dependerá de hashing.
Acá los algoritmos no son teoría.
Son mecánicas.
Seguimos una arquitectura MVC estricta:
-
Modelo → implementado por ustedes
Contiene estructuras de datos + lógica algorítmica. -
Vista → raylib (provista)
Renderiza el mundo, pero no conoce la implementación interna. -
Controlador → coordina entradas y actualiza el modelo.
El objetivo es que entiendas que las decisiones técnicas impactan en:
- Rendimiento
- Correctitud
- Escalabilidad
- Claridad de diseño
Este proyecto no es solo código.
Trabajaremos con:
- ✅ Git y Pull Requests
- ✅ Integración continua (CI)
- ✅ Tests unitarios
- ✅ Benchmarks de rendimiento
- ✅ Revisión entre pares
Aprenderás a medir lo que haces.
A justificar tus decisiones.
A defender tu implementación.
Durante el cuatrimestre el sistema evolucionará:
- Complejidad y memoria.
- Listas → Inventario.
- Pilas → Sistema de deshacer acciones.
- Colas → Eventos y turnos.
- Árboles → Habilidades.
- Grafos → Mapa y navegación.
- Hashing → Acceso eficiente a recursos.
- Estrategias → Decisiones algorítmicas.
Cada semana el mundo se vuelve más complejo.
Y vos también.
No buscamos solo que el programa compile.
Buscamos que puedas responder:
- ¿Cuál es la complejidad de esta operación?
- ¿Por qué elegí esta estructura y no otra?
- ¿Cómo afecta esto al rendimiento del sistema?
- ¿Es seguro respecto a memoria?
Cuando puedas contestar eso con confianza,
habrás dado un salto enorme como ingeniero/a.
Porque aprender estructuras de datos de forma aislada se queda corto.
Pero ver cómo una mala implementación:
- baja los FPS,
- rompe el inventario,
- hace que el NPC no encuentre camino,
- o duplica recursos,
te enseña algo que ningún slide puede lograr.
- No usar STL para las estructuras que deban implementarse en la materia.
- Código modular, claro y documentado.
- Tests obligatorios.
- Benchmarks mínimos requeridos.
- Respeto por la arquitectura MVC.
Este proyecto está diseñado para que te desafíe.
Al principio parecerá complejo.
Luego empezará a tener sentido.
Y al final, vas a mirar código de otra manera.
Cyberpunk Córdoba 2077 no es solo un juego.
Es el entorno donde vas a empezar a pensar como ingeniero/a.
La ciudad espera.
Tu algoritmo también.
Este proyecto utiliza CMake como sistema de build.
- Compilador compatible con C++17 (recomendado: GCC ≥ 11 / Clang ≥ 14)
- CMake ≥ 3.16
- raylib (incluida / provista por el template del curso)
- Git
git clone <repository-url>
cd cyberpunk-cordoba-2077
mkdir build
cd build
cmake ..
cmake --build .Para ejecutar:
./cyberpunk2077Para compilar en modo debug:
cmake -DCMAKE_BUILD_TYPE=Debug ..Recomendamos fuertemente compilar con:
- Address Sanitizer
- Undefined Behavior Sanitizer
Ejemplo:
cmake -DCMAKE_CXX_FLAGS="-fsanitize=address,undefined -g" ..Porque en 2077, los memory bugs se pagan caro.
Este repositorio sigue un flujo de trabajo profesional.
main→ versión establedev→ rama de integración- Ramas por feature →
feature/<nombre>
Ejemplo:
git checkout -b feature/inventory-listCada aporte debe:
-
Compilar correctamente
-
Pasar tests
-
Respetar MVC
-
Incluir una breve explicación técnica:
- Complejidad
- Consideraciones de memoria
- Decisión de diseño
Formato sugerido para títulos:
[UNIT X] Implement Linked List Inventory
Toda estructura implementada debe incluir tests de:
- Construcción / destrucción
- Insert / Remove
- Casos borde
- Correctitud de memoria (sin leaks)
Si solo funciona en el “happy path”, no funciona.
Este proyecto incluye un leaderboard de rendimiento y calidad.
Podés ganar badges por:
- ⚡ Implementación más rápida (benchmark medido)
- 🧠 Mejor justificación de complejidad
- 🧼 Arquitectura más limpia
- 🔒 Cero memory leaks
- 🔥 Optimización destacada
Las mejores implementaciones se mostrarán en clase.
No se trata de competir por ego. Se trata de aprender a construir sistemas excelentes.
El proyecto está organizado siguiendo principios de separación de responsabilidades y escalabilidad.
cyberpunk-cordoba-2077/
│
├── CMakeLists.txt
├── README.md
│
├── assets/ # Recursos gráficos y sonidos (solo lectura)
│
├── include/ # Headers públicos
│ ├── model/
│ ├── controller/
│ └── common/
│
├── src/ # Implementaciones
│ ├── model/
│ ├── controller/
│ └── main.cpp
│
├── tests/ # Tests unitarios
│ ├── test_list.cpp
│ ├── test_stack.cpp
│ └── ...
│
├── benchmarks/ # Medición de rendimiento
│
└── build/ # Carpeta generada (no versionar)
Aquí viven las estructuras de datos y la lógica algorítmica.
No deben depender de la vista.
Coordina entradas del usuario y actualiza el modelo.
Contiene recursos gráficos.
No modificar sin autorización.
Cada estructura debe tener su archivo de test correspondiente.
Nunca se versiona.
Debe estar en el .gitignore.
Este proyecto está organizado para que aprendas:
- Separación de responsabilidades
- Diseño modular
- Bajo acoplamiento
- Alta cohesión
- Escalabilidad futura
Si tu estructura depende de raylib directamente, está mal diseñada. Si el modelo conoce la vista, está mal diseñado. Si no podés testear algo en aislamiento, está mal diseñado.
Que puedas explicar:
- Qué capa hace qué.
- Qué depende de qué.
- Qué pasaría si cambiamos la vista.
- Qué pasaría si cambiamos la estructura interna.
Porque en ingeniería real, el diseño importa tanto como el algoritmo.
En 2077, los sistemas no perdonan la ineficiencia. Y el software real tampoco.
Compilá con cuidado. Medí todo. Pensá antes de codear.