Прим. 1. В статье используются 10-ичные числа, Lua, Node.js, React.js, php, sql и python.
Прим. 2. Все права принадлежат д-ру ДжиПиТи.
Три совета
Сами не заметите, как придет ваше 70-летие. И 50 лет из них вы проживете на C-подобном языке. В такой обстановке вам можно будет не бояться конкурентов и открыть нам свои тайны, намайненые от клавиатуры. Я же открываю секреты ПапыБубыДиопа (в основном для разработчиков мобильных игр), которые сделают вас миллионерами.
Правило Папы. Не рассчитывайте на повторение успеха. Успех любой игры случаен и не масштабируется на новые проекты.
Правило Бубы. Не пишите игру для себя. Вы попадете в ловушку - подсядете на игру, сожжете года(!) в игровом угаре. Ну, и интересна она будет лишь похожим на вас фрикам. А таких на Земле не больше дюжины.
Правило Диопа. Не считайте пользователя равным себе. Юзеры тупые, как пробки. Чем проще клики, тем больше аудитория. Не надо (вычеркнуто цензурой) умничать и поднимать интеллектуальный уровень публики.
Тем не менее, правила существуют, чтобы их нарушать. Я нарушил все три и получил игру, которая будет приносить мне 100 долларов день до конца жизни. Пардон! ошибся! Она и после смерти будет приносить валюту. Если наследники будут послушны - открою им пароли к AdMob и AppStore.
Вперед, читатель! Слегка погрузимся в код и умные слова, которые я сам не очень понимаю. Потому не мучайте меня сложными комментариями. Бытовые вопросы с удовольствием перетрем.
Идея
Сначала было слово и слово было конь. Кто не знал (я не знал), у англосаксов шахматный конь совсем не Horse, а вовсе даже Knight. Ходит Knight не буквой Г, а буквой L. Коня мы гоняли в школе. Помните головоломку - обойди ходом коня всю шахматную доску размера 10 на 10. На каждую клетку можно заходить только 1 раз. Игру из такой головоломки не сделать - после прохождения всех клеток умникам становится скучно. Эх, совместить бы эту забаву с игрой типа 2048? Идея следующая. Есть доска и на ней несколько коней толщины 1. Любой конь может ходить буквой Г на любую свободную клетку. А также на клетки, где стоят кони такой же толщины. Два одинаковых коня превращаются в нового скакуна в два раза толще. После очередного хода сверху падает парочка новых тощих коней. Нормальная так вроде забава получается? Для проверки идей я использую язык Lua и движок Corona SDK. Любая казуалка пишется тут за пару часов.
Смотрите, всего 4 строчки кода для озвучки движения и рисования коня с поворотом.
local soundBomb = audio.loadSound( “Sounds/bomb.mp3” )
audio.play( soundBomb )
local horse = display.newImageRect( “Assets/horse_”..c..”.png”, w, w )
horse.rotation = 35
-- kQB_Df8610s7-pqA3OcCD6EXK5SESnecm0oWWqKPYW82K5Zf -- мой ТОН кошелек, если чо
Обожаю Lua и Corona SDK за простоту и не строгую типизированность. В первой версии игры я сделал доску 6 на 6 клеток (у меня плохое зрения и разбитые хоккеем пальцы, потому мельче я не вижу и не могу тыкать в экран). Получилось классно! Но скучно. Долго играть. Теоретически можно майнить коней до 2^36. Я уменьшил доску до размера 5 на 5 клеток. Стало веселее, но в течении дня я обучился не погибать и снова стало скучно. 2^25 тоже много! Смерть в игре приходила слишком долго.
Я уменьшил доску до 4 на 4. Отлично! Но через пару часов я снова научился играть. Скучна-а-а! 2^16 теоретически. Уменьшить доску до 3 на 3? Прикольно, но ходы слишком быстро заканчиваются и финальные результаты примерно одинаковые. Тогда я выбросил из доски 4 на 4 угловые клетки и их осталось 12. Как негритят. Класс! Да, я довольно быстро погибал каждые пару минут и наслаждался новыми рекордами и желанием продержаться дольше и дольше.
Параллельно я проверил эту идею с ладьями и слонами. Интересные игры получились - но быстро находишь оптимальную стратегию и как в 2048 легко достигаешь максимального результата. Слонов я вам еще припомню. А вот с конями совсем другое дело! Очень сложно, мозги кипят, проигрываешь, короче, настоящий спорт, типа Деберца или Преферанса.
Телеграм Бот
Как заработать на игре? Где распространять? В каком виде? Apple меня забанил навечно. Google скорее всего тоже навечно (спасибо сами-знаете-кому). Web? Украдут. Telegram? Ой? А что? Там своя эко-система, своя валюта, своя крипта, мало того, если понравитесь хозяину, вы обеспечены до конца месяца/года/жизни. Я завел телеграм-бота @PapaBubaBot и привязанную к боту игру Knights. Процесс регистрации бота и игры настолько прост, что даже мне стыдно писать вам тут инструкцию. Просто не забудьте сделать правильную гифку с процессом игры размером 640 на 360. А вот мучения с ботом опишу. Для того, чтобы ваш бот работал - то есть реагировал на действия юзера- вам нужно создать скрипт, который будет отвечать за базар. Сначала я написал его на Node.js и запустил его на своем Mac-е. Это неудобно, если Mac Book выключился - бот перестает работать.
const gameShortName = 'Knights'
const gameUrl = 'https://bashurov.net/2knights/'
const token = 'ПапаБубаИдиот'; // Replace with your own bot token
const markup = Markup.inlineKeyboard([Markup.button.game('Knights'),])
const bot = new Telegraf(token)
// kQB_Df8610s7-pqA3OcCD6EXK5SESnecm0oWWqKPYW82K5Zf - мой кошелек, если чо
bot.command("user", async ctx => {
const id = ctx.from.id;
const user = ctx.from.username;
const result = gameUrl + '?id=' + id;
ctx.reply(result)
});
bot.start((ctx) => ctx.reply("Type /play to play"))
bot.command('play', (ctx) => ctx.replyWithGame(gameShortName, markup))
bot.gameQuery((ctx) => {
const id = ctx.from.id;
const user = ctx.from.username;
const result = gameUrl + '?id=' + id;
ctx.answerGameQuery(result)
})
bot.launch()
Код довольно необычный, бот не может сразу запустить вашу игру. Во-первых, вы в своем скрипте должны послать в ответ на любую команду юзера ссылку на телеграм-игру (можно с кнопкой - используйте разметку Markup для кнопок), а затем при нажатии на кнопку, вы обрабатываете ответ и привязываете к нему URL, где находится ваша веб-игра. После этого пользователь жмет финальную ссылку и запускает в телеграме web-игру, при этом браузер как бы встроен внутри телеграма и вы не испытываете проблем с навигацией - из игры спокойно возвращаетесь в чат и т. д.
Вся эта кухня выглядит в чате примерно так
Конечно, лучше бы бото-скрипт положить на сервер, чтобы бот работал независимо от вашего макбука. Замечу, что пару раз Node.js зависал на локальной машине и его приходилось перезапускать. Я принял решение - перехожу на удаленный сервер. Поскольку я пользуюсь хостингом Hostinger, то не обладаю правом запускать Node.js на своей площадке. Node.js можно запустить и на Hostinger-е, однако подобный сервис требует 4 бакса в месяц. Я же жмот. Жмоты выбирают php. Есть варианты с Go и python-ом, но там тоже за баксы. PHP - дешманский вариант для нищебродов. И, скажу честно, прекрасный вариант. Пишете код и отдаете команду которая вешает php-скрипт как WebHook для общения с ботом:
https://api.telegram.org/botkQB_Df8610s7-pqA3OcCD6EXK5SESnecm0oWWqKPYW82K5Zf/setWebhook?url=https://bashurov.com/telegram/papa_bot.php
Между прочим, в ваш бот-скрипт легко вставить любое чат-джи-пи-ти API и продавать это решение ламерам и любителям импортозамещения, как будто вами собственно написанный искусственный интеллект в телеграм боте.
Вот как выглядит на пхп простой текстовый ответ в телеграм бот.
function sendMessage($chatId, $text) {
global $apiUrl;
$params = [
'chat_id' => $chatId,
'text' => $text
];
file_get_contents($apiUrl . "sendMessage?" . http_build_query($params));
}
// kQB_Df8610s7-pqA3OcCD6EXK5SESnecm0oWWqKPYW82K5Zf - мой ТОН кошелек, если чо
Я сделал sql таблицы для хранения списка пользователей и лучших результатов. Телеграм дает вам уникальное id пользователя и по этому id вы получаете имя-фамилию и прочие публичные данные игрока. Очень удобно.
Веб-игра
Для написания игры я по глупости решил выучить React.js - реактивный JavaScript. Пришлось попотеть пару дней и игра была сделана. Дизайн не такой жирный, как в Lua и анимация очень слабенькая. Знания все таки не хватило, чтобы анимировать все трансформации коней по доске. Результат примерно такой
Компонента бонусных сцен на реакте выглядит так
import React from 'react';
import './Award.css'; // Assuming you have some styles for the popup
const Award = ({ award, onClose }) => {
const bg = `${process.env.PUBLIC_URL}/assets/bg.png`;
const image = `${process.env.PUBLIC_URL}/assets/p_${award}.png`;
console.log("award image", image)
var txt = "Ups..."
switch(award) {
case 1:
txt = "Верной дорогой идете товарищ!";
break;
case 2:
txt = "Ого! Так вы выиграете 1 ТОН";
break;
case 3:
txt = "Браво, еще чуть-чуть и ТОН ваш";
break;
default:
break;
}
return (
<div className="popup-overlay" onClick={() => onClose(0)}>
<div className="popup-content">
<div className="image-container">
<img src={bg} alt="Bg Award" />
<img src={image} alt="Award" className="img-overlay"/>
<div className="text-overlay">{txt}</div>
</div>
</div>
</div>
);
};
// kQB_Df8610s7-pqA3OcCD6EXK5SESnecm0oWWqKPYW82K5Zf - мой кошелек, если чо
Весь проект состоит из подобных компонентов (пример компоненты Award приведен). Смысл реактивного кода в том, что вы обзываете некоторые переменные реактивными - то есть при любом их дальнейшем изменении HTML страничка перерисовывается. Очень клево.
Однако, как я уже говорил, автор неимоверно глуп. Мне вовсе не было необходимым учить реакт! Замечательная Corona SDK компилирует Lua-проекты не только в iOS, Android и прочие платформы. Она делает и HTML5. Единственное усилие от вас: чтобы адаптировать Lua-проект в телеграм-игру - нужно написать переходник от Lua к JS. Зачем? А чтобы вытащить из URL-а id телеграм-юзера. Если кому нужен переходник - спрашивайте в комментах, это 2 файла по 5 строк. Один на Lua, другой на скрипте. Это уж больно специфичная информация, даже для читателей Хабра.
Монетизация
В Телеграме есть своя валюта ТОН. Для отладки я купил 40 ТОН-ов за 100 баксов. Пару ТОН-ов ушло на создание собственной крипты, активации кошельков и передачи валюты внутри игры другим юзерам. Но в баксах я не потерял. За это время ТОН вырос в цене с 2.5 до 7 баксов и мои 100 баксов превратились в 250. Надо было купить 4000 ТОН-ов! И тогда 10 000 баксов превратились в 25 000! А еще не надо было тратить свой биткойн в 2016!! Спокойней, Ипполит, спокойнее. Итак, сообщаю вам свой ТОН-кошелек - вдруг кому-то понравилась моя статья))
Пришлось освоить еще один язык - язык смарт-контрактов ТОН. Для простой монетизации это необязательно, есть куча сервисов для создания ТОН-кошельков, покупки ТОН-ов и создания своей крипты на основе ТОН (называются Jetton). Крипте даете имя и картинку размера 256 на 256 пикселей! Я изначально загрузил картинку неправильного размера и жетон был невалидным!
В Телеграм-боте я добавил в чат возможность юзеру добавить адрес его кошелька - чтобы дарить ему заработанные в процессе игры койны при достижения феноменальных результатов.
case (preg_match('/^[A-Za-z0-9_-]{48}$/', $text) ? true : false):
$wallet_address = $text;
if (validateWalletAddress($wallet_address)) {
saveWalletAddress($userId, $wallet_address);
sendMessage($chatId, "Thank you! Your wallet address has been saved.".$wallet_address);
} else {
sendMessage($chatId, "Invalid wallet address. Please check and provide a correct TON wallet address.".$wallet_address);
}
break;
Адреса кошельков храню в таблице. Для начала я решил, что тот, кто в процессе игры получит больше 2024 очков - тому дарю жетон. Задача казалась невероятно сложной. Средний юзер погибал, не набрав и 200 очков. Я, как профессионал, с трудом набирал 1000. Однако, помните вариант этой игры со слонами? Погоняв слонов - я понял как гонять коней. И пошло-поехало. Я набрал 2000 очков. 5000. Затем 10000. И достиг предела в 40000. Играл часов 8, авто-сохранение рулит. Сохранение сделал через эскуэль таблицу, привязывающую текущую доску с конями к ай-ди юзера. Это делать необходимо, потому что пользователь может отвлекаться во время игры, отвечать на сообщения и вообще случайно нажать кнопку Назад.
Эпилог
Тем не менее, считаю, что игра получилась классная. Многим не заходит из-за сложности - но шахматисты на нее просто молятся. Многие требуют вернуть доску 4 на 4 и даже 5 на 5. Но я суров как Трор, сын Трейна. Публикацию объявляю авторским копирайтом на идею игры. На всякий случай.
Про Telegram. Рекомендую, переходите в разработку приложений сюда, пробуйте свои идеи на этом рынке, дело выглядит перспективным. Телеграм не зависит от аппсторов, не банит, развивается и имеет довольно обширное сообщество разработчиков и неплохую документацию. Ну да, полно ошибок (например я так и не смог полноценно пользоваться get/set/GameHiScores) и все описание почему-то на английском. Какого черта, парни?! Где итальянский? Ио соно итальяно!
Бене и чао, спасибо за внимание.
Комментарии (11)
printf
13.06.2024 10:47+2Игра крутая.
Этот комментарий я объявляю протоколом о намерении ее украсть. На всякий случай.
EvilSpirits
13.06.2024 10:47Задача казалась невероятно сложной.
Пишется бот и ... все ТОНы заканчиваются.
Можно добавить игру против реального соперника(ов)? т.е. добавится ещё необходимость думать как своему другу "помочь"
PapaBubaDiop Автор
13.06.2024 10:47Пишется бот - ну-ну. Что-то даже для тупых кликеров боты не работают)
А вот онлайн версию с соперником я не осилю. Вебсокетов ненавижу. Честно говоря, и так игра сложная.ПыСЫ. Я переоценил Хабр. Никто даже 100 очков не набрал, какие там ТОН-ы. Где умники, где выпускники мех-матов? Какая нынче аудитория? Все сбежали? Или пишут тотализаторы к ЧЕ?
Politura
13.06.2024 10:47Никто даже 100 очков не набрал
Так в статье нет ссылок на игру, только эта захардкожена в исходниках: https://bashurov.net/2knights/ но по этой ссылке всегда открывается один и тот-же расклад на 220 очков и с парой возможных ходов.
PapaBubaDiop Автор
13.06.2024 10:47Это телеграм бот) И статья про создание бота с игрой. @PapaBubaBot
varton86
13.06.2024 10:47+3В help написано, что ТОН дается за 1024 баллов, а в game over, что за 2024)
p.s.
Кстати, почему help на английском, где итальянский?))
gsaw
Про экономику не понял. Можно поподробнее? Ну то, что монетки за ачивки даешь, я понял. Потом юзер может поменять их на ТОН-ы я тоже понимаю. А как в обратную сторону? Что бы играть надо покупать у тебя монетки?
PapaBubaDiop Автор
Так задумывалось. Но автоматизировать этот процесс я на ПХП не смог. Хороший человек (кажется Роман Зайцев) пишет подобную библиотеку, но пока для моего случая она не работает. Подожду. Мне под игру дали грант)) Так что юзеры пока развлекаются бесплатно.