Культуры
Добро пожаловать на последний урок курса по Lua! В нём вы соберёте всё, что узнали, и шаг за шагом напишете одну программу: сезон на ферме Эммы. Эмма покупает семена, сажает их, шесть дней смотрит, как они растут, собирает урожай и продаёт его. Когда вы закончите, ваша программа выведет вот что:
СПИСОК ЦЕН
морковь: семена 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Сначала идёт список цен на культуры. У Эммы 30 монет, и она покупает семена для своих грядок. Монет на клубнику ей не хватает, а на помидоры хватает. Затем проходят шесть дней. Каждый день грядки растут, а в дождливый день — вдвое быстрее: морковь 2/3 значит, что морковь росла 2 дня из 3 нужных. Созревший урожай отправляется в сарай, а грядка начинает расти заново. Каждый день мимо проезжает торговец Гуго, и когда он платит больше, чем рынок, Эмма продаёт ему всё, что лежит в сарае. То, что осталось к концу сезона, уходит на рынок.
Вы используете большую часть курса: записи в списках, словари, функции, циклы, условия, string.format, класс с метатаблицей и сопрограмму. Каждое упражнение продолжает предыдущее (редактор открывается с его готовым кодом) и добавляет один кусочек.
План. В редакторе есть три комментария, которые делят программу на части. Вверху — -- Данные: то, с чем работает программа, например культуры, а позже план Эммы и погода. Под ним — -- Функции, а внизу — -- Главная программа, которая использует данные и функции и выводит результаты. Порядок важен. Lua выполняет программу сверху вниз, а локальная переменная или функция существует только со строки, где она создана. Поэтому функция, которая читает crops, должна стоять ниже crops, а главная программа, которая вызывает функции, — ниже них.
Первый шаг: культуры. У каждой культуры есть название, число дней, за которое она растёт, цена одного семени и цена, по которой рынок покупает одну единицу урожая. Это запись — таблица с именованными полями, как в уроке про словари. А все культуры вместе — список записей. Например, прилавок дедушки Джо на рынке:
local stall = {
{name = "яйца", unit = "коробка", price = 4},
{name = "молоко", unit = "бутылка", price = 3},
}
for _, item in ipairs(stall) do
print(string.format("%s (%s): цена %d", item.name, item.unit, item.price))
endОн выведет:
яйца (коробка): цена 4
молоко (бутылка): цена 3Обратите внимание на запятую после последней записи: Lua это разрешает, и добавлять новую запись потом проще. А вот запятая между двумя записями обязательна. Без неё программа вообще не запустится: main.lua:3: '}' expected (to close '{' at line 1) near '{'. Lua решил, что список закончился после первой записи, потому что никакая запятая не сказала, что дальше есть ещё одна.
Цикл for _, item in ipairs(stall) проходит по списку по порядку. Индекс ему не нужен, поэтому вместо него стоит _. string.format подставляет значения в строку: %s — строку, %d — целое число, в том порядке, в каком они идут. Если в названии поля опечатка, например crop.seedprice с маленькой p, поле равно nil, и %d не может его вывести: main.lua:16: bad argument #3 to 'format' (number expected, got nil). Аргумент №3 — это третье значение в скобках string.format, считая саму строку с форматом.
Задание
- 1
Под
-- Данныесоздайте локальную переменнуюcrops: список из четырёх записей с полямиname,days,seedPriceиprice. Первая —{name = "морковь", days = 3, seedPrice = 2, price = 5}. Дальше идут тыква (6 дней, семя за 5, продаётся за 20), клубника (5 дней, 4, 12) и пшеница (2 дня, 1, 3). Пишите названия строчными буквами, как в выводе:"тыква","клубника"и"пшеница". - 2
Под
-- Главная программавыведите заголовокСПИСОК ЦЕН. Под ним пройдите поcropsс помощьюipairsи выведите название каждой культуры. Программа выведет заголовок и четыре названия. - 3
Дополните строку в цикле с помощью
string.format, чтобы она показывала ещё и цену семени, и цену, по которой платит рынок:СПИСОК ЦЕН морковь: семена 2, продажа 5 тыква: семена 5, продажа 20 клубника: семена 4, продажа 12 пшеница: семена 1, продажа 3Если семя моркови стоит 5, вы перепутали две цены.