BarBoss 89 Опубликовано: 8 августа, 2015 (изменено) Имею дурацкую привычку накрывать свой приват стеклянным колпаком. Стены легко строятся руками, а вот горизонтальные поверхности - крыша и межэтажные перекрытия строить утомительно. Поручить это роботу - чего проще? Задавать роботу форму полигона координатами углов очень неудобно, потому руками строится внешний контур, а робот заполняет его в горизонтальной плоскости, следуя по кругу против часовой стрелки. Т.е. робота нужно ставить так, чтоб стенка была справа от него или перед ним. Требования к роботу - наличие апгрейдов инвентаря и "парение". Поскольку алгоритм примитивен, робот может сам себя поймать в ловушку из блоков. Этого можно избежать, контролируя наличие блоков не только справа но и слева. Но для этого робота нужно дополнительно поворачивать, что сильно замедлит работу. Он и так волчком крутится. Жаль, нет функции .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 -- есл попытка установить блок неудачна - заверщить работу. Изменено 8 августа, 2015 пользователем BarBoss 4 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
1Ridav 1 049 Опубликовано: 8 августа, 2015 функции старайся кешировать. local select = r.select local turnRight = r.turnRight а затем вызывай напрямую select() turnRight() и тд. Связанно это с особенностями работы Lua, таким образом уберешь лишние операции 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах