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

KleptoMMT5

Пользователи
  • Публикации

    5
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные пользователем KleptoMMT5


  1. В связи с тем, что у робота благодаря улучшению "Контроллер инвентаря"  имеется возможность вытаскивать нужные блоки из любого места хранилища, я решил упростить подпрограмму объединения ячеек хранилища. Она может работать и без данного улучшения, но потом... это улучшение обязательно понадобится(когда робот начнет строить).

    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
    
    

  2. 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" - это не ошибка, это для наглядности.

     

    Смысл идеи таков: перед стартом строительства на экран робота можно выдать список сверки имеющихся предметов, а реализована идея - великолепно!
    Спасибо за хорошую идею!


  3. VeLLeSSS, если бы не ты, со своей программой, то я бы ни за что не взялся бы делать свою программу для робота!
    Спасибо тебе за практический пример использования функций в цельной программе!

    Я смог разобраться "что к чему" и "как" - работает в ней: и начал делать свою программу, взяв за основу - твою ))
    Но в итоге, я глубоко переработал тело программы, да так, что от твоей программы у меня осталась только "шапка", да несколько строк диалогов.
    Остальное все новое.
    Потом выложу свою, чтобы было лучше понятно о чем говорю.

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


  4. Интересная возможность, Doob!
    Не знал что есть такая функция с подтягиванием в таблицы.
    И спасибо за свой вариант отбора материалов при помощи таблиц!

    Единственное, что - не достаточно разложить пачки в таблице последовательно, необходимо еще отслеживать текущее число каждого типа материала.
    Хорошим вариантом будет сделать две таблицы: одна для упорядочивания по типам, другая для управления направлением работой робота.
    Возможно функцию обращения во внутрь робота удастся применить, если найду как создавать и работать с таблицами.

    Я тут подумал... Оказывается, моя программа может работать на более дешевом роботе, без проблем )
    можно поставить еще одно улучшение на 16 ячеек и спокойно выравнивать поверхность, строить дороги.

    Но с таблицами по-интереснее будет. Т.к. полновесные пачки по 64 шт. можно запихать в робота вручную, без использования данной программы, а с программой - важно уметь распорядиться результатами её работы, иметь применение и не просто так держать улучшение в разъеме робота.
     


  5. Есть задача - сделать для строительного робота сортировку предметов в хранилище.

    Данная подпрограмма только объединяет предметы в пачки и укладывает пачки друг за другом.

     

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

     

    Но было бы интересно узнать как это сделать для бесконечного количества типов материалов, а не для 1-6 типов; без использования констант.

     

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

     

    А пока что есть подпрограмма, выполняющая предварительные действия перед началом строительства:

    http://pastebin.com/cq60v1tB

    • программа объединяет материал, разбросанный по хранилищу робота, в полновесные пачки (64 шт. в пачке максимум);
    • и упорядочивает местоположение пачек так, чтобы они шли друг за другом, начиная с первой ячейки хранилища робота;
    • нет сортировки по типу материалов - пачки материалов идут вразнобой, случайным образом;
    • программа является частью другой программы, необходимой строительному роботу для начала бесперебойного строительства;
    • комментарии в программе предназначены для новичков и не программистов (типа меня); они помогают понять происходящее;
    • по этой же причине не убран неиспользуемый код из программы.

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

     

     

    Используемые термины:

    Ячейка == slot
    Хранилище == inventory
    Пачка == stack

     

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