Лошадью ходи

от автора

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

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

Три совета

Сами не заметите, как придет ваше 70-летие. И 50 лет из них вы проживете на C-подобном языке. В такой обстановке вам можно будет не бояться конкурентов и открыть нам свои тайны, намайненые от клавиатуры. Я же открываю секреты Доска 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-игру, при этом браузер как бы встроен внутри телеграма и вы не испытываете проблем с навигацией — из игры спокойно возвращаетесь в чат и т. д.

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

Конечно, лучше бы бото-скрипт положить на сервер, чтобы бот работал независимо от вашего макбука. Замечу, что пару раз 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 приведен). Смысл реактивного кода в том, что вы обзываете некоторые переменные реактивными — то есть при любом их дальнейшем изменении А вот правильная картинка жетона 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) и все описание почему-то на английском. Какого черта, парни?! Где итальянский? Ио соно итальяно!

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


ссылка на оригинал статьи https://habr.com/ru/articles/821355/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *