Blackjack - одна из самых популярных карточных игр в казино с простыми правилами и механикой игры. В этом проекте реализован клиент с графическим интерфейсом, созданным с помощью библиотеки Swing, и серверная часть. Клиент и сервер взаимодействуют через вымышленный протокол Blackjack, работающий поверх UDP.
Ставки в данной реализации остутствуют, игроки играют на интерес, пока есть место за столом.
- Разработать основные дата модели (карта, номинал карты, масть, рука, игрок, дилер).
- Разработать сервис выдачи карт, который будет просто выдавать карту из колоды, сервис игры с запуском и окончанием раунда, сервис с логикой возможных действий игрока (hit и stand), а также сервис уведомления о состоянии текущей игры.
- Разработать протокол Blackjack поверх UDP.
- Протокол UDP это протокол без установки соединения. Сервер всегда открывает фиксированный порт 2121, чтобы его можно было найти броадкастом.
- Для приёма сообщений от дилера, игроки открывают любой свободный порт. В первом сообщении они должны сообщить его серверу. Через этот порт они будут принимать всё происходящее за столом от дилера. Дилер отвечает за рассылку всего, что происходит за столом всем игрокам.
- Разработать модель, алгоритм игры (поиск стола). Всё, как в DHCP, когда клиент хочет найти сервер (в нашем случае игрок ищет свободный стол).
- Разработать сервер (дилер) и клиент (игрок) части протокола Blackjack, которые можно будет включить в приложения.
- Разработать приложения (две запускаемые программы) сервера (дилер) и клиента (игрок). Действия дилера будут работать в автоматическом режиме.
- Графический интерфейс пользователя (GUI), реализованный с помощью Swing, который позволяет игрокам взаимодействовать с игрой.
- Реализовать отображение результатов после каждого раунда.
- У игроков должна быть возможность подтверждать начало следующего раунда.
- Реализовать стратегию для демо-режима — алгоритм, который будет демонстрировать наиболее вероятные действия игрока-профессионала.
- Java 21
- Gradle
- Lombok
- JUnit
- Mockito
- GameState - состояние текущего раунда. Включает в себя дилера, список игроков и статус игры.
- GameStatus - статус игры (идет раунд или раунд окончен).
- Dealer - сущность дилера. Имеет колоду и текущий статус.
- Player - сущность игрока. Содержит айди игрока, колоду и свой текущий статус.
- DealerStatus - статус дилера.
- PlayerStatus - статус игрока.
- Hand - колода. Состоит из списка карт.
- Suit - масть карты.
- Rank - номинал карты.
После подключения к свободному столу все игроки должны подтвердить начало раунда. Это подтверждение проводится перед началом каждого раунда.
В каждом раунде вам и дилеру будут розданы по две карты, одна из карт дилера будет закрыта.
После раздачи карт игроки смогут выполнять следующие действия:
- Hit (взять карту). Запрашивать новую карту можно, пока не получите перебор (>21).
- Stand (остановиться): завершить свой ход.
После действий всех игроков ход совершает дилер. Дилер откроет свою закрытую карту и будет действовать по следующим правилам:
- Если значение его руки меньше 17, дилер берет карту.
- Если значение 17 или выше, дилер останавливается.
- Если у дилера выпал блэкджэк, то проигрывают все игроки без блэкджэка.
- Дилер перебрал - побеждают все игроки.
- Сумма набранных очков больше 21 - перебор карт (bust).
- Сумма очков как у дилера - состояние stand.
- Сумма очков больше, чем у дилера - победа (при этом количество очков <= 21).
- Сумма очков меньше, чем у дилера - проигрыш (если у дилера нет состояния bust).
Карт в колоде 52 (от 2 до 10, валет, дама, король, туз). Значения очков каждой карты:
- От двойки до десятки — от 2 до 10 соответственно.
- Туз: может быть 1 или 11 (11 пока общая сумма не превышает 21, иначе 1).
- Картинки (J (валет), Q (дама) и K (король)): все имеют значение 10.
Для запуска проекта выполните следующие шаги:
- Клонируйте репозиторий:
git clone https://study-git.eltex-co.ru/eltex_team/java_team/2024-1-blackjack.git
- Перейдите в директорию проекта:
cd 2024-1-blackjack
- Соберите проект с помощью Gradle:
./gradlew build
- Запустите сервер:
java -jar build/libs/server.jar
- Запустите клиент (по умолчанию сервер будет ждать двух клиентов):
java -jar build/libs/client.jar