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

Робот - кровельщик

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

Имею дурацкую привычку накрывать свой приват стеклянным колпаком. Стены легко строятся руками, а вот горизонтальные поверхности - крыша и межэтажные перекрытия строить утомительно. Поручить это роботу - чего проще?

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

Требования к роботу - наличие апгрейдов инвентаря и "парение".

Поскольку алгоритм примитивен, робот может сам себя поймать в ловушку из блоков. Этого можно избежать, контролируя наличие блоков не только справа но и слева. Но для этого робота нужно дополнительно поворачивать, что сильно замедлит работу. Он и так волчком крутится. Жаль, нет функции .detectLeft() :)

 

 

 

-- Робот - заполнитель. Делает пол или крышу произвольной формы.
-- Заполняет блоками плоскость по горизонтали следуя вдоль правой границы
-- Выложить замкнутый контур и установить робота так, чтоб стенка была справа от него или перед ним.
-- Слоты должны быть заполнены материалом подряд, без пропусков
-- Прерывает работу, если не сможет установить блок - кончились блоки или всё заполнено.
local r = require("robot")
local component = require("component")
local curslot = 1 -- слот, из которого берём блоки для заполнения
local tmp = false -- флаг установлен ли блок для выхода из цикла
local flag = false -- флаг наличия блока справа.


function PlaceBack() -- поставить блок сзади робота
 r.select(curslot)
 r.turnRight()         -- Напрааа-во!
 flag = r.detect()     -- запомним наличие блока справа
 r.turnRight()
 tmp = r.place()     -- установим блок и запомним, удалось ли это сделать.
 r.turnAround()     -- Крууу-гом!

 -- Если слот с блоками опустел, перейдём к следующему
 if r.count(curslot) == 0 then curslot = curslot + 1 end
 if r.count(curslot) == 0 then tmp = false end -- если следующий тоже пуст, прекратить работу
end  

repeat

  r.forward()    -- шаг вперёд
  PlaceBack()    -- поставить блок сзади

  if flag == false   
  then r.turnRight() -- если справа пусто поворот направо
  end

  if r.detect()   
  then r.turnLeft() -- если прямо блок поворот налево  
  end

    if r.detect()   
  then r.turnLeft() -- если опять упёрлись в блок поворот налево  
  end

until tmp == false -- есл попытка установить блок неудачна - заверщить работу.

 

 

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

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


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

функции старайся кешировать.

local select = r.select

local turnRight = r.turnRight

 

а затем вызывай напрямую select() turnRight() и тд.

Связанно это с особенностями работы Lua, таким образом уберешь лишние операции

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


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

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

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

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

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

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

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

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

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


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