Рост
Теперь начинается сезон: шесть дней, и у каждого своя погода. В солнечный или облачный день каждая грядка растёт на один день. В дождливый день дождь поливает грядки, и они растут на два. Погода шести дней лежит в списке: солнечно, солнечно, дождливо, облачно, солнечно, облачно. В настоящей игре она могла бы быть случайной, с math.random. Но тогда программа каждый раз выводила бы что-то другое, и тесты не могли бы её проверить. Поэтому погода зафиксирована.
Насколько вырастут грядки, зависит от погоды, а это работа для словаря. Его ключи — виды погоды, а значения — дни роста: growth[today] равно 2, когда today — "дождливо". У каждого вида погоды из списка должен быть ключ в словаре. Опечатка в списке, например "солнчно", даёт nil, и программа останавливается в growPlot, которая не может прибавить nil:
main.lua:35: attempt to perform arithmetic on a nil value (local 'amount')Грядка не может вырасти больше, чем нужно её культуре. У моркови, которая росла 2 дня из 3, после дождливого дня будет 3 из 3, а не 4. math.min возвращает меньшее из двух чисел, поэтому math.min(plot.grown + amount, plot.crop.days) — это новое число дней, но никогда не больше plot.crop.days.
Функция growPlot изменяет грядку, которую получает, и ничего возвращать ей не нужно. Таблица при передаче в функцию не копируется, поэтому изменение происходит с грядкой в списке plots.
Строка каждого дня описывает все грядки. Это приём из урока про списки: собрать в цикле список строк, а затем соединить их с помощью table.concat. Например, куры Эммы несут два яйца в солнечный день и одно в дождливый:
local hens = {
{name = "Златка", eggs = 0},
{name = "Перчинка", eggs = 0},
}
local laid = {["солнечно"] = 2, ["дождливо"] = 1}
for day, sky in ipairs({"солнечно", "дождливо"}) do
local parts = {}
for _, hen in ipairs(hens) do
hen.eggs = hen.eggs + laid[sky]
table.insert(parts, hen.name .. " " .. hen.eggs)
end
print("День " .. day .. ": " .. table.concat(parts, ", "))
endОн выведет:
День 1: Златка 2, Перчинка 2
День 2: Златка 3, Перчинка 3Внешний цикл идёт по дням, а внутренний — по курам. ipairs даёт и номер дня, и его погоду, поэтому на первом проходе day равно 1, а sky — "солнечно". Список parts создаётся внутри внешнего цикла, поэтому каждый день начинается с пустого. Если создать его над циклом, он продолжал бы расти, и в строке второго дня оказались бы четыре курицы.
Задание
- 1
Под
planсоздайте списокweatherс погодой шести дней:"солнечно", "солнечно", "дождливо", "облачно", "солнечно", "облачно"— и словарьgrowth, в котором у"солнечно"и"облачно"значение1, а у"дождливо"—2. Русские слова в роли ключей нельзя писать просто так: их берут в кавычки и квадратные скобки, как ключ с пробелом в уроке про словари. - 2
Под
findCropнапишите две функции.growPlot(plot, amount)прибавляетamountкgrownгрядки, но не вышеdaysеё культуры.describePlot(plot)возвращает короткий текст о грядке, напримерморковь 2/3: название культуры, сколько дней она росла и сколько ей нужно. - 3
В конце главной программы пройдите по
weatherс помощьюipairs. Каждый день каждая грядка растёт наgrowth[today], а затем программа выводит строку с номером дня, его погодой и описаниями всех грядок, соединёнными через", ". Программа заканчивается так:Не хватает монет: клубника x2 Монеты: 6 День 1 (солнечно): морковь 1/3, пшеница 1/2, тыква 1/6 День 2 (солнечно): морковь 2/3, пшеница 2/2, тыква 2/6 День 3 (дождливо): морковь 3/3, пшеница 2/2, тыква 4/6 День 4 (облачно): морковь 3/3, пшеница 2/2, тыква 5/6 День 5 (солнечно): морковь 3/3, пшеница 2/2, тыква 6/6 День 6 (облачно): морковь 3/3, пшеница 2/2, тыква 6/6Если у моркови на третий день
4/3, грядка выросла больше, чем нужно её культуре.