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

quarry карьер

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

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

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


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

Если натыкается на шахту ( с рельсами и прочее) часто возвращается на базу с ошибкой не разрушимый блок. Отправляешь обратно- копает дальше.

 

если дать бур, который копает 3х3. То через минут 10 возвращается. Мол все выкопано. Так же при копании киркой. Если натыкается на высокие пещеры.
 

Был баг какой то... вернулся на базу, сломал сундук и пишет нет сундука😀

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


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

 

2 часа назад, van2614 сказал:

Если натыкается на шахту ( с рельсами и прочее) часто возвращается на базу с ошибкой не разрушимый блок. Отправляешь обратно- копает дальше.

рельсы кстати в отладки не участвовали, возможно с ними есть подвох

 

2 часа назад, van2614 сказал:

если дать бур, который копает 3х3. То через минут 10 возвращается. Мол все выкопано. Так же при копании киркой. Если натыкается на высокие пещеры.

тут явно подвох с определением бедрока

 

2 часа назад, van2614 сказал:

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

 а вот этого он делать не должен, похоже функция goto() шалит

 

@van2614 спосиб за инфу, попробую отловить баги

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


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

С рельсами пока не понятно

для теста извоял прогу

Скрытый текст

local r = require("robot")
local com = require("component")
local gpu = com.gpu

local place = 0
local broke = 0

os.execute("cls")

while r.durability() do
  gpu.set(20,1,"поставил  "..place)
  gpu.set(20,2,"сломал    "..broke)
  if r.place() then
    place = place + 1
  end
  if r.swing() then
    broke = broke + 1
  end
end

 

S8tZ0bh.png  робот спокойно ломает рельсы, попробую поискать шахту

 

Бур в режиме 3х3 действительно вызывает баг, из за того что робот видит блок под собой, а его уже нет

исправлю изменив обнаружение бедрока

 

4 часа назад, van2614 сказал:

Если натыкается на высокие пещеры.

По всей видимости нет улучшения парения qFuOlvy.png без него он не сможет двигается над пустотой

пожалуй добавлю в статус вместо "непреодолимое препятствие" что-то типа "не могу подняться"

а ещё лучше каким то образом проверять наличие улучшения

 

4 часа назад, van2614 сказал:

вернулся на базу, сломал сундук

тут посложнее, бум искать

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

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


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

@serafim, у меня возникли вопросы в связи с этим кусочком кода:

        if r.forward() then
          xPos = xPos - 1
        else
          r.swing()
        end

Ты пришёл к этому решению интуитивно, или подсмотрел его в других программах?

 

Это очень важный вопрос, т. к. касается не только твоей копалки, но и многих других. Подобное решение, будучи неоптимальным, встречается повсеместно. Тут сначала происходит попытка движения, а затем рубка блока, если попытка не удалась. Мне интересно понять, как мыслят программисты, применяющие такое решение. А их, похоже, большинство.

 

Идея поменять порядок операций движения робота и рубки блока кажется тебе контринтуитивной?

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


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, serafim сказал:

робот спокойно ломает рельсы, попробую поискать шахту

Рельсы ломал. Упирался в стену пещеры. Причём в одну. Хотя пещеры было две. Было много проблем пока копал сверху. Пещеры очень мешают. Когда спустил его ниже, где не было ничего подобного копал без проблем.

 

2 часа назад, serafim сказал:

По всей видимости нет улучшения парения qFuOlvy.png

Стоит 2 лвл

 

2 часа назад, serafim сказал:

тут посложнее, бум искать

Он в очередной раз вернулся с ошибкой. Потом я нажал Y и он почему то развернулся и сломал сундук. Было так

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


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, eu_tomat сказал:

Ты пришёл к этому решению интуитивно, или подсмотрел его в других программах?

подобная конструкция используется ещё с computercraft с черепашек

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

как мыслят программисты, применяющие такое решение. А их, похоже, большинство.

это из серии работает, не лезь :)

но это не значит что не нужно искать более оптимальный вариант

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

Идея поменять порядок операций движения робота и рубки блока кажется тебе контринтуитивной?

1 если робот не может идти вперёд ( значит что-то ему мешает (блок,моб,игрок) ) - атакуй

2 если робот не может атаковать или разрушить блок (значит перед роботом пусто) - идём вперёд

 

В первом случае робот будет максимально быстро идти, пока во что-то не упрётся, затем атакует и пойдёт дальше

Во втором случае робот будет махать киркой а затем идти, не важно есть там что-то или нет

 

Возможно верным решением будет смотреть если перед роботом что-то, а затем пробывать идти

чтото типа этого, а ещё лучше вывести функцию

while true do
  if r.detect() then
    r.swing()
  elseif r.forward() then
    xPos = xPos - 1
    break
  end
end

 

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

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


Ссылка на сообщение
Поделиться на других сайтах
58 минут назад, van2614 сказал:

Упирался в стену пещеры. Причём в одну. Хотя пещеры было две

бур в режиме 3х3 ?

 

58 минут назад, van2614 сказал:

Он в очередной раз вернулся с ошибкой. Потом я нажал Y и он почему то развернулся и сломал сундук. Было так

Вот, это уже лучше, развернулся потому что последний раз при копании карьера смотрел в сторону сундука

А вот сломать сундук он не должен был, возможно остаточная команда

Ок, так будет проще найти косяк

 

Или как вариант перед спуском разворачивается в сторону карьера,

в общем навигация на доработку, помойму это уже в 4й раз :)

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

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


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

На данный момент определение бедрока сводится к одному условию

if r.detectDown() and not r.swingDown() then
  status("низ достигнут !")
  bedrock = true
end

Если робот видит под собой блок, но не может его сломать, то это бедрок

Вообще работает безотказно на всём инструменте. как оказалось не на всём:diablo:

Бур в режиме 3х3 не возвращает информацию, сломал он блок или нет в итоге беда,

робот считает что он уже возле бедрока, и это последний слой который нужно выкопать

 

Тут можно попробовать иной подход, после взмаха смотреть изменился ли инвентарь,

хотя бы просто ловить событие "inventory_changed"

В общем можно попробовать

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


Ссылка на сообщение
Поделиться на других сайтах
18 минут назад, serafim сказал:

1 если робот не может идти вперёд ( значит что-то ему мешает (блок,моб,игрок) ) - атакуй

2 если робот не может атаковать или разрушить блок (значит перед роботом пусто) - идём вперёд

Возможно верным решением будет смотреть если перед роботом что-то, а затем пробывать идти

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

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

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

 

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

  • 10 тиков на неудачную попытку движения.
  • 6 тиков (предположим) на рубку блока.
  • 8 тиков на успешную попытку движения.

В случае, если робот сначала бьёт, а затем двигается:

  • 6 тиков на рубку блока
  • 8 тиков на движение

Скорость продвижения увеличится в 24/14=1.71 раза. При сплошной копке "слой через два" ускорение не столь высоко, но всё равно ощутимо: в 1.38 раз. В случае, если перед роботом нет препятствий, и он выполняет неудачный взмах киркой до выполнения движения, произойдёт замедление в (1+8)/8 = 1.125 раза. Но при работе в шахте препятствие перед роботом чаще присутствует, нежели отсутствует.

 

Применив подобные расчёты для варианта с использованием detect(), ты обнаружишь, что его применение вредно. По крайней мере, в шахте без больших полостей.

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


Ссылка на сообщение
Поделиться на других сайтах
31 минуту назад, serafim сказал:

Тут можно попробовать иной подход, после взмаха смотреть изменился ли инвентарь,

хотя бы просто ловить событие "inventory_changed"

В общем можно попробовать

Сигнал "inventory_changed" будет поступать только после заполнения очередного стака, то есть, в среднем при каждом 9/64 взмахе бура. Это ненадёжный метод. С другой стороны, и опрашивать robot.count() по всем слотам тоже не вариант.

 

Видимо, надо сначала оптимизировать эту проверку, проверяя только неполные слоты, а применять её только в случае, когда робот ушёл в шахту именно с этим видом бура. Обработка сигнала inventory_changed должна облегчить поиск неполных слотов.

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


Ссылка на сообщение
Поделиться на других сайтах
10 минут назад, eu_tomat сказал:

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

кстати да, в основном карьер заполнен блоками

для копания видимо нет смысла проверять наличие блока

а вот двигаясь к сундуку и обратно, робот идёт по пустоте, предпочтительней будет именно двигаться

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

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

Меня так-то и вариант с невозможностью сломать блок под роботом вполне устраивал

В общем посмотрим

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


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

я думаю можно поступить проще, если условие if r.detectDown() and not r.swingDown() then срабатывает,

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

в случае бура 3х3 оно выполнится только один раз, если внизу бедрок, то все три.

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


Ссылка на сообщение
Поделиться на других сайтах
11 минуту назад, serafim сказал:

Меня так-то и вариант с невозможностью сломать блок под роботом вполне устраивал

Обычная развилка: либо дописывать документацию, что с таким-то инструментом программа не работает, либо дописывать новый функционал. Добро пожаловать в разработку.

 

Кстати, если речь идёт о синем буре 3x3 из Gravitation Suite, то для него оптимален другой алгоритм копки. Поэтому придётся не только детектор бедрока, но и всю копалку переписывать. Эта копалка просто не может реализовать весь потенциал синего бура.

 

15 минут назад, serafim сказал:

для копания видимо нет смысла проверять наличие блока

а вот двигаясь к сундуку и обратно, робот идёт по пустоте, предпочтительней будет именно двигаться

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

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


Ссылка на сообщение
Поделиться на других сайтах
4 минуты назад, eu_tomat сказал:

если речь идёт о синем буре 3x3 из Gravitation Suite, то для него оптимален другой алгоритм копки

ох уж этот синий бур :D

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

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

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

робот тягает один запасной инструмент если он есть, так что не страшно

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

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


Ссылка на сообщение
Поделиться на других сайтах
28 минут назад, serafim сказал:

я думаю можно поступить проще, если условие if r.detectDown() and not r.swingDown() then срабатывает,

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

в случае бура 3х3 оно выполнится только один раз, если внизу бедрок, то все три.

Можно и так. Но тут свои сложности. Помню, у нас на серверах роботу было запрещено бить игрока. В этом случае такая проверка посчитает игрока за бедрок.

 

Кстати, есть и другие причины для срабатывания этого условия. Например, твёрдость инструмента недостаточна для добычи блока. Или там чей-то приват обнаружился. Или укреплённое стекло из Таумкрафта. Хорошо было бы предупреждать игрока о высоте, на которой был обнаружен этот "бедрок".

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


Ссылка на сообщение
Поделиться на других сайтах
12 минуты назад, eu_tomat сказал:

Можно и так. Но тут свои сложности. Помню, у нас на серверах роботу было запрещено бить игрока. В этом случае такая проверка посчитает игрока за бедрок.

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

в любом случае пока это самый безболезненный вариант

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

Хорошо было бы предупреждать игрока о высоте, на которой был обнаружен этот "бедрок".

в принципе можно

так то он в случае ошибки последние координаты принтит

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

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


Ссылка на сообщение
Поделиться на других сайтах
36 минут назад, eu_tomat сказал:

Да, адаптивность полезна. Тут вопрос лишь в том, готов ли разработчик усложнять алгоритм ради коротких эпизодов перемещения к сундуку

тут кстати норм, копание и навигация раздельно работает (так робот не делает лишних поворотов, да и мне так проще)

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


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

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

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

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

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

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

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

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

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


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