Это репозиторий с базовой реализацией навыка для Алисы в рамках конкурса Яндекса на PyCon Russia 2018 22-23 июля.
Чтобы участвовать в конкурсе, нужно реализовать алгоритм игры в морской бой и задеплоить навык на хостинге Now. Подробнее написано в твоём тикете в Яндекс.Трекере.
Просто форкни этот репозиторий и допиши в него нужный код.
Следи за обновлениями в этом репозитории. Пока идет конкурс, мы может быть будем что-то править, и это будет тебе полезно.
Ознакомься с общей документацией для разработчиков навыков.
Этот код – это полноценная реализация навыка для Алисы. Мы взяли за основу хорошую библиотеку rasa_nlu. Для неё мы подобрали data set, на основе которого собирается модель для распознования ходов соперника. Мы также сделали небольшое Flask приложение, которое разбирает HTTP протокол запросов от Яндекс.Диалогов, и Telegram бота для отладки.
В seabattle/
:
api.py
– Flask приложение с webhook'ом для Яндекс.Диалоговbot.py
– Telegram бот для тестирования навыкаdialog_manager.py
– диалоговый менеджер на базеrasa_nlu
game.py
– реализация логики игры в морской бой
Мы очень не рекомендуем существенно что-то менять за пределами оговоренных ниже методов класса Game
в seabattle/game.py
.
Мы проработали и отладили все нужные реплики, которые говорит и обрабатывает навык для игры. Если их поменять, то может не получится игра на турнире.
- Игровое поле 10 на 10 клеток.
- Стандарные 10 кораблей:
- 1 четырёхпалубный
- 2 трёхпалубных
- 3 двухпалубных
- 4 однопалубных
- Координаты используются только числовые. Из-за особенностей ASR так получается надежнее и проще. Буквенные координаты тоже реализованы, но их использование очень ненадежно.
- Корабли нельзя расставлять вплотную друг к другу.
Прочти более подробно про игру на Wikipedia.
Для работы с этим репозиторием тебе нужно только иметь Docker и docker-compose. Ну и уметь пользоваться ими хотя бы чуть-чуть.
Тебе нужно реализовать по сути один метод в модуле seabattle/game.py
который называет Game.do_shot
.
Опционально можешь попробовать сгенерировать игровое поле более хитро, для этого тебе нужно написать другую реализацию для метода Game.generate_field
.
Для того чтобы навык работал, нужно натренировать nlu молдель rasa. Это делается вызовом команды docker-compose run train
Чтобы протестировать твой навык нужно сделать несколько шагов:
- Прогнать тесты, запустив
docker-compose run train
, а затемdocker-compose run tests
. Ты можешь написать дополнительные тесты именно своего алгоритма. И лучше так сделать. Если тесты проходят, то это хороший знак – скорее всего ты ничего не поломал, и твоя реализация вполне может играть на турнире. - Поднять Telegram бота. Для этого нужно зарегистривать бота и получить его токен. Потом положить токен в переменную окружения
TELEGRAM_TOKEN
и запуститьdocker-compose run bot
. После этого с твоим ботом в Telegram можно поиграть в твою реализацию морского боя. Проверь, что твой алгоритм игры работает правильно. - Задеплоить навык на хостинге Now (см. ниже) и зарегистрировать его в Яндекс.Диалогах. Не нужно отправлять навык на модерацию. Просто в режиме тестирования ещё раз попробуй поиграть со своей реализацией.
Если ты прошел эти три пункта и всё хорошо, то можешь присылать ссылки на код и на задеплоенный навык в свой тикет, а потом закрыть его.
Для простоты и удобства навык нужно задеплоить на хостинг Now. После деплоя лучше всего присвоить какой-нибудь алиас домену, и использовать его дальше при обновлениях.
Лучше всего сделать файлик now.json и в нем написать имя приложения и его алиас, тогда для деплоя будет достаточно позвать команду now && now alias
.
Примерная последовательность действий:
docker-compose build app
docker-compose run train
docker-compose run tests
now && now alias
Если что-то непонятно, то задавай нам вопросы в Slack