@XOchatBot - крестики-нолики в Telegram
Привет! Сегодня я хочу рассказать о боте для игры в крестики-нолики в Telegram - @XOchatBot.
О цифрах
На момент написания этой статьи, боту исполнился ровно год, за это время игроками сыграно более 23 млн игр, открытая статистика по аудитории бота опубликована на ботстате, а информация об онлайне в режиме реального времени обновляется на сайте крестиков-ноликов.
Как пришла идея создания бота
Я давно хотел сделать для Telegram какую-нибудь адаптацию настольных игр, например шашки или шахматы. Такие штуки разрабатывать интересно, делать такое "могут не только лишь все", да и игры любят многие - это значит, что аудитория обещает быть большой. Решил начать с простого, в крестиках-ноликах правила полегче, чем у шахмат или шашек, а значит первый продукт в этом жанре от меня будет выпущен быстрее. Так и случилось, но, столкнувшись с ограничениями от Telegram, я решил, что шашки и шахматы я делать не буду.
Ограничения Telegram Bot API
Идея в том, что у Telegram Bot API есть ограничения на частоту вызовов методов. Когда игрок делает ход в "крестиках-ноликах", вызывается сразу несколько методов API: нужно вызвать answerCallbackQuery при нажатии на кнопку, обновить клавиатуру (отобразить сделанный ход) вызовом ещё одного метода (в моём случае это editMessageText), при этом, если игра идёт со случайным соперником в чате с ботом, нужно обновить сразу два сообщения с клавиатурой (игрой) - у одного игрока и у другого. Делать это нужно максимально быстро, иначе играть будет не очень приятно. Когда я только выпустил бота, я довольно быстро столкнулся с тем, что запросы в Telegram не отправляются из-за ошибки 429 (Too Many Requests). Это означало, что бот упёрся в лимиты и дальнейшее расширение аудитории только усугубит ситуацию. Я, как прошаренный ботовод, пошёл в поддержку @BotSupport с просьбой расширить лимиты и вот что из этого получилось:
Проблему решил троттлингом, причём пользователи не замечают его либо совсем, либо от слова "практически". Моё кастомное решение для нивелрования проблемы работает очень хорошо и я, в целом, забыл о проблеме "Too Many Requests". Возвращаясь к тому, почему я не стал делать шашки или шахматы, представьте, что на каждый ход пользователю нужно делать два клика, а не один, как в крестиках-ноликах. Это, как минимум, удавивает количество запросов, которые нужно отправлять в Telegram, а любое промедление сделает игру неиграбельной, троттлинг не будет таким незаметным. С другой стороны, правила в этих играх сложнее, поэтому играющей аудитории там априори будет меньше, но желание делать таких ботов у меня, тем не менее, пропало на неопределённое время.
Функциональность бота
- В боте доступны несколько вариантов полей: классическое 3x3 (3 в ряд), 5x5 (4 в ряд), 8x8 и 8x10 (5 в ряд).
- Бот позволяет играть со случайными соперниками: игроки нажимают соответствующую кнопку в меню бота и матчатся с оппонентами.
- Можно играть с любыми контактами в Telegram: пользователь нажимает "Играть с другом", выбирает чат, затем начинается игра.
- Игра в групповых чатах: пользователи могут добавлять бота в группу, чтобы соревноваться с другими участниками чата.
- Несколько видов топов: стандартный, рейтинговый и Олимпиада. Олимпиада - это топ, который формируется из сильнейших игроков за последние 30 дней.
- Доступны PREMIUM возможности: можно отключать рекламу и выбирать скины для своих фигурок за единоразовое пожертвование (на текущий момент это всего 59 рублей).
Как я пришёл к тому, чтобы сделать отдельное кроссплатформенное приложение с крестиками-ноликами
Сразу как я выпустил бота с крестиками-ноликами, он стремительно начал набирать популярность: пользователи вызывали друг друга на дуэли в личных сообщениях, добавляли бота в группы, делились своими достижениями друг с другом. Многие наигрывали тысячи и десятки тысяч матчей, самый преданный своему делу игрок наиграл чуть более 53k игр. С ростом популярности всё сильнее проявлялся запрос на большие поля, например 10x10 и 15x15. Если с некоторыми ограничениями Telegram Bot API я смог справиться (например ограничение на количество вызовов методов API), то с ограничением на размер поля ничего поделать нельзя. В Telegram я могу сделать поле не шире, чем 8 клеточек в ряд.
Всего за 111 дней я разработал отдельное приложение с крестиками-ноликами для популярных платформ, оно доступно в Google Play, AppStore и Microsoft Store (полный список на сайте). Оно пока не имеет таких же успехов как версия в Telegram, там пока сильно меньше игроков и слишком строгий дизайн. В ближайшие несколько месяцев я реализую возможность игрокам из приложения матчится с игроками в Telegram на доступных и там и там полях (3x3 и 5x5), а также попытаюсь сделать оформление приложения более привлекательным, хотелось бы сбацать что-нибудь расслабляющее и чтобы интерфейс был более интерактивным (как, например, в Hearthstone).