OpenComputers/Туториал: Автоматическая ферма

Итак, вы установили **OpenComputers**. Что же теперь? Теперь пусть роботы работают за нас!


Выращивать пшеницу — скучное занятие. Однако пока вы заняты поиском алмазов для своего супер-компьютера, вам надо что-то есть.
Построим роботизированную пшеничную ферму!

Ферма будет размерами 9×9 блоков. По центру разместим источник воды, для увлажнения почвы. Таким образом, полезная площадь составит 80 блоков. Оградим ферму по периметру от нежелательных гостей, чтобы не вытаптывали пшеницу и не сбивали программу роботу.



## Что потребуется?

- Робот. Он будет пахать, сеять и собирать урожай в сундук.
- Апгрейд-солнечная панель для робота. Это позволит ему работать без перерывов на подзарядку (если ферма будет на поверхности).
- Дискета. На нее мы запишем программу робота.
- Мотыга покрепче. Её мы вручим роботу.
- Сундук. В него робот будет складывать урожай.
- Ведро воды. Вода будет увлажнять землю.
- Пара лопат, для подготовки фермы.
- Материалы для ограждения (доски, заборы, стекло и т.д.) по желанию.
- Стопка семян. Не обязательно ровно 80 штук. Робот постепенно накопит нужное количество семян сам (после сбора урожая) и засеет поле полностью.


Желательно также обладать компьютером, на котором мы будем писать программу.

## Строительство

Первым делом — подготовим место для фермы. Удобно расположить ее на поверхности. Тогда робот сможет самостоятельно поддерживать заряд батарей.

Выберем подходящий участок земли размерами 9×9 блоков. Можно заглубить ферму в землю (как это сделал я, на скриншоте). Постройте ограждение. На одной из сторон участка, у правого угла, постройте возвышение в один блок над уровнем поля. Здесь будет располагаться робот (поле должно находиться перед ним и продолжаться влево) и сундук для урожая.

Выкопаем по центру поля ямку 1×1 блок и выльем туда воду.

Затем мотыгой взрыхлим землю на всем участке.


Осветите участок и завершите постройку. Теперь пришло время засевать.



## Измерение

Для более точной настройки программы необходимо установить, за какое время большая часть пшеницы на поле поспеет и будет готова к сбору. Для этого засеем поле в первый раз вручную. Засечем время и займемся чем-нибудь другим.

В моем случае, созревание пшеницы заняло около 50 минут реального времени. За это время в игре прошло несколько суток. Я взял интервал с небольшим запасом — час. Это 3600 секунд.



## Программирование

Возьмем дискету и вставим в компьютер. Назовем ее `Farm`

и создадим на дискете программу `farmer.lua`

. (Подробно о работе с дисками и дискетами, переименовании и создании программ — см. Туториал: Работаем с дисками.)


Вы можете перепечатать следующий код вручную и сохранить, либо скопировать его и вставить (`⇧ Shift`+`Insert` в игровом редакторе).

И наконец, вы можете открыть (свернув игру на время, и поместив дискету в инвентарь) папку `\.minecraft\saves\<Название вашего сохранения>\opencomputers\<Адрес дискеты>\`

. Там находится только что созданный файл `farmer.lua`

. Вы можете открыть его любым редактором и вставить текст программы.


Код:

local robot = require("robot") local comp = require("computer") local size = 9 function harvest() -- fly to start robot.forward() for y=1, size do -- harvest one line robot.swingDown() robot.placeDown() for x=1, (size-1) do robot.forward() robot.swingDown() robot.placeDown() end -- turn if y%2 == 1 then robot.turnLeft() robot.forward() robot.turnLeft() else robot.turnRight() robot.forward() robot.turnRight() end end -- return for y=1, (size-1) do robot.forward() end robot.turnLeft() for y=1, (size-1) do robot.forward() end robot.turnRight() robot.forward() robot.turnAround() end function unload() robot.turnAround() for c = 2, 16 do robot.select(c) if robot.count() > 0 then robot.drop() else robot.select(1) break end end robot.turnAround() end while true do -- one hour sleeping for i=1, 10 do os.sleep(360) print((10*i)..'%') end -- harvest() if robot.count(2) == 64 then unload() end end

## Разбор кода

Программа состоит из двух функций и главного цикла.


Функция `harvest()`

обеспечивает сбор урожая и высадку семян. Она выводит робота на поле, а затем двигает его "челночными" движениями, ряд за рядом. Над каждым блоком робот делает взмах мотыгой, собирая урожай, и высаживает взамен одно семечко из активного первого слота.


Функция `unload()`

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


Первая часть главного цикла программы — ожидание. Для наглядности (чтобы робот не казался "зависшим"), робот каждый шесть минут выводит в свою консоль проценты созревания урожая.

При достижении 100%, вторая часть главного цикла вызывает функцию `harvest()`

. Затем проверяет, не полон ли второй слот и выгружает инвентарь в сундук, если необходимо.


Программа работает в бесконечном цикле. Её можно прервать, если выключить робота, или нажать `Ctrl`+`Alt`+`C` в его консоли.



## Запуск фермы

Засеиваем поле (если оно еще не засеяно). Размещает робота на стартовой позиции (в правом углу одной из сторон поля).


Размещаем мотыгу, дискету и солнечную панель в соответствующих слотах. Если устанавливать робота при свете солнца, вам не придется даже заряжать его. После установки солнечной панели, аккумулятор робота автоматически начнёт заполняться. Положите стек семян в активный первый слот (он отмечен бегущим зеленым контуром).


Включите робота. Смонтируйте дискету в удобное расположение, перейдите на нее и запустите нашу программу.

Робот должен будет повиснуть в воздухе, и начнет ожидание. В консоль будут периодически выводиться проценты готовности. Через час, робот совершит облет поля, соберет урожай и засеет новый.


Готово!



## Итоги

Ферма полностью автоматизирована. Вам необходимо будет только менять мотыгу роботу, когда она износится (это будет происходить не очень часто).

За один сбор урожая ферма будет производить 55-60 снопов пшеницы и около 40 семян. Т.е. приблизительно 20 батонов хлеба в час.

## Что дальше?

Ферму можно быстро расширить до любой площади. Для этого достаточно лишь заменить константы ширины и длины поля в коде робота, и подготовить землю.


Вы можете усложнить код робота. Добавьте настройку первого ожидания (если робот устанавливается на уже созревающее или пустое поле). Сделайте автоматическую замену сломанной мотыги. И т.д.

Можно пойти дальше в автоматизации фермы, и добавить автоматический верстак (BuildCraft) для крафта хлеба из пшеницы, а затем трубу для доставки хлеба в дом.



## Материалы

Туториалы:


Интерфейсы: