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

Робот не следует алгоритму

Вопрос

Здравствуйте, решил сделать лайтовую ферму латекса, но я не пойму почему робот не следует алгоритму, помогите найти ошибку в моей конструкции, и как ее правильно написать?

Ряд из фермы латекса выглядит таким образом:

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

 

@ дерево

# свободный блок

> Робот

@>@

###

###

@#@

###

###

@#@

###

###

@#@

###

###

@#@

 

 

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

ToTre()-функция при которой робот после обхода дерева, переходит к другому дереву, то есть поворачивает направо, делает вперёд два шага, поворачивает налево.

 

Сама часть кода:

Function Latex()

For x=1, 10 do

For a=1, 5 do

Tree()

If x<5 then 

ToTree()

If x==5 then

robot.turnAround()

robot.forward()

End

End

End

End

 

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

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

If x<5 then 

ToTree()

К тому же он не поворачивается назад когда x=5

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

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


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

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

Tree() - собирает дерево, у нас цикл в цикле, получается соберёт 10 * 5 = 50 деревьев. Судя по условиям ты считаешь, что x это номер рассматриваемого дерева, тогда что такое "a"? (есть догадки, что это количество рядов, но учитывая, что нету кода перехода между ними, то это вряд ли правда), если убрать этот цикл, то получится код, который пробегается ровно 5 различных деревьев из изначального ряда, причём 6 раз обобрав последнее, не катит. Кстати, интересный факт, x не может быть одновременно и меньше и равным числу 5, а в коде ты это явно просишь

if x < 5 then
  ToTree()
  if x == 5 then
    robot.turnAround()
    robot.forward()
  end
end

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

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

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

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


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

@Nikana у тебя один фанкшин, 2 фора, и 2 ифа, то есть всего 5, а эндов 4. Где-то один энд потерял. Это первое.
Во-вторых условие if x==5 находится внутри условия if x<5 then , а это значит, что оно никогда не наступит и не будет проверятся просто напросто никогда. Внешнее условие тогда исправь на  if x<=5 then...

1 час назад, Nikana сказал:
Скрытый текст

 

Сама часть кода:

Function Latex()

For x=1, 10 do

For a=1, 5 do

Tree()

If x<5 then 

ToTree()

If x==5 then

robot.turnAround()

robot.forward()

End

End

End

End

 

 


И пиши код немного более правильно, с отступами. Ничего не понятно. Вот как-то так https://goonlinetools.com/lua-beautifier/
И не пиши стандартные операторы с большой буквы. Всякие форы, фанкшины и энды принято писать с маленькой буквы.

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


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

Собственно вот, что я наколдовал. Листву рубит, латекс собирает, но не более. Для стабильной работы надо еще кучу факторов учитывать.

Функция main принимает количество деревьев в ряду.

local robot = require('robot')

local function monkey()
  local c = 0
  while robot.detect() do
    robot.use()
    robot.swingUp()
    robot.up()
    c = c + 1
  end
  for i = 1, 3 do
    robot.turnRight()
    robot.swing()
    robot.forward()
    robot.turnLeft()
    robot.swing()
    robot.forward()
    robot.turnLeft()
    for j = 1, c do
      robot.use()
      if i%2 == 0 then
        robot.swingUp()
        robot.up()
      else
        robot.swingDown()
        robot.down()
      end
    end
    robot.use()
  end
  robot.turnRight()
  robot.swing()
  robot.forward()
  robot.turnRight()
end

local function main(m)
  for n = 1, 2 do
    for i = 1, m do
      robot.turnRight()
      monkey()
      if i < m then
        robot.swing()
        robot.forward()
      else
        robot.turnAround()
      end
      robot.swing()
      robot.forward()
    end
  end
end

main(6)

 

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


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

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

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

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

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

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

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

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

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


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