Este repositorio contiene la solución propuesta para la PoC detallada en la consigna.
Para la arquitectura del proyecto se generó una solución "empaquetada" o standalone, es decir que el usuario del juego sólo tiene que instanciar desde el servidor el ComboBreakerGameServer y desde el cliente el ComboBreakerGameClient y ya tendría todo listo para jugar.
Para el protocolo, en principio se planteó una estructura donde hubiera una sola clase GameProtocol, o clases GameProtocolClient y GameProtocolServer que hereden de GameProtocol. Sin embargo no se encontró suficiente funcionalidad compartida para realizar esa implementación, por lo que se mantienen como clases separadas, pero si el scope creciera se podría ir por ese camino.
Instalar pre-commit hooks:
pre-commit installPara crear un commit sin correr los hooks se debe ejecutar:
git commit --no-verifyPara correr cppcheck sin necesidad de un commit se debe ejecutar:
pre-commit run --all-filesCompilación con código as-is:
makeCompilación con código con wrap randomizado de sockets:
make wrapsocks=1Correr tests sin valgrind:
./run_tests.sh ./ casos/ single-client no-valgrind 60 10Correr tests con valgrind:
./run_tests.sh ./ casos/ single-client valgrind 60 10Comparar outputs:
./compare_outputs.sh casos/ salidas/En algunos headers (.h) puntuales se suprimió el warning unusedStructMember de cppcheck. Esta decisión fue tomada porque es un falso positivo, en todos los casos que sucede, es sólo en headers de clases sobre variables privadas que sí se usan dentro del código (en el .cpp).
En particular se usa en los headers de: action_codes, combos, liberror, resolver, resolvererror, socket, game_protocol_client y game_protocol_server, combo_breaker_game_client y combo_breaker_game_server.
Para aplicar las mejoras para la reentrega se hizo un refactor de la lógica de cliente y de servidor, además de la de protocolo y socket.
En la clase Socket se reutilizó código para simplificar la implementación de los métodos para halfwords.
Se pasó lógica que estaba erróneamente colocada en el protolo a las clases ComboBreakerGame. Quedando del lado del servidor un ComboBreakerGameServer y este usando GameProtocolServer, y de manera análoga del lado del cliente con ComboBreakerGameClient y GameProtocolClient.
GPL v2
Se agradece el código proveído por la cátedra para los sockets. Se trabajó sobre ese código y se lo modificó. Código fuente usado bajo licencia GPL v2: https://github.com/eldipa/sockets-en-cpp agradecimiento a @eldipa.

