Вы работаете в компании, занимающейся разработкой игр. В качестве первого задания вы должны написать игру под названием "Блэк Джек" (21), а также предложить описание (без кода) второго, альтернативного способа решения данной задачи.
Блэкджек - это классическая карточная игра, также известная как "Двадцать одно". Цель игры - набрать как можно большее количество очков до 21.
Распределение очков: карты с цифрами стоят от 2 до 10 очков; карты с фигурами (валеты, короли и дамы) стоят 10 очков; тузы стоят 11 очков, если нет перебора, и 1 очко, в противном случае.
- Компьютер должен выступать в роли крупье (противника).
- Банк игрока должен быть равен 5000.
- Первая карта крупье должна быть скрыта от игрока (т.е. лежать на столе лицом вверх), остальные открыты.
- После раздачи игрок может увеличить свою ставку только один раз.
- После того, как игрок набрал необходимое количество очков и больше не запрашивает карты, крупье должен запрашивать карты до тех пор, пока общее количество очков не превысит 16.
- Подсчет очков: цифровые карты - от 2 до 10 очков, фигурные карты (валеты, короли и королевы) - 10 очков, тузы - 11 очков, если нет перебора, и 1 очко, в противном случае.
- Приложение должно функционировать в
ОС Unix
иОС Windows
. - Рекомендуемая версия
Python: 3.10
+
- Для сокращения срока разработки не нужно использовать асинхронное программирование (Async IO).
- У классов, их полей и методов должны быть простые и понятные имена, отражающие их суть. Также рекомендуется придерживаться PEP8 при разработке;
- Для упрощения разработки модули журналирования (логи) и модуль передачи сообщений разрабатывать не нужно;
- Рекомендуемые модули Python:
colorama
;
Приложение не обязательно должно быть консольным. Данный модуль, является рекомендованным. Сложность и оригинальность сполнения пойдет в плюс. Окончательный выбор используемых модулей остается за разработчиком.
- Описание предоставляется в виде текстового файла
В ходе проделанной работы были написаны две (сервер и клиент) программы на языке Python
, с использованием следующих библиотек:
- uvicorn[standart]
- fastapi
- python-dotenv
- websockets
- colorlog
- httpx
- anyio
- pytest
- coverage
Для работы приложения-клиента требуется библиотека websockets Для работы сервер требуются все библиотеки, описанные выше
Для локальной установки и запуска проекта вам потребуется наличие python3.10 и выше некоторых зависимостей
Рекомендуется любая debian-подобная операционная система. Разработки и ручные тесты работы сервера проводились на данной конфигурации:
(Venv) yunikeil@lekinu3600:~/python/BjkOlmp$ uname -a
Linux lekinu3600 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 GNU/Linux
(Venv) yunikeil@lekinu3600:~/python/BjkOlmp$
- Установите wsl, прописав данную команду:
wsl --install
, (необязательный шаг), подробнее можно почитать тут - Создайте виртуальное окружение командой
python3.10 -m venv Venv
- Активируйте окружение linux/windows:
source /Venv/bin/activate
/.\Venv\Scripts\Activate.ps1
- Установите зависимости:
pip install -r requirements.txt
- Запустите
python3.10 src/main.py
🎉
После запуска сервера можете запустить клиент из той же директории командой python src/__public/clients/ws_python.py
Вы также можете запустить тесты командой bash scripts/tests.sh
В операционных системах семейства windows гарантированно работать будет только клиент.
Для запуска клиента требуется PowerShell, тесты проводились на PowerShell 7.4.1
Для консольного обращения к серверу, за скачиванием клиента может потребоваться wget, установить его можно данной командой: winget install wget
Однако корректная работа консольного "мини-сайта" гарантируется только на linux. По этим причинам запускать лучше вручную через команды приведённые выше
В клиенте вы также можете указать базовый url на адрес wss://bjk.yunikeil.ru
и поиграть с устройств в разных сетях, данный домен будет доступен в течении месяца с даты предоставления данной работы. Для обновления DNS записей может потребоваться до суток, со дня предоставления работы, если после восьми часов не появилось доступа к домену рекомендуется установить DNS сервера от Google: 8.8.8.8
, 8.8.4.4
.
В случае если вы используете линукс для установки клиента можете просто ввести команду
wget http://localhost:8000/inst.sh && bash inst.sh
В альтернативном решении можно было бы:
- уделить больше времени отрисовке контента на клиенте, используй библиотеку curses или windows-curses
- уделить больше времени документации проекта
- уделить больше времени тестам проекта
- заменить консольный клиент на графический
- добавить больше классических правил, вроде страхования при тузе у диллера
- добавить сохранение настроек пользователей
- добавить авторизацию/регистрацию
- добавить валидацию данных и проверки на сервер