Лошадью ходи, век воли не видать

Прим. 1. В статье используются 10-ичные числа, Lua, Node.js, React.js, php, sql и python.

Прим. 2. Все права принадлежат д-ру ДжиПиТи.

3dd7128f7b2f8d380a81e212a20dbbd2.jpg

Три совета

Сами не заметите, как придет ваше 70-летие. И 50 лет из них вы проживете на C-подобном языке. В такой обстановке вам можно будет не бояться конкурентов и открыть нам свои тайны, намайненые от клавиатуры. Я же открываю секреты ПапыБубыДиопа (в основном для разработчиков мобильных игр), которые сделают вас миллионерами.

  1. Правило Папы. Не рассчитывайте на повторение успеха. Успех любой игры случаен и не масштабируется на новые проекты.

  2. Правило Бубы. Не пишите игру для себя. Вы попадете в ловушку — подсядете на игру, сожжете года (!) в игровом угаре. Ну, и интересна она будет лишь похожим на вас фрикам. А таких на Земле не больше дюжины.

  3. Правило Диопа. Не считайте пользователя равным себе. Юзеры тупые, как пробки. Чем проще клики, тем больше аудитория. Не надо (вычеркнуто цензурой) умничать и поднимать интеллектуальный уровень публики.

Тем не менее, правила существуют, чтобы их нарушать. Я нарушил все три и получил игру, которая будет приносить мне 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 тоже много! Смерть в игре приходила слишком долго.

Доска 5 на 5 быстро наскучила.

Доска 5 на 5 быстро наскучила.

Я уменьшил доску до 4 на 4. Отлично! Но через пару часов я снова научился играть. Скучна-а-а! 2^16 теоретически. Уменьшить доску до 3 на 3? Прикольно, но ходы слишком быстро заканчиваются и финальные результаты примерно одинаковые. Тогда я выбросил из доски 4 на 4 угловые клетки и их осталось 12. Как негритят. Класс! Да, я довольно быстро погибал каждые пару минут и наслаждался новыми рекордами и желанием продержаться дольше и дольше.

12 клеток - прекрасный вариант - 2^12 максимальный конь

12 клеток — прекрасный вариант — 2^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-игру, при этом браузер как бы встроен внутри телеграма и вы не испытываете проблем с навигацией — из игры спокойно возвращаетесь в чат и т. д.

Вся эта кухня выглядит в чате примерно так

c65e93cb2166dfec468981e93e7ec736.jpg

Конечно, лучше бы бото-скрипт положить на сервер, чтобы бот работал независимо от вашего макбука. Замечу, что пару раз 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 и анимация очень слабенькая. Знания все таки не хватило, чтобы анимировать все трансформации коней по доске. Результат примерно такой

6083b719dba2375bb5f860aae7e4ee43.jpg

Компонента бонусных сцен на реакте выглядит так

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 (
    
onClose(0)}>
Bg Award Award
{txt}
); }; // 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 пикселей! Я изначально загрузил картинку неправильного размера и жетон был невалидным!

А вот правильная картинка жетона Yoki

А вот правильная картинка жетона Yoki

В Телеграм-боте я добавил в чат возможность юзеру добавить адрес его кошелька — чтобы дарить ему заработанные в процессе игры койны при достижения феноменальных результатов.


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) и все описание почему-то на английском. Какого черта, парни?! Где итальянский? Ио соно итальяно!

Бене и чао, спасибо за внимание.

© Habrahabr.ru