Перейти к содержимому
  • 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

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

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


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

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

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

 

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.

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


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

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

 

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

 

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

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

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

 

Может так?

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

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


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

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

 

 

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

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


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

 

 

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

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

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

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


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

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

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

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


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

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

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

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

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

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

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

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

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


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