Dimosha |
Дата: Вторник, 24.10.2017, 11:13 | Сообщение # 1
|
Новичок
Сообщений: 15
Статус: Offline
|
Предыдущие уроки: #1 Введение
Всем привет.
Сегодня мы поверхностно пройдёмся по языку Lua, его некоторым возможностям, а так же запуске наших сценариев в RakBot. Lua - скриптовый язык программирования, предназначен для быстрой обработки данных. С помощью данного языка многие разработчики создают искусственный интелект в играх, пишут алгоритмы генерации уровней, а так же он используется для разработки ресурсов/игровых модов в Multi Theft Auto: San Andreas (аналог SA:MP). На самом деле, это простейший язык и с помощью него мы будем учиться писать собственную логику для ботов, которую будет использовать RakBot.
Пройдёмся по основам программирования, с которыми нам предстоит работать.
Обратите внимание: данная статья будет урезана в плане языка Lua, так как в RakBot используется лишь небольшая её часть. Многие возможности Lua попросту отсустствуют в RakBot, поэтому я буду ориентироваться на версию из RakBot.
Есть традиция у всех авторов книг и документаций различных языков, это первая программа, которая печатает "Hello World". Чтож, давайте попробуем написать её, но уже в RakBot. Переходим на оффициальный сайт RakBot и ищем раздел "Доступные функции", раздел "События".
Нам необходимо событие onScriptStart(), которые вызывается автоматически при загрузке скрипта самим RakBot'ом.
В этой функции нам необходимо описать логику, которая будет писать в чат-лог RakBot'a "Hello World". Для этого, на той же странице в документации, посмотрим на раздел "Функции".
Первая фукнция printLog(text) - это то, что нам и нужно. С помощью этой функции мы отправим сообщение в чат RakBot'а. Для этого мы напишем:
Код function onScriptStart() printLog("Hello world!"); end
Мы написали логику в каком-то текстовом документе, но как сказать RakBot, чтобы он выполнил наш сценарий? Для этого необходимо сохранить файл с расширением .lua и положить его в папку scripts, в папке с RakBot. Я сохранил текстовый документ с именем "example.lua". Давайте попробуем запустить RakBot и посмотреть, что у нас получилось.
Как мы видим, при запуске RakBot, он находит скрипт "example.lua", после чего выполняет его. Из этого мы можем сделать вывод, что инициализация сценария происходит при запуске самого RakBot или при перезагрузке всех сценариев командой !reloadscripts.
Поздравляю, Вы только что написали свой собственный сценарий для RakBot!
Мы уже научились писать Hello World в консоли RakBot'а, но мы хотим писать сложных ботов, которые будут делать всю работу за нас, учитывая те или иные условия. На этом мы остановимся. Практически всё, что происходит в программировании, можно описать следующим образом: возьми данные, что-то с ними сделай, отдай результат. В данном случае данными выступает сам RakBot. Он сам запускает наши сценарии, а так же сам передаёт нам данные, которые мы можем обработать так, как хотим и в конце получить результат.
Давайте напишем простейший сценарий с условием. Условием будет являться ник бота. Если ник бота "СМaster", значит мы выведем в чат RakBot'а "CM FOREVER", если же ник бота совершенно другой - выведем в чат "Nonamer". Для этого нам поможет условный оператор if else, он же оператор ветвления. Он принимает на себя условие, которое должно вернуть либо true, либо false. Если условие равно true, тогда код внутри будет выполнен, если false - не будет выполнен. На этом строится большая часть логики любого приложения. Дословно if переводится как "ЕСЛИ", then - "ЗНАЧИТ", else - "ИНАЧЕ" Если это сильно сложно - не переживайте, Вы поймёте всё дальше.
В Lua есть следующие операторы сравнения: > Больше < Меньше >= Больше или равно <= Меньше или равно ~= Не равно == Равно
Если мы напишем "CMaster" == "CM" - у нас будет значение False, то есть, ложь Если мы напишем "CMaster" == "CMaster" - у нас будет значение True, то есть, истина.
5 > 10 - ложь 5 < 10 - истина 10 ~= 15 - истина 10 >= 5 - истина
И так далее.
Попробуем использовать логику ветвления в нашем предыдущем сценарии.
Тот код, который мы писали ранее:
Код function onScriptStart() printLog("Hello world!"); end
Преобразуем следующим образом:
Код function onScriptStart() botName = getNickName() if(botName == "CMaster") then printLog("CM FOREVER"); else printLog("Nonamer"); end end
Давайте разберём этот код начиная сверху. Я советую сразу начинать учить читать код. Поэтому попробуем прочитать, что у нас получилось
function onScriptStart() - создаём фукнцию с именем onScriptStart botName = getNickName() - в переменную botName записываем имя бота if(botName == "CMaster") then - если имя бота равно "CMaster", значит printLog("CM FOREVER"); - пишем в чат "CM Forever". else- ИНАЧЕ, или же если имя бота НЕ РАВНО "CMaster" printLog("Nonamer"); - пишем в чат "Nonamer" end- конец условий end- конец функции
Давайте попробуем проверить код, который мы написали. Я сохранил измененный код так же под именем "example.lua" и запустил RakBot с ником "Mason_Bennett".
После загрузки нашего сценария, RakBot написал в чат Nonamer. Попробуем зайти с ником "CMaster".
Как мы видим, наше условие успешно работает и мы видим в чате то, что и хотели.
Пройдёмся немного по переменным. У Вас есть лист бумаги и Вы хотите его сохранить. Сохранить каким образом - куда-то положить, чтобы не потерять его. Например, мы можем положить наш лист бумаги в шкафчик и достать тогда, когда нам будет необходимо. Если у нас будет новый листок и нам не нужен будет старый - мы выкинем старый листок и положим новый. Это и есть логика переменной. Мы можем создавать переменную с именами, которыми хотим и записывать в них значения, что мы и сделали в предыдущем примере с переменной botName.
В Lua мы можем записывать в переменную всё, что мы хотим. Например, я хочу создать переменную с именем PaperListи записать в неё текст "Lua - урок №2". Для этого я напишу:
Код PaperList = "Lua - урок №2".
Что мы здесь сделали? Написали имя и использовали оператор присваивания "=" и теперь я могу использовать эту переменную в любом месте своего сценария. Думаю, что если Вы вспомните математику на уровне максимум 5 класса - тут будет всё понятно.
У Lua есть несколько типов переменных, это nil, boolean, number, string. Не бойтесь, это всё очень просто.
На самом деле их несколько больше, но я уже говорил, что в RakBot большая часть функционала отсутствует.
nil - отсуствие значения. boolean - логические значения, принимает два варианта значений - либо true, либо false. number - вещественное число с двойной точностью. В Lua нет целочисленного типа, поэтому он выступает в качестве и вещественного и целочисленного типа. string - строка, здесь, я думаю, всё понятно. Чтож, давайте попробуем создать несколько переменных и "поиграться" с ними.
number = 0; - создаём переменную с именем number и присваиваем значение 0
number = number + 5; - присваивание значения переменной number + 5 ( то есть, 0 + 5 ), теперь у нас хранится здесь число 5.
number++; - ++ - инкремент. Другими словами - вы берёте переменную и увеличиваете её на одну единицу. То есть (5 + 1) - теперь 6 лежит у нас в переменной number.
number--; - -- декремент. Другими словами - уменьшаем на одну единицу. (6 - 1) - теперь значение равно 5.
string = "Hello" - создаём переменную string со значением "Hello"
string = string.."," - конкатенация строк, оно же сложение строк. Что мы здесь сделали? Указани имя переменной, указали оператор конкатенации "..", после чего указали ещё одну строку, которую необходимо добавить к первой. Теперь у нас в переменной "string" лежит значение "Hello,".
string= string..getNickName() - теперь, к "Hello," мы добавили ник бота, пускай будет "Michel". Теперь у нас в переменной string лежит значение "Hello,Michel".
boolean = true; - создаём переменную boolean со значением true (ИСТИНА).
boolean = getNickName() == "Dimosha" - сравниваем имя бота со строкой Dimosha. Так как имя бота у нас Michel, из предыдущего примера, сюда запишется значение false (ЛОЖЬ).
Немного о функциях. Есть функции, которые возвращают значения, а есть те, которые не возвращают значение. Как Вы успели заметить, наша функция onScriptStartне возвращает значения, а просто выполняет код, который указан внутри. Мы можем создавать собственные функции для того, чтобы изолировать часть логики из метода и выполнять те или иные операции. Фукнции так же могут принимать на себя значения, а могут и не принимать.
Давайте пройдёмся по самому простому пути: фукнция без параметров и без возвращаемого значения, которая будет складывать 5 + 10 и выводить результат в консоль RakBot'а.
Я создам функцию с именем Add:
function Add() -- Создаём фукнцию Add printLog(5 + 10) -- используем метод RakBot для вывода в консоль end-- Конец функции
Мы создали не совсем универсальную фукнцию по двум причинам: - если мне нужно будет складывать другие числа - мне придётся создавать ещё одну такую же фукнцию - я не могу использовать полученное значение за пределами фукнции
Попробуем исправить первый недочёт. Для этого мы добавим два параметра в фукнцию, которые будут принимать на себя числа для сложения. Сделаем мы это следующим образом:
function Add(a, b) printLog(5 + 10) end
Теперь в методе у нас доступны два значения, которые содержатся в двух новых переменных a и b, но на консоль у меня всё равно выводится 15. Исправим это:
function Add(a, b) printLog(a + b) end
Идеально. Теперь, при вызове этого метода, мы будем получать результат сложения в консоли. Попробуем протестировать. Изменим наш код в example.lua на следующий:
function Add(a, b) printLog(a + b) end
function onScriptStart() Add(5, 10); Add(123, 4324); Add(555, 111); end
И попробуем запустить RakBot. Посмотрим, что из этого получится:
Это решило нашу первую проблему. Попробуем решить вторую, чтобы наша функция возвращала результат.
Перепишем фукнцию Add:
function Add(a, b) return a + b end
return- ключевое слово для возвращения значения из функции. Перепишем теперь метод onScriptStart:
function onScriptStart() printLog("Первое значение: "..Add(5, 10)); printLog("Второе значение: "..Add(123, 4324)); printLog("Третье значение: "..Add(555, 111)); end
Посмотрим, что получилось.
Мы могли создать три переменные, присвоив им значения из фукнций Addи после их передавать в метод printLog, но я не стал этого делать, так как код выглядит более читабельным и приятнее.
Теперь, мы научились создавать собственные фукнции с параметрами, без параметров и возвращать из них значения. Я считаю, что этих основ Вам хватит сполна, чтобы написать собственного бота в рамках RakBot'а. В следующих уроках мы будем создавать простейшего бота, которого будем постепенно усложнять, добавляя всё новые и новые возможности и фукнции.
При копировании материала на сторонний ресурс, просьба указывать автора. Благодарю за честность :)
P.S. Если у Вас есть какие-либо вопросы, замечания, пожелания - пишите, постараюсь ответить на все.
Senior ASP.NET Developer
Languages: C#, Rust, PHP, Lua, TypeScript, JavaScript
Сообщение отредактировал Dimosha - Вторник, 24.10.2017, 12:04 |
|
|
|
Dimosha |
Дата: Вторник, 24.10.2017, 17:57 | Сообщение # 3
|
Новичок
Сообщений: 15
Статус: Offline
|
Цитата Огонёк ( ) эээ где темы про баги и тактики в казино?? И зачем ты скопировал из руководства по Lua, первую главу и вставил сюда? Кому нужно тот нашел бы. По поводу первого предложения - не вижу смысла отвечать, вопрос воняет полным бредом.
Собсна, прежде чем говорить о том, что я скопировал откуда-то первую главу, надо найти источник, хотя бы, и показать, что именно я скопировал. Так-то сам писал, не смотря на книги :\ Плюс даю основы по запуску скриптов и основ работы с RakBot API :\
Тема, как выше указана, даёт основы по Lua, чтобы в дальнейшем не было вопросов по поводу того, как вообще программировать и тому подобное. Я даю людям информацию, которая понадобится в дальнейших уроках. Если что-то не нравится - своё мнение можно оставить при себе ли же конструктивно объяснить, что здесь не так, верно?
Senior ASP.NET Developer
Languages: C#, Rust, PHP, Lua, TypeScript, JavaScript
Сообщение отредактировал Dimosha - Вторник, 24.10.2017, 18:00 |
|
|
|