Перейти к содержимому
Doob

Робот-фермер

Рекомендуемые сообщения

Зачем для разных ферм писать разные программы?
При помощи двух функций, я теперь могу сделать ферму crops и кактусов с минимумом изменений.
Работает на любой длине и ширине поля, на любом роботе с инвентарем, пока робот висит у сундука, можно расширить грядку (не забыв при этом обновить границу из твердых блоков)
 
Код библиотеки: pastebin get 3fYPKZ8v /lib/farmer.lua

Настройки на строках 8 и 9
 
Ставим робота так, чтобы он стоял задом к сундуку, закидываем в первый слот сундук, чтобы робот мог найти отправную точку, делаем бордюр вокруг поля из любого твердого блока (уткнувшись в него, робот переходит на следующую линию)
 
Примеры использования:
 
Ферма кактусов



3un7lr4.png
 

local computer = require('computer')
local robot = require('robot')
local farmer = require('farmer')

local function dig()--содрать два верхних блока кактуса/тростника
  if robot.detectDown() then
    robot.swingDown()os.sleep(0.4)
    robot.down() os.sleep(0.4)
    robot.swingDown() os.sleep(0.4)
    robot.up()
  end
end

while true do
  energy = computer.energy()/computer.maxEnergy()
  if energy <= 0.1 then --  если энергии меньше 10%
    print('Уровень энергии менее 10%')
    os.sleep(300) -- спим 5 минут
  else
    dig()
    robot.forward() --идем вперед
    if robot.detect() then --уперлись в блок
      dig()
      if farmer.turn() then -- поворачиваем, если есть блок - включаем поиск сундука
        if farmer.findChest() then -- проверяем есть ли сундук
          for i= 2, robot.inventorySize() do -- сбрасываем урожай
            robot.select(i)
            robot.drop()
          end
          robot.turnAround() -- разворачиваемся на старт
          robot.select(1)        
          os.sleep(300) -- спим 5 минут
        end
      end
    end    
  end
end

 


 
Ферма на жердочках еще проще:


 
7aTdrP5.png

local computer = require('computer')
local robot = require('robot')
local farmer = require('farmer')

while true do
  energy = computer.energy()/computer.maxEnergy()
  if energy <= 0.1 then --  если энергии меньше 10%
    print('Уровень энергии менее 10%')
    os.sleep(300) -- спим 5 минут
  else
    robot.useDown()
    robot.forward()
    if robot.detect() then
      robot.useDown()
      if farmer.turn() then
        if farmer.findChest() then
          for i= 2, robot.inventorySize() do
            robot.select(i)
            robot.drop()
          end
          robot.turnAround()
          robot.select(1)        
          os.sleep(300)
        end
      end
    end    
  end
end

 

 

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

топорно и не интерактивно

 

Зато универсально, мне большего и не надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Зато универсально, мне большего и не надо.

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

Зато универсально, мне большего и не надо.

не говоря о том что встань на пути игрок или корова или зомби - привет твоей ферме

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

не говоря о том что встань на пути игрок или корова или зомби - привет твоей ферме

 

У меня таких проблем нет, проверку на сущности я убрал, чтобы не крашилось с самой слабой памятью.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

Вот пример для фермы цветов, в сундук перед запуском надо кинуть костную пыль, роботу нужен контроллер инвентаря и солнечная батарея (farmer - имя библиотеки).

 

 

local component = require('component')
local computer = require('computer')
local robot = require('robot')
local term = require('term')
local farmer = require('farmer')

local function findBoneMeal()
  robot.select(1)
  for sl = 1, component.inventory_controller.getInventorySize(3) do
    if component.inventory_controller.getStackInSlot(3, sl) == nil then
    else
      item = component.inventory_controller.getStackInSlot(3, sl)
      if item.name == 'minecraft:dye' and item.damage == 15 then
        component.inventory_controller.suckFromSlot(3, sl)
      end
    end
  end
end

robot.turnAround()
findBoneMeal()
robot.turnAround()

while true do
  energy = computer.energy()/computer.maxEnergy()
  if energy <= 0.1 then --  если энергии меньше 10%
    print('Уровень энергии менее 10%')
    os.sleep(300) -- спим 5 минут
  else
    term.clear()
    x = math.random(1, 10)
      if x <= 1 then
	    robot.select(1)
        robot.placeDown() -- ставит под себя костную муку, с вероятностью 10%
      end
    robot.swingDown() -- срезаем цветы и траву
	robot.suckDown()
	farmer.killer() -- если спереди есть сущность - убиваем
    robot.forward() -- делаем шаг
    if farmer.killer() then -- если нашли твердый блок
      robot.swingDown()
	  if farmer.turn() then -- переходим на новую линию
        if farmer.findChest() then -- ищем сундук
          for i= 2, robot.inventorySize() do  -- выбрасываем все, кроме сундка
            robot.select(i)
            robot.drop()
          end
          findBoneMeal() -- ищем костную муку
          robot.turnAround()
          os.sleep(30)
        end
      end
    end	
  end
end

 

 

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для фермы кактусов желателен апгрейд "луч захвата" или как его там. Кактусы даже рубить не надо, они сами "отваливаются" при приближении робота. Отваливаются и те, что сбоку от робота. Более половины урожая теряется при этом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Для фермы кактусов желателен апгрейд "луч захвата" или как его там. Кактусы даже рубить не надо, они сами "отваливаются" при приближении робота. Отваливаются и те, что сбоку от робота. Более половины урожая теряется при этом.

Робот должен быть над кактусами (максимальная высота кактуса 3 блока), тогда ничего не отваливается.

 

Кстати, хорошо, что тема всплыла, давно хотел поправить один баг и написать универсального фермера со строительством площадок.

Надо бы еще расширение фермы автоматизировать, а то вручную строить новые стены и фермленды довольно муторно.

Изменено пользователем Doob

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...