KleptoMMT5
-
Публикации
5 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем KleptoMMT5
-
-
Doob, в обеих программах выявлены ошибки:
1. синтаксические - нужно писать "component.inventory_controller.getStackInInternalSlot(slot)", добавляя "component."
2. смысловые - в 99% случаев новичку не понятен смысл существования второй программы; для новичков необходимо писать результаты работы программы в самой программе, чтобы начать уже разбираться с идеей, а не с механикой неизвестной и непонятной программы.
Я исправил обе явные ошибки и вторая программа выглядит теперь вот так:
local component = require("component") local robot = require("robot") local term = require("term") tbl = {} -- создать таблицу for slot = 1, robot.inventorySize() do -- пройтись по всем слотам item = component.inventory_controller.getStackInInternalSlot(slot) if item then if tbl[item.label] then -- если есть предмет в таблице tbl[item.label] = tbl[item.label]+item.size -- добавить количество в текущем слоте else tbl[item.label] = item.size -- создать новый элемент со значением end end end for key,value in pairs(tbl) do -- распечатать содержимое таблицы tbl и увидеть результаты работы программы print("tbl["..key.."] = "..value) endДля наглядности результатов "item.name" был заменен на "item.label" - это не ошибка, это для наглядности.
Смысл идеи таков: перед стартом строительства на экран робота можно выдать список сверки имеющихся предметов, а реализована идея - великолепно!
Спасибо за хорошую идею! -
VeLLeSSS, если бы не ты, со своей программой, то я бы ни за что не взялся бы делать свою программу для робота!
Спасибо тебе за практический пример использования функций в цельной программе!
Я смог разобраться "что к чему" и "как" - работает в ней: и начал делать свою программу, взяв за основу - твою ))
Но в итоге, я глубоко переработал тело программы, да так, что от твоей программы у меня осталась только "шапка", да несколько строк диалогов.
Остальное все новое.
Потом выложу свою, чтобы было лучше понятно о чем говорю.
Ах, да! Повороты же еще добавил из этой темы!
Идея с поворотами - бесподобна!
Рекомендую использовать, идея легка и надежна. -
Интересная возможность, Doob!
Не знал что есть такая функция с подтягиванием в таблицы.
И спасибо за свой вариант отбора материалов при помощи таблиц!
Единственное, что - не достаточно разложить пачки в таблице последовательно, необходимо еще отслеживать текущее число каждого типа материала.
Хорошим вариантом будет сделать две таблицы: одна для упорядочивания по типам, другая для управления направлением работой робота.
Возможно функцию обращения во внутрь робота удастся применить, если найду как создавать и работать с таблицами.
Я тут подумал... Оказывается, моя программа может работать на более дешевом роботе, без проблем )
можно поставить еще одно улучшение на 16 ячеек и спокойно выравнивать поверхность, строить дороги.
Но с таблицами по-интереснее будет. Т.к. полновесные пачки по 64 шт. можно запихать в робота вручную, без использования данной программы, а с программой - важно уметь распорядиться результатами её работы, иметь применение и не просто так держать улучшение в разъеме робота.
-
Есть задача - сделать для строительного робота сортировку предметов в хранилище.
Данная подпрограмма только объединяет предметы в пачки и укладывает пачки друг за другом.
Мне нужно чтобы пачки шли паровозиком - друг за другом, и имели один и тот же тип материала: сначала ряд пачек одного материала, потом ряд пачек другого материала. Кроме того, начало и конец этих рядов должен быть записан в константы, для последующего вызова. Есть идея как это сделать.
Но было бы интересно узнать как это сделать для бесконечного количества типов материалов, а не для 1-6 типов; без использования констант.
Если вы знаете как сделать сортировку и маркировку для бесконечного количества типов материалов при помощи массивов или еще как-то, без определения локальных переменных вручную, то буду рад увидеть ваше решение.
А пока что есть подпрограмма, выполняющая предварительные действия перед началом строительства:
- программа объединяет материал, разбросанный по хранилищу робота, в полновесные пачки (64 шт. в пачке максимум);
- и упорядочивает местоположение пачек так, чтобы они шли друг за другом, начиная с первой ячейки хранилища робота;
- нет сортировки по типу материалов - пачки материалов идут вразнобой, случайным образом;
- программа является частью другой программы, необходимой строительному роботу для начала бесперебойного строительства;
- комментарии в программе предназначены для новичков и не программистов (типа меня); они помогают понять происходящее;
- по этой же причине не убран неиспользуемый код из программы.
Понятия не имею как работать с массивами. Понятных, рабочих примеров их использования не нашел и не понял суть их работы и применения.
Используемые термины:
Ячейка == slot
Хранилище == inventory
Пачка == stack

Подпрограмма объединения предметов в хранилище робота
в Программы новичков
Опубликовано:
В связи с тем, что у робота благодаря улучшению "Контроллер инвентаря" имеется возможность вытаскивать нужные блоки из любого места хранилища, я решил упростить подпрограмму объединения ячеек хранилища. Она может работать и без данного улучшения, но потом... это улучшение обязательно понадобится(когда робот начнет строить).
local component = require("component") local robot = require("robot") local term = require("term") local vcegoyacheek = robot.inventorySize() -- определение сколько всего ячеек, присвоение постоянной этого значения; кэш значения, постоянная -- задача подпрограммы: объединить ячейки хранилища для эффективного использования robot.select(1) -- встать на первую ячейку for i=1, vcegoyacheek do -- идем по всем ячейкам if (robot.count(i) > 0) and (robot.space(i) ~= 0) then -- если ячейка имеет предметы (кол-во) и не полная robot.select(i) -- встать на текущую ячейку for m = (i+1), vcegoyacheek do -- ищем совпадающие материалы по всему хранилищу if (robot.compareTo(m) == true) and (robot.space(i) ~= 0) then -- если материалы совпадают и найденная ячейка не полная, то её попытаться добавить в исходную robot.select(m) -- встать на перебрасываемую ячейку robot.transferTo(i,robot.space(i)) -- передать материалы в допустимом объеме в исходную ячейку из найденной robot.select(i) -- встать на исходную ячейку, чтобы продолжить поиски внутри цикла "m" elseif robot.space(i) == 0 then -- если пачка полная, то перекидываем её поближе и выходим из цикла for k = 1, i do -- цикл ищет пустую ячейку между первой ячейкой хранилища и обрабатываемой в текущей момент по циклу (i). за пределами (i) - цикл (k) ничего не видит и там могут быть остатки. if robot.count(k) == 0 then -- если пустая ячейка найдена robot.transferTo(k) -- тупо перенос в пустую ячейку из текущей по (i). задачи переноса вполнены. break -- немедленный выход из цикла (k), чтобы продолжить работу цикла (m) end end -- цикл(k) необязателен, его можно удалить и все будет работать. Он просто, для красоты, переносит пачки в незанятые ячейки. Тратит некоторое время на свою работу. break -- немедленный выход из цикла (m) end end end end