Поздравляем!
Поздравляем, ваша программа работает, и вы дошли до конца курса по Lua! Эмма начала сезон с 30 монетами и посадила три грядки. Когда Гуго платил больше рынка, она продавала ему урожай, а остальное уходило на рынок. Сезон она закончила со 174 монетами. И каждую строчку вы написали сами.
Последнее улучшение. Эмма хочет попробовать новую культуру: помидоры. В вашей программе это две новые строки данных, запись в crops и пункт в plan, и больше ничего. Список цен, посадка, рост, сарай, Гуго и рынок работают с тем, что лежит в списках, поэтому помидоры сами находят своё место везде. Следите и за монетами: семена помидоров стоят ровно 6 монет, которые остались у Эммы, и благодаря <= она может их купить.
Что вы узнали. Посмотрите, как каждый урок курса нашёл своё место в вашей программе:
- Основы Lua:
print, программа, которая выполняется сверху вниз, и комментарии, делящие её на части. Когда что-то шло не так, сообщение об ошибке подсказывало, в какой строке. - Переменные и типы:
local-переменные вродеcoinsи целые числа, которые выводит%d. С десятичным числом вроде3.5%dзакончился бы ошибкой. - Условия решают, хватает ли Эмме монет, созрела ли грядка, платит ли Гуго больше рынка и есть ли что выводить.
- Циклы проходят по плану, дням и грядкам, цикл в цикле.
for extra = 2, 0, -1считает в обратную сторону, аwhile trueв сценарии Гуго не бесконечен, потому что останавливается на каждомyield. - Таблицы как списки хранят культуры, план, грядки и погоду.
table.insertдобавляет в них,#plotsсчитает их,table.concatсоединяет строки, аtable.sortсортирует. - Функции делят программу на части с понятными задачами:
findCropищет,sortedNamesсортирует, аsellвыводит и возвращает монеты. Параметры по умолчанию сохранили работу старого вызоваsell(barn). - Таблицы как словари: каждая культура — запись,
growth[today]находит рост по погоде, а сарай считает урожай по названиям. Поскольку уpairsнет порядка, ключи сортируются перед выводом. - Строки:
string.formatсобирает строки с%sи%d, а..склеивает остальное. - Объекты и метатаблицы: класс
Plotхранит данные и методы грядки вместе.__indexнаходит методы,plot:grow()передаёт грядку какself, а__tostringпревращает её вморковь 2/3. - Сопрограммы: сценарий Гуго останавливается на
coroutine.yieldи продолжается на следующий день, посреди цикла, с теми же значениями переменных.
Lua на вашем компьютере. Здесь программы запускал ваш браузер. Чтобы запускать их в других местах, есть несколько вариантов:
- Онлайн, без установки: официальная демо-страница lua.org/demo.html позволяет попробовать Lua 5.4 прямо в браузере. Вставьте свою программу и запустите её.
- macOS: установите Lua через Homebrew командой
brew install luaв Терминале. Сохраните программу какmain.luaи запустите её в её папке командойlua main.lua. - Ubuntu и Debian Linux: установите Lua командой
sudo apt install lua5.4и запустите программу командойlua5.4 main.lua. - Windows: скачайте готовый Lua с сайта LuaBinaries. Программа называется
lua54.exe, поэтому свою программу вы запускаете командойlua54 main.lua.
Пишите программы в редакторе, который понимает Lua, например в Visual Studio Code с расширением «Lua» от sumneko (Lua Language Server). Он отмечает ошибки по мере набора, ещё до запуска программы.
Сообщения об ошибках такие же, как те, что вы видели здесь, с двумя небольшими отличиями: первая строка начинается с названия команды, например lua: , а трассировка заканчивается строкой [C]: in ?. Например, когда в плане опечатка, lua main.lua выведет:
lua: main.lua:101: attempt to index a nil value (local 'crop')
stack traceback:
main.lua:101: in main chunk
[C]: in ?Другие Lua. Вы изучили стандартный Lua 5.4. Вам встретятся и его родственники:
- Luau, язык Roblox, вырос из Lua 5.1. В нём есть то, чего нет в стандартном Lua:
coins += 5и подобное,continueв циклах, строки со значениями в обратных кавычках,`Монеты: {coins}`, и необязательные типы,local coins: number = 5. Все его числа — десятичные, поэтомуprint(10 / 2)выводит5. А игры Roblox поверх языка, который вы изучили, используют собственные объекты Roblox, такие какgame,workspaceи события. - LuaJIT — очень быстрый Lua 5.1, который используют игровой движок LÖVE, Defold и Neovim. В Lua 5.1 нет
//, и числа в нём не делятся на целые и десятичные. - Дополнения для World of Warcraft используют Lua 5.1, а PICO-8 — небольшой язык, похожий на Lua.
Что дальше. Теперь вы знаете Lua от print до метатаблиц и сопрограмм. Вот несколько идей, чем заняться дальше:
- Продолжайте улучшать свою программу. Дедушка Джо мог бы стать вторым торговцем со своей сопрограммой, а Эмма могла бы продавать тому, кто платит больше. Сезон мог бы стать длиннее, у грядки мог бы появиться метод
plot:isReady(), а на вашем компьютере погода может быть случайной сmath.random: там тестам не нужен одинаковый вывод каждый раз. Больше всего вы узнаёте, решая собственные задачи. - Игры с LÖVE. LÖVE — бесплатный движок для 2D-игр, и всю игру вы пишете на Lua: что происходит в каждом кадре, что рисуется и что делает нажатие клавиши.
- Roblox Studio. Игры Roblox пишут на Luau в Roblox Studio. Почти всё из этого курса там работает, а к нему вы добавите объекты и события Roblox.
- Neovim. Текстовый редактор Neovim настраивается и расширяется на Lua, так что теперь вы можете писать для него собственные настройки и плагины.
- Справочное руководство по Lua. Справочное руководство по Lua 5.4 описывает весь язык и все его функции (на английском). А книга Programming in Lua, которую написал Роберто Иерусалимски, один из авторов Lua, объясняет язык в глубину.
А если захотите попробовать другой язык, вас ждут курсы Python, JavaScript и C.
Задание
- 1
Добавьте помидоры в конец
crops:{name = "помидор", days = 4, seedPrice = 2, price = 7}. А в конецplanдобавьте 3 семени помидоров, которые хочет Эмма:{name = "помидор", seeds = 3}. Больше ничего не меняйте. Тогда программа выведет всё, что вы видели в начале урока:СПИСОК ЦЕН морковь: семена 2, продажа 5 тыква: семена 5, продажа 20 клубника: семена 4, продажа 12 пшеница: семена 1, продажа 3 помидор: семена 2, продажа 7 Грядка 1: морковь x4, стоимость: 8 Грядка 2: пшеница x6, стоимость: 6 Грядка 3: тыква x2, стоимость: 10 Не хватает монет: клубника x2 Грядка 4: помидор x3, стоимость: 6 Монеты: 0 День 1 (солнечно): морковь 1/3, пшеница 1/2, тыква 1/6, помидор 1/4 День 2 (солнечно): морковь 2/3, пшеница 2/2, тыква 2/6, помидор 2/4 Гуго: пшеница 6 x 4 = 24 День 3 (дождливо): морковь 3/3, пшеница 2/2, тыква 4/6, помидор 4/4 День 4 (облачно): морковь 1/3, пшеница 1/2, тыква 5/6, помидор 1/4 Гуго: морковь 4 x 7, помидор 3 x 9, пшеница 6 x 5 = 85 День 5 (солнечно): морковь 2/3, пшеница 2/2, тыква 6/6, помидор 2/4 Гуго: пшеница 6 x 4, тыква 2 x 21 = 66 День 6 (облачно): морковь 3/3, пшеница 1/2, тыква 1/6, помидор 3/4 Рынок: морковь 4 x 5 = 20 Конец сезона. Монеты: 195Если помидоры не получили грядку, проверьте условие покупки семян: у Эммы осталось ровно 6 монет, и этого хватает.