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

[OC 1.6] Спиральный геокоп

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

1) На версии 1.6 работает исправно? 2)Опять же на версии 1.6 в EEPROM удалось приспособить программу? 3)Улучшения предвидятся или программа готова? (ну или безнадежно заброшена)

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


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

Видишь же в топике [OC 1.6]. Работает прекрасно, проверял сам. Чего ей ещё нужно — не представляю. Она же копать только должна.

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

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


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

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

Поэтому, считаю, что работа закончена.

Теперь надo пoтрудиться забыть кoд и взяться писать бoлее сoвершенную кoпалку с нуля.

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

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


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

в чём прикол такой конструкции: geolyzer.scan(tCmps[c][1], tCmps[c][2], 0, 1, 1, 1)[1]

 

особенно учитывая это: scan(x:number, z:number[, ignoreReplaceable:boolean]):table

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


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

Сканирование блока рядом c роботом, чтобы узнать, в каком направлении он cмотрит. Без информации о направлении иcпользование геоcканера не имеет cмыcла, чтобы не задавать его вручную, функция ломает блок перед роботом, cканирует, cтавит блок, опять cканирует и, еcли еcть разница в двух cканах - уcтанавливает cтороны cвета.

local C = {{-1,0}, {0,-1}, {1,0}, [0]={0,1}} -- номер ячейки = сторона света
while not d do -- пока не определена сторона
  robot.turn(true)
  for c = 0, 3 do
    robot.swing(3) -- разрушить блок
    if N(C[c][1], C[c][2], 0, 1, 1, 1)[1] == 0 and robot.place(3) then -- сканирование и установка блока
      if N(C[c][1], C[c][2], 0, 1, 1, 1)[1] > 0 then -- если есть разница
        d = c -- задается сторона
        break -- выход из цикла
      end
    end
  end
end

Тут есть информация.

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

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


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

Ясно т.е. на 1.5.x не будет работать. 8( У тебя сохранился код(если был) для 1.5?

 

Ешё, такой возник нюанс. Робот при возвращении на разгрузку/зарядку, с твоей прогой всегда возвращается мордой в одну сторону? Можно отследить, куда он смотрит? Необходимость возникла из-за проблемы с урезанием функционала апи контролера инвентаря на некотрых серверах.

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


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

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

 

Смотреть он мoжет в любую сторону, смотря откуда приехал. Можно задать в кoде сторoну на финише, но придется зарядник и сундук всегда ставить на указанные cтoроны.

А что урезают, помимo пoдсчета cлотов?

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

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


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

Если "обрезать" параметры из 1.6, он останется работоспособным?

 

Работу с внешними контейнерами. Собственно как раз столкнулся с проверкой на сундук перед мордой в моём "карьеряшке" - а getInventorySize всегда возвращает nil, что тупо привело к полному рязряду робота - он ждал, когда вместо сундука перед ним поставят сундук. =В

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

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


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

Тут используется фича геолайзера, которая появилась только в 1.6.

 

А если брать не размер инвентаря, а getStackInSlot? Если рабoтает, тo можнo нaписать небольшую функцию, кoторая будет определять нaличие и размер инвентaря, инaчe в этом апгрейде вoобще нет смысла.

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


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

Ясно.... Придётся таки пилить комп с инет картой и грузить твой провереный форк геокопа моего тёзки. =)

 

Гляну, чуть позже. По крайней мере getStackInInternalSlot работает, может и эту не обрезали.

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


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

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

http://pastebin.com/abmQgbCy

 

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

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


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

Хорошая идея, гайд вроде: "Пишем копалку с нуля", "Пишем Hologram Editor с нуля", "Пишем OpenNet с нуля". У начинающих программистов должно пользоваться интересом.

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


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

Образцовый гайд это хорошо, да.

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

=)

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


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

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

http://pastebin.com/abmQgbCy

 

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

Очень интересно. Работа в EEPROM также неочевидна и интересна. Например мне категорически не удалось в EEPROM получить заряд батарей робота. И аналог os.sleep() не придумался.

P.S. Я правильно понял, что геокоп копает вокруг себя в радиусе 8 блоков?

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


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

Очень интересно. Работа в EEPROM также неочевидна и интересна. Например мне категорически не удалось в EEPROM получить заряд батарей робота. И аналог os.sleep() не придумался.

local gpu = component.proxy(component.list("gpu")())
local screen = component.list("screen")()

function sleep(timeout)
  local deadline = computer.uptime() + (timeout or 0)
  repeat
    computer.pullSignal(deadline - computer.uptime())
  until computer.uptime() >= deadline
end

gpu.bind(screen)
gpu.setForeground(0xFFFFFF)
gpu.setBackground(0x000000)

while true do
  gpu.set(1, 1, tostring(computer.energy()))
  sleep(10)
end
Изменено пользователем Totoro

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


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

Если не хочется городить таймер, можно использовать computer.beep() - предел 5 секунд. Поэтому, если надо дольше, то все-равно придется делать цикл.

 

Робот в цикле сканирует под собой квадрат x8 блоков, если обнаружены блоки из указанного диапазона - обходит их все, если обнаруживает блок с отрицательной плотностью (по-дефолту -0.3, это максимальная плотность бедрока при обычном уровне шума) завершает цикл и переходит к следующему столбу. Если же никаких блоков не найдено, то опускается, сканирует и т. д.

 

Столбы x8 блоков обходятся по спирали (чтобы робот обрабатывал максимум блоков в пределах загруженных чанков), пока робот идет вниз, он не выходит за пределы столба - при каждом сканировании делается поправка.

 

Я гонял копалку на специальном стенде - размечал квадраты бедроком (где-то на 10 блоков под роботом), через дебаг-карту заливал руды между роботом и бедроком, запустив робота можно увидеть весь алгоритм сканирования и добычи как на ладони.

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

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


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

Если не хочется городить таймер, можно использовать computer.beep() - предел 5 секунд. Поэтому, если надо дольше, то все-равно придется делать цикл.

 

Слип который я показал выше - это практически каноничная его реализация.

Каждый раз когда вы пишете os.sleep(x) вызывается очень похожая функция.

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

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


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

В копалке она совмещена с бибиканьем и бродкастом статусного сообщения.

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


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

Износ инструмента из тинкерса он, похоже, не распознаёт.

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


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

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

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

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

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

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

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

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

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


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