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

Робот "пропускает" ходы во время движения

Вопрос

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

 

Заметил, что часто это лечат так:

robot.forward(); os.sleep(0.5)

Кто-то ставит счетчик движения по координатам.

function go() 
   while not robot.forward() do 
      robot.swing() 
   end 
   coords.x=coords.x + sx[coords.side];coords.y = coords.y + sy[coords.side]  
end

Как вы справляетесь с лагами сервера?

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


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

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

  • 0

Это явление уже когда-то обсуждалось, и не раз вроде. Нет никакой тайной жизни сервера и тем более лагов :)  Это скорее всего тайная жизнь самих роботов. И связана она с приоритетом потоков видимо. Сервер в данный момент времени еще не успел передвинуть блок, а программа уже понеслась дальше.

 

1. Так например код:

for i=1, 20 do
  robot.forward()
end

никогда в жизни не передвинет робота гарантировано на 20 ходов, естественно мы пока отталкиваемся в данном случае от того, что робот в вакууме и нет препятствий. Функция forward в какой-то момент просто может вернуть false и цикл полетит дальше, а робот так и останется в некоторых случаях стоять на месте.

 

 

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

for i=1, 20 do
  robot.forward()
  os.sleep(.5)
end

3. Чтобы робот гарантировано выполнил перемещение на одну клетку, необходимо этого гарантированно дождаться (ну и естественно нужно бурить путь, если мы не уверены на 150%, что там вакуум, тем более, если робот  по определению что-то бурит):

while not robot.forward() do 
      robot.swing()
end 

4. А так как аппаратное время детекта намного меньше таймингов при перемещении, то код выше сильно замедлит продвижение робота в породе. Робот будет всякий раз брюшком биться о камень, потом "думать" некоторое время, потом копать, потом опять "пытаться" вместе с "тайным" сервером и программой синхронно переместиться. Чтобы в несколько раз ускорить продвижение робота в недрах породы, необходимо сначала эту породу детектить и ее копать сразу если она есть, а потом нашим способом гарантировано передвигаться и засчитывать ход. Прирост скорости бурения будет просто ошеломляющий. Также данный код гарантировано снесет сыпучие материалы, внезапно упавшего откуда-то крипа и прочее прочее:

function go()
  if  robot.detect()  then 
    robot.swing()
  end
  while not robot.forward() do
    robot.swing()
  end
  --тут изменить координату
end

5. Точно так же нужно описать конструкции UP and DOWN.

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


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

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

 

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

 

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

  1. function go()
      while not robot.forward() do
        robot.forward()
      end
    end

Или он после первой неудачной попытки сделает 2 шага?

 

Может так?

repeat    
 until robot.forward()
Изменено пользователем bob558

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


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

Эта функция сделает один или два шага вперёд, потому что не самое хорошее тело цикла. Зачем же там вызов-то?

 

 

local function fwd()
  while not robot.forward() do
    os.sleep(.1)
  end
end

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


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

 

 

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

конечно не будет. И Fingercomp уже ответил, почему не будет :)  

Ну и самое главное - НИКОГДА нельзя в майне быть заранее уверенным в том, что роботу ничего не мешает. Туда может прибежать безумный зомбак, овца или сосед ВаськаКиллер2008.

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


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

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

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

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


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

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

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

Гость
Ответить на вопрос...

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

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

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

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

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


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