Требуется разработать программу, реализующую игру в блэкджек с использованием порождающих паттернов проектирования.
Требования:
- Использовать enum классы где нужно
- Использовать interface'ы где нужно
- Использовать abstract классы где нужно
- Игроки
Player
могут присоединяться к игреBlackjackGame
, выбирать размер ставки и играть в игру - Карты
Card
раздает отдельная сущностьDealer
, для этого он принимает колодуDeck
, перемешивает её и возвращает по одному - Нужно реализовать несколько реализаций перемешивания
ShuffleAlgorithm
: "без перемешивания", "рандомную", "perfect shuffle" - Должны быть реализованы правила блэкджека: игроки получают две карты, дилер получает одну карту; игроки могут брать дополнительные карты, пока не наберут более 21 очка; дилер должен брать карты, пока не наберет 17 очков или больше; при сумме очков более 21 игрок проигрывает, при сумме очков более 17, но меньше 21, дилер останавливается и происходит сравнение очков.
- Должна быть реализована логика ставок: при выигрыше игрок получает в два раза больше своей ставки, при проигрыше ставка снимается
- При ничьих по очкам ставка игрока возвращается
- При наборе 21 очка игроком он автоматически выигрывает, вне зависимости от количества очков дилера
- Для сбора ставок и вознаграждений реализовать сущность
Bank
, который оперирует сущностьюBankAccount
- Постарайтесь чтобы абстракции не утекали, а связт были логичными. Например:
Bank
оперируетBankAccount
, а неPlayer
, но при этом у каждого игрока есть счет в банкеBlackjackGame
ничего не знает про банк, он знает кто играет и кто выиграл. Поэтому должен быть верхний классBlackjackCasino
, который порождаетBlackjackGame
для игроков, и раздает выигрыш с помощьюBank
- По необходимости используйте List (ArrayList, LinkedList), Map (HashMap, LinkedHashMap), Set (HashSet)
Требования к проверке:
- Необходимо реализовать тесты, чтобы убедиться в корректности работы программы.
- Код должен быть написан с использованием принципов объектно-ориентированного программирования, в том числе SOLID, DRY, KISS
- Для реализации могут использоваться следующие паттерны:
- Адаптер (Adapter)
- Мост (Bridge)
- Декоратор (Decorator)
- Фасад (Facade)
- Заместитель (Proxy)