Посадка
У Эммы 30 монет и есть план: какие семена она хочет купить и сколько. Она идёт по плану по порядку. Если монет на пункт хватает, она платит за семена и сажает их на новой грядке. Если нет, она пропускает пункт и переходит к следующему.
В пункте плана есть только название культуры и количество семян. Всё остальное о культуре, например цена семени, лежит в crops. Поэтому программе нужна функция, которая находит культуру по названию. Это поиск из урока про словари: цикл идёт по списку, и когда находит нужную запись, return возвращает её и сразу завершает всю функцию вместе с циклом. Если цикл ничего не нашёл, функция доходит до return nil после него. Например, животные на ферме:
local animals = {
{name = "Белла", kind = "корова"},
{name = "Рекс", kind = "собака"},
}
local function findAnimal(name)
for _, animal in ipairs(animals) do
if animal.name == name then
return animal
end
end
return nil
end
print(findAnimal("Рекс").kind)
print(findAnimal("Том"))Он выведет:
собака
nilЕсли в плане опечатка, например "марковь", findCrop вернёт nil, и программа остановится на первой же строке, которая читает поле культуры:
main.lua:40: attempt to index a nil value (local 'crop')Грядка — это новая запись с тремя полями: crop — вся запись культуры (а не только её название), seeds — число семян и grown — сколько дней она уже росла; пока это 0. grown понадобится на следующем шаге. Благодаря целой записи в crop грядка потом сможет читать plot.crop.days и plot.crop.name. Ничего не копируется: как вы знаете из урока про словари, plot.crop и запись в crops — это одна и та же таблица.
Грядки попадают в список plots с помощью table.insert. Сразу после этого #plots — номер новой грядки: 1 для первой, 2 для второй. Семена стоят item.seeds * crop.seedPrice монет, и Эмма может их купить, если цена <= её монет. С < она никогда не смогла бы потратить последнюю монету.
В string.format пишите x (латинскую) прямо перед %d, без пробела: "%s x%d" даёт морковь x4.
Задание
- 1
Под
cropsсоздайте локальную переменнуюplan: список записей с полямиnameиseeds. Эмма хочет 4 семени моркови, 6 семян пшеницы, 2 семени тыквы и 2 семени клубники, именно в таком порядке. Первая запись —{name = "морковь", seeds = 4}. - 2
Под
-- Функциинапишите функциюfindCrop(name), которая возвращает культуру изcropsс таким названием илиnil. - 3
В конце главной программы создайте переменные
coins(30) иplots(пустой список). Затем пройдите поplan. Для каждого пункта найдите его культуру и вычислите цену семян. Если Эмме хватает монет, вычтите цену, добавьте вplotsгрядку{crop = crop, seeds = item.seeds, grown = 0}и выведите строку о ней. Иначе выведите, что монет не хватает. Под списком цен программа выведет:Грядка 1: морковь x4, стоимость: 8 Грядка 2: пшеница x6, стоимость: 6 Грядка 3: тыква x2, стоимость: 10 Не хватает монет: клубника x2Если клубника тоже получила грядку, проверьте, что вы вычитаете цену из
coins. - 4
После цикла выведите, сколько монет осталось у Эммы. Программа заканчивается так:
Не хватает монет: клубника x2 Монеты: 6Если строка появляется четыре раза, вы выводите её внутри цикла.