Язык программирования луа

.

Всем привет.

Сегодня мы поверхностно пройдёмся по языку 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’а. Для этого мы напишем:

 

Мы написали логику в каком-то текстовом документе, но как сказать 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, то есть, истина.

И так далее.

Попробуем использовать логику ветвления в нашем предыдущем сценарии.

Тот код, который мы писали ранее:

 

Преобразуем следующим образом:

Давайте разберём этот код начиная сверху.

Я советую сразу начинать учить читать код. Поэтому попробуем прочитать, что у нас получилось

 

Давайте попробуем проверить код, который мы написали. Я сохранил измененный код так же под именем «example.lua» и запустил RakBot с ником «Mason_Bennett«.

После загрузки нашего сценария, RakBot написал в чат Nonamer. Попробуем зайти с ником «CMaster«.

Как мы видим, наше условие успешно работает и мы видим в чате то, что и хотели.

Пройдёмся немного по переменным. У Вас есть лист бумаги и Вы хотите его сохранить. Сохранить каким образом — куда-то положить, чтобы не потерять его. Например, мы можем положить наш лист бумаги в шкафчик и достать тогда, когда нам будет необходимо. Если у нас будет новый листок и нам не нужен будет старый — мы выкинем старый листок и положим новый.
Это и есть логика переменной. Мы можем создавать переменную с именами, которыми хотим и записывать в них значения, что мы и сделали в предыдущем примере с переменной botName.

В Lua мы можем записывать в переменную всё, что мы хотим. Например, я хочу создать переменную с именем 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—; — — декремент.

Создание встраиваемых сценариев на языке Lua

Другими словами — уменьшаем на одну единицу. (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:

Мы создали не совсем универсальную фукнцию по двум причинам:
— если мне нужно будет складывать другие числа — мне придётся создавать ещё одну такую же фукнцию
— я не могу использовать полученное значение за пределами фукнции

Попробуем исправить первый недочёт. Для этого мы добавим два параметра в фукнцию, которые будут принимать на себя числа для сложения. Сделаем мы это следующим образом:

Теперь в методе у нас доступны два значения, которые содержатся в двух новых переменных a и b, но на консоль у меня всё равно выводится 15. Исправим это:

Идеально. Теперь, при вызове этого метода, мы будем получать результат сложения в консоли. Попробуем протестировать. Изменим наш код в example.lua на следующий:

И попробуем запустить RakBot. Посмотрим, что из этого получится:

Это решило нашу первую проблему. Попробуем решить вторую, чтобы наша функция возвращала результат.

Перепишем фукнцию Add:

return- ключевое слово для возвращения значения из функции. Перепишем теперь метод onScriptStart:

Посмотрим, что получилось.

Мы могли создать три переменные, присвоив им значения из фукнций Add и после их передавать в метод printLog, но я не стал этого делать, так как код выглядит более читабельным и приятнее.

Теперь, мы научились создавать собственные фукнции с параметрами, без параметров и возвращать из них значения. Я считаю, что этих основ Вам хватит сполна, чтобы написать собственного бота в рамках RakBot’а. В следующих уроках мы будем создавать простейшего бота, которого будем постепенно усложнять, добавляя всё новые и новые возможности и фукнции.

Краткая справка

Lua — язык программирования, создателями которого являются Роберту Иерузалимски, Валдемар Селиш и Луис Энрике ди Фигейреду. С трудом верится, что такой популярный язык могли создать не где-нибудь в Кремниевой Долине или MIT, а в солнечной Бразилии. В стране, которая, казалось бы, находится довольно далеко от центров сосредоточения IT. Тем не менее, в одном из подразделений Католического университета Рио-де-Жанейро смогли создать настолько гибкий и мощный язык, что сейчас он находит широкое применение во многих областях.

Всё началось с разработки вспомогательного языка для нефтяной компании PETROBRAS.

Инженерам-нефтяникам требовался графический фронтэнд для обработки данных по симуляции определенных процессов. При этом оборудование могло быть самым разным — и PC DOS, и UNIX, Macintosh, поэтому многие уже существующие языки (Perl, например) просто не подходили, так как работали только на одной из этих систем. На этом этапе был разработан язык под названием DEL (data entry language). Со временем, возможностей этого языка стало не хватать, поэтому был разработан новый язык, названный SOL ( simple object language). И, наконец, в 1993 году разработчики поняли, что их можно объединить в один полноценный язык программирования, которые был назван Lua ( по-португальски Sol это солнце, а Lua — луна). Кстати, в 1996 году Роберту Иерузалимски и другие авторы языка решили рассказать о своей работе миру и отправили статью про Lua в журнал “Software: Practice & Experience”. Позже про Lua напечатали в журнале “Dr.Dobb’s”, из которого о нем узнал один из главных разработчиков адвенчурных игр в LucasArts. Решив использовать Lua вместо их собственного скриптового языка, он был поражен его простотой и эффективностью. В результате этого большая часть разрабатываемой в тот момент игры была переписана на Lua, что способствовало росту его популярности.

Философия языка Lua

Больше всего идеология Lua схожа с JavaScript. Например, у них обоих прототипная модель для реализации ООП. Однако, Lua гораздо более гибкий и мощный язык. В Lua используются виртуальная машина и сборщик мусора, что делает её более похожей на Java, однако это не мешает ей сохранять свою простоту и элегантность.

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

Скриптовый язык Lua

Проще говоря, если Вы захотите, чтобы в Вашей любимой и игре появился некий персонаж или предмет, то вам достаточно будет знать его имя, чтобы внести в таблицу, функцию, чтобы создать этот объект и ввести координаты игрового мира, в которых он должен появиться.

Стоит упомянуть такжи и о метатаблицах — таблицы, которые позволяют изменять поведение других таблиц. Например, определить, допустимо ли в некоторой ситуации сложение нечисловых значений. Или определить для некоторого события запуск “сборки мусора” (очистки памяти).

Где применяется Lua

Хотя Lua используется и в промышленных приложениях,но самую большую популярность этот язык приобрел в геймдеве. Так как разработчикам бывает трудно вносить изменения в движок игры, а геймдизайнерам постоянно приходится вносить изменения в работу уровней или персонажей, то здесь Lua бывает просто незаменим. На нем очень легко в описать взаимодействие между игроками, запрограммировать NPC (крестьян в скайриме) или поведение боссов при помощи скриптов, которые потом можно быстро изменить, не влияя на движок.

Самой известной игрой, в которой применяется Lua, сейчас, конечно, стала World of Warcraft. Интерфейс WoW (меню, чат и.т.д) написаны на нем. Ещё Lua использовали в таких играх, как Crysis, King’s of Bounty, Warhammer, Аллоды онлайн, CS, Сталкер, Ведьмак, Sim City, Far Cry, Civilization V и.т.д.

Ещё на Lua часто пишутся плагины для nmap, wireshark, nginx или боты для Telegram. А ещё Википедия планирует использовать Lua для встраивания в MediaWiki (можете попробовать в английской версии).

Lua также используется в обсерваториях, занимающихся исследованиями в области астрофизики и крупных университетах по всему миру (например, в Берлинском Техническом Университете). Также Lua стал чем-то вроде национального языка программирования у себя на родине и используется многими местными компаниями и исследовательскими центрами в самых разных сферах деятельности.

Сложность обучения Lua

Lua достаточно прост в изучении . По нему много ресурсов и видеоуроков в сети. К тому же, тут очень помогает геймификация. Если в вашей любимой игре можно создавать моды на Lua, то попробуйте поэкспериментировать с игровым миром в процессе обучения. Это позволит освоить программировании весело и без лишних усилий.

Плюсы/минусы Lua

К плюсам Lua относятся:

  • хорошая портируемость. Если вам потребуется, например, перенести программу из Windows в Linux, то, за исключением некоторых специфичных для платформ библиотек, код не потребуется сильно изменять.
  • возможность быстро добавить к приложению на Lua библиотеку на С
  • легкость развертывания программ
  • легкий синта
    ксис
  • программы на Lua потребляют мало памяти
  • распространяется по лицензии MIT, поэтому можно бесплатно использовать и для бизнес проектов

Из минусов:

Lua отлично работает настолько, насколько вообще может скриптовый язык. Но чаще всего его применяют совместно с другими языками, хотя он вполне выполнять некоторые задачи самостоятельно. Поэтому, вам нужно будет знать хотя бы ещё один, например,C или С++. Однако, несомненно, знание Lua будет вам большим плюсом при трудоустройстве на должность разработчика игр.

Сопутствующие технологии

LuaJIt — JIT-компилятор для Lua. Используется для задач, в которых критично время выполнения. Работает примерно в шесть раз быстрее стандартного интерпретатора.

Love2D — популярный фреймворк, предназначенный для разработки 2D игр на Lua.

Corona SDK — фреймворк для создания приложений под iOS и Android на Lua. С 2015 года появилась бесплатная версия.

Краткая справка

Lua — язык программирования, создателями которого являются Роберту Иерузалимски, Валдемар Селиш и Луис Энрике ди Фигейреду. С трудом верится, что такой популярный язык могли создать не где-нибудь в Кремниевой Долине или MIT, а в солнечной Бразилии. В стране, которая, казалось бы, находится довольно далеко от центров сосредоточения IT. Тем не менее, в одном из подразделений Католического университета Рио-де-Жанейро смогли создать настолько гибкий и мощный язык, что сейчас он находит широкое применение во многих областях.

Всё началось с разработки вспомогательного языка для нефтяной компании PETROBRAS. Инженерам-нефтяникам требовался графический фронтэнд для обработки данных по симуляции определенных процессов. При этом оборудование могло быть самым разным — и PC DOS, и UNIX, Macintosh, поэтому многие уже существующие языки (Perl, например) просто не подходили, так как работали только на одной из этих систем. На этом этапе был разработан язык под названием DEL (data entry language). Со временем, возможностей этого языка стало не хватать, поэтому был разработан новый язык, названный SOL ( simple object language). И, наконец, в 1993 году разработчики поняли, что их можно объединить в один полноценный язык программирования, которые был назван Lua ( по-португальски Sol это солнце, а Lua — луна). Кстати, в 1996 году Роберту Иерузалимски и другие авторы языка решили рассказать о своей работе миру и отправили статью про Lua в журнал “Software: Practice & Experience”. Позже про Lua напечатали в журнале “Dr.Dobb’s”, из которого о нем узнал один из главных разработчиков адвенчурных игр в LucasArts. Решив использовать Lua вместо их собственного скриптового языка, он был поражен его простотой и эффективностью. В результате этого большая часть разрабатываемой в тот момент игры была переписана на Lua, что способствовало росту его популярности.

Философия языка Lua

Больше всего идеология Lua схожа с JavaScript. Например, у них обоих прототипная модель для реализации ООП. Однако, Lua гораздо более гибкий и мощный язык. В Lua используются виртуальная машина и сборщик мусора, что делает её более похожей на Java, однако это не мешает ей сохранять свою простоту и элегантность.

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

Стоит упомянуть такжи и о метатаблицах — таблицы, которые позволяют изменять поведение других таблиц. Например, определить, допустимо ли в некоторой ситуации сложение нечисловых значений.

Хочу всё знать. Язык Lua

Или определить для некоторого события запуск “сборки мусора” (очистки памяти).

Где применяется Lua

Хотя Lua используется и в промышленных приложениях,но самую большую популярность этот язык приобрел в геймдеве. Так как разработчикам бывает трудно вносить изменения в движок игры, а геймдизайнерам постоянно приходится вносить изменения в работу уровней или персонажей, то здесь Lua бывает просто незаменим. На нем очень легко в описать взаимодействие между игроками, запрограммировать NPC (крестьян в скайриме) или поведение боссов при помощи скриптов, которые потом можно быстро изменить, не влияя на движок.

Самой известной игрой, в которой применяется Lua, сейчас, конечно, стала World of Warcraft. Интерфейс WoW (меню, чат и.т.д) написаны на нем. Ещё Lua использовали в таких играх, как Crysis, King’s of Bounty, Warhammer, Аллоды онлайн, CS, Сталкер, Ведьмак, Sim City, Far Cry, Civilization V и.т.д.

Ещё на Lua часто пишутся плагины для nmap, wireshark, nginx или боты для Telegram. А ещё Википедия планирует использовать Lua для встраивания в MediaWiki (можете попробовать в английской версии).

Lua также используется в обсерваториях, занимающихся исследованиями в области астрофизики и крупных университетах по всему миру (например, в Берлинском Техническом Университете). Также Lua стал чем-то вроде национального языка программирования у себя на родине и используется многими местными компаниями и исследовательскими центрами в самых разных сферах деятельности.

Сложность обучения Lua

Lua достаточно прост в изучении . По нему много ресурсов и видеоуроков в сети. К тому же, тут очень помогает геймификация. Если в вашей любимой игре можно создавать моды на Lua, то попробуйте поэкспериментировать с игровым миром в процессе обучения. Это позволит освоить программировании весело и без лишних усилий.

Плюсы/минусы Lua

К плюсам Lua относятся:

  • хорошая портируемость. Если вам потребуется, например, перенести программу из Windows в Linux, то, за исключением некоторых специфичных для платформ библиотек, код не потребуется сильно изменять.
  • возможность быстро добавить к приложению на Lua библиотеку на С
  • легкость развертывания программ
  • легкий синтаксис
  • программы на Lua потребляют мало памяти
  • распространяется по лицензии MIT, поэтому можно бесплатно использовать и для бизнес проектов

Из минусов:

Lua отлично работает настолько, насколько вообще может скриптовый язык. Но чаще всего его применяют совместно с другими языками, хотя он вполне выполнять некоторые задачи самостоятельно. Поэтому, вам нужно будет знать хотя бы ещё один, например,C или С++. Однако, несомненно, знание Lua будет вам большим плюсом при трудоустройстве на должность разработчика игр.

Сопутствующие технологии

LuaJIt — JIT-компилятор для Lua. Используется для задач, в которых критично время выполнения. Работает примерно в шесть раз быстрее стандартного интерпретатора.

Love2D — популярный фреймворк, предназначенный для разработки 2D игр на Lua.

Corona SDK — фреймворк для создания приложений под iOS и Android на Lua. С 2015 года появилась бесплатная версия.

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

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