Мої уваги:
1) Пакети варто називати lowercase (Java Naming Convention):
"Package names are written in all lower case to avoid conflict with the names of classes or interfaces."
https://docs.oracle.com/javase/tutorial … gpkgs.html
2) Чому в мейні не можна було просто new Game(...).exec()? KISS
3) Не варто створювати інтерфейси для класів, які в 100% будуть мати лише 1 імплементацію. Це не дає ніякого профіту лише додає код. Це як interface HumanInterface -> class Human extends HumanInterface? KISS
4) Не використовуйте "Interface", "I", "A" і інше
https://stackoverflow.com/a/2814831
5) Зберігайте назву інтерфейсу/класу що імплементується/розширюється в назві за можливістю, легше орієнтуватися. Тобто побачивши MistakesTrack Ви радше будете очікувати implements/extends Track ніж Round.
6) Не ініціялізуйте об'єкти так, як це зроблено в мейні. Можна ж аргументи сконструювати в окремих лінях? Читати неможливо.
7) Не використовуйте генеричні назви для методів/класів, де їх наявність не визначає на 100% їх інтенцію. Тобто RoundInterface#handle мені особисто нічого не каже і чому він хендлить якийсь інший пазл з стрімом.
Нарешті 0) Порівняйте кількість Вашого коду і в оригіналі (<100LOC vs >800LOC). Вийшов overengineering. KISS.
А взагалі, код як код. Є речі які я б зробив інакше, але радше через суб'єктивні причини.