| Nombre | Legajo | |
|---|---|---|
| Mateo Andrioli | 64042 | mandrioi@itba.edu.ar |
| Santino Giambelluca | 64697 | sgiambelluca@itba.edu.ar |
El proyecto se compila utilizando Docker con la imagen de la cátedra agodio/itba-so-multiarch:3.1:
# Iniciar el contenedor Docker
docker run -v "${PWD}:/root" --privileged -ti agodio/itba-so-multiarch:3.1
# Dentro del contenedor, compilar:
cd /root
make clean
makeLos binarios generados se encuentran en la carpeta bin/:
bin/master- Proceso principal del juego.bin/vista- Proceso de visualizacion.bin/jugador- Proceso jugador con IA.
./bin/master [opciones]| Flag | Descripcion | Valor por defecto |
|---|---|---|
-w |
Ancho del tablero | 10 |
-h |
Alto del tablero | 10 |
-d |
Delay entre turnos (ms) | 200 |
-t |
Timeout de inactividad (segundos) | 10 |
-s |
Semilla para generacion aleatoria | time(NULL) |
-v |
Path al ejecutable de la vista | (ninguno) |
-p |
Paths a los ejecutables de jugadores | (ninguno) |
# Juego con 2 jugadores y tablero de 15x10, con vista.
./bin/master -w 15 -h 10 -v ./bin/vista -p ./bin/jugador ./bin/jugador
# Juego con 4 jugadores, tablero de 20x30 y timeout de 30 segundos, con vista.
./bin/master -w 20 -h 15 -t 30 -v ./bin/vista -p ./bin/jugador ./bin/jugador ./bin/jugador ./bin/jugador
# Juego sin vista con tablerode 10x10 (solo resultados finales).
./bin/master -w 10 -h 10 -p ./bin/jugador ./bin/jugadorSO_TP1/
├── src/
│ ├── master.c # Proceso principal
│ ├── vista.c # Proceso de visualización
│ ├── jugador.c # Proceso de jugador
│ └── libs/
│ ├── gameLogic.c # Lógica del juego
│ ├── viewRender.c # Renderizado de tablero
│ ├── playerAI.c # Inteligencia artificial
│ ├── shmState.c # Memoria compartida (estado)
│ ├── shmSync.c # Memoria compartida (semaforos)
│ ├── shmCommon.c # Funciones comunes de shm
│ └── paramsHandler.c # Parseo de argumentos
├── inc/
│ ├── structures.h # Estructuras de datos
│ ├── gameLogic.h
│ ├── viewRender.h
│ ├── playerAI.h
│ ├── shmState.h
│ ├── shmSync.h
│ ├── shmCommon.h
│ └── paramsHandler.h
├── Makefile
└── README.md
- Se separó el sistema en tres procesos:
master,vistayjugador. - Se usa memoria compartida POSIX para estado y sincronización:
/game_statecontiene tablero, jugadores y estado global./game_synccontiene semáforos.
masterescribe con exclusividad yvista/jugadoresleen con lock de lectura.- Atención round-robin (cirular) para evitar sesgos sistemáticos.
- Como máximo pueden haber 9 jugadores simultáneos.
- El tablero debe tener dimensiones mínimas de 10x10.
- No ejecutar el programa con un delay (-d) mayor a timeout (-t).
- Errores de includes POSIX en LSP/Windows: en algunos entornos aparecian errores por
semaphore.h/unistd.h. Se valido siempre con compilacion real Linux/WSL y contenedor de catedra. - Salida intercalada entre
masteryvista: se ajusto la secuencia final de render y espera para evitar mezclas de impresion. - Bloqueo al cortar con
Ctrl+C: se ajusto el cleanup para no quedar esperando indefinidamente confirmaciones de render cuando hay interrupcion por senal. - Cortes tempranos por timeout: se reviso el orden del chequeo de fin de juego en el loop principal para evaluar timeout despues de intentar procesar el turno actual.
rm -f /dev/shm/game_state /dev/shm/game_sync /dev/shm/sem.*
make cleanEsto elimina las carpetas obj/ y bin/, junto con todos los archivos generados previamente.
- Se utilizaron modelos de IA como asistencia para tareas de refactoreo, revisión de consistencia y detección de funciones/macros/includes no utilizados.
- Toda implementación de IA fue revisada y adaptada manualmente.