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

Alexhotice

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

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

  • Посещение

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


  1. 1 час назад, eu_tomat сказал:

    Это сложнее. Тут появляется множество вариантов, эффективных в своих условиях и при этом неэффективных в других. И какие условия возникли конкретно у тебя, я не знаю. но я попробую объяснить суть проблемы.


    В случае генератора булыжника есть только один непрерывно добываемый малоценный ресурс.


    Если сундук находится над или под роботом, то оптимизация сводится к тому, чтобы перемещать ресурсы полными стаками. Робот перемещает хоть один предмет из слота, хоть полный стак за одинаковое время. А это значит, что выгодно перемещать наиболее полный стак. Заполнение слота легко отслеживается.


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


    Гораздо больше вопросов вызывает перелопачивание руды киркой.


    С точки зрения оптимизации действий робота он должен выгружать свой инвентарь, когда хоть-что появится в последнем слоте. А если речь идёт о рудах GT, где может выпасть вторичный ресурс, то сигналом для выгрузки будет появление предмета в предпоследнем слоте.


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


    Но тут возникает новый подводный камень. Эта схема удобна в случае огромного количества руды. У неё есть большой потенциал на поздних стадиях уже упомянутого GT. Но в начале игры, когда ресурсов мало, робот будет ждать полного заполнения своего инвентаря, долго не отдавая переработанные ресурсы, что неудобно.


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


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

    Я сделал гораздо легче(Так как я понимал и знал как сделать), один робот ставит руду, которая попадает в него с МЭ системы, второй срубает ее и закидывает обратно в МЭ систему. Проблему с высасыванием бура решил постановкой в шинах фильтра на те руды

     

    Робот который ставит:

    local c = require("component")
    local robot = require("robot")
    while true do
      c.robot.place(3)
      os.sleep(0.05)
    end

    Робот который ломает:

    local c = require("component")
    local robot = require("robot")
    local inv = c.inventory_controller
     
    while true do
      if robot.durability() <= 0.2 then
        robot.turnAround()
        inv.equip()
        robot.drop()
        os.sleep(15)
        robot.suck()
        inv.equip()
        robot.turnAround()
      end
      c.robot.swing(3)
      os.sleep(0.04)
    end

    Вот так они стоят:

    1077869153_.gif.87ff025c2ac723d5f2364b63e5138a7d.gif


  2. 10 минут назад, eu_tomat сказал:

    Похоже, я не с первого раза понял вопрос.

     

    Требуется уточнить, что это за механизм, чтобы выбрать эффективный вариант проверки заполнения инвентаря. Это генератор булыжника?

    нет, один робот ставит руду, второй ломает эту руду буром с удачей. Робот у которого у меня возник вопрос ломает


  3. Я только осваиваю данный язык, прошу не кидаться тапками за незнание. Есть небольшая программа для робота, которая позволяет копать ему блоки(робот стоит на месте). При попытке запуска на новом роботе выбивает ошибку. Устанавливал ОС - robot не смог установить, устанавливал robot - не давало записать файл. Робот в котором сейчас стоит данная прога, работает хорошо и никаких траблов(ставил его не я), с тем человеком нет возможности связаться, а разобраться почему не работает у меня хочется.

    local c = require("component")
    local robot = require("robot")
    local inv = c.inventory_controller
     
    while true do
      if robot.durability() <= 0.2 then
        robot.turnAround()
        inv.equip()
        robot.drop()
        os.sleep(15)
        robot.suck()
        inv.equip()
        robot.turnAround()
      end
      c.robot.swing(3)
      os.sleep(0.04)
    end

    image.png.9c04d42317ccbff20ab1b58dbb96b495.png


  4. 4 минуты назад, eu_tomat сказал:

    Как реализовать функцию online(nick)

    это я знаю, сделал.

    5 минут назад, eu_tomat сказал:

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

    а как тут цвет можно установить?


  5. 10 минут назад, Totoro сказал:

    Что за фазы ты имеешь в виду?

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

    что-то вроде "Alexhotice [Online] пчелки" вот это последнее слово чтобы отличалось цветом от ника и статуса  и присвоить каждому свое

     

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


  6. Как в код можно встроить проверку на ник и в сети/отошел ли он. Есть код, который проверяет ник в сети и меняет его статус на "онлайн". Как вместе со сменой статуса, можно рядом дописывать определенную фразу, к каждому игроку свою?


  7. 1 минуту назад, whiskas сказал:

     

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

     

    спасибо, уже находил, но било ошибку во всех

     

    немного поколдовав и соединив некоторые строки удалось запустить


  8. Только что, Asior сказал:

    Ясен пень не найден. Тебе дали голый кусок кода который сработает только через lua. Как создать программу и подключить библиотеки думаю догадаешься.

    вряд ли, я только начинаю  разбираться в языке, и первая программа, с которой сог разобраться, мне помогали делать 2 дня


  9. 54 минуты назад, Totoro сказал:

    Значит придется по отдельности на каждую сторону сетить.

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


  10. 13 минут назад, Asior сказал:

    Почитай вначале

    изменил я на эту часть,

    com.invoke(address, "setOutput", {
        [sides.front] = 15,
        [sides.back] = 15,
        [sides.left] = 15,
        [sides.right] = 15,
        [sides.top] = 15,
        [sides.bottom] = 15
      })

    и

    com.invoke(address, "setOutput", {
        [sides.front] = 0,
        [sides.back] = 0,
        [sides.left] = 0,
        [sides.right] = 0,
        [sides.top] = 0,
        [sides.bottom] = 0
      })

    после того как, первый раз засекла выбило ошибку

    image.png.a18153c9767a4b21055fd3e53bf0d9e1.png


  11. 13 минут назад, Totoro сказал:

    Блок:

    
    if not monsters then
      ...
    end

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

    Это же проверка имени того, на кого "сагрился" датчик.

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

     

    Ты можешь оформить проверку как функцию (и тогда ее можно будет как раз оставить в начале программы):

    
    function isMonster(name)
      for i=1, #monsterlist do
        if name == monsterlist[i] then return true end
      end
      return false
    end

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

    
    while true do
        local _, address, x, y, z, name = event.pull('motion')
        if isMonster(name) then
          print("Это был моб...")
        else
          print("Кто-то ломится в дом!")
        end
    end

     

     

    тогда как-то будет выглядеть?

    local event = require('event')
    local com = require('component')
    local sensor = com.motion_sensor
    local sides = require('sides')
    local monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"}
    
    function isMonster(name)
      for i=1, #monsterlist do
        if name == monsterlist[i] then return true end
      end
      return false
    end
    
    while true do 
    local _, address, x, y, z, name = event.pull('motion') 
      if isMonster(name) then 
      print("Это был моб...") 
        else print("Кто-то ломится в дом!") 
      end 
    end

     

     


  12. 7 минут назад, Asior сказал:

    local event = require('event') local com = require('component') local sensor = com.motion_sensor local sides = require('sides') local red = com.list('redstone') local monsterlist = {"Spider", "Zombie", "Creeper", "Skeleton", "Enderman", "Sheep", "Cow", "Chicken"} local function monsterScan(name) for i=1, #monsterlist do if name == monsterlist[i] then return false end end return true end while true do local _, address, x, y, z, name = event.pull('motion') if monsterScan(name) then print(name) for address, _ in pairs(red) do com.invoke(address, "setOutput", sides.front, 15) end os.sleep(4) for address, _ in pairs(red) do com.invoke(address, "setOutput", sides.front, 0) end end end

    спасибо большое


  13. 7 минут назад, Asior сказал:

    redstone.setOutput(sides.front, 0) тут судя по всему ошибка или недописка. Подумай сам, если ты включил ВСЕ предположим 5 контроллеров, то потом сколько надо выключить?

    окей, тут переписываю на com.redstone(address, "setOutput", sides.front, 0)

    8 минут назад, Asior сказал:

    local red = computer.list('redstone')

    объявил, но в строке, где я задаю им мощность, com.redstone(address, "setOutput", sides.front, 15) выбивает ошибку

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