Прим. 1. В статье используются 10-ичные числа, Lua, Node.js, React.js, php, sql и python.
Прим. 2. Все права принадлежат д-ру Сами не заметите, как придет ваше 70-летие. И 50 лет из них вы проживете на C-подобном языке. В такой обстановке вам можно будет не бояться конкурентов и открыть нам свои тайны, намайненые от клавиатуры. Я же открываю секреты Я уменьшил доску до 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 приведен). Смысл реактивного кода в том, что вы обзываете некоторые переменные реактивными — то есть при любом их дальнейшем изменении 
В Телеграм-боте я добавил в чат возможность юзеру добавить адрес его кошелька — чтобы дарить ему заработанные в процессе игры койны при достижения феноменальных результатов.
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/
Добавить комментарий