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

Как прервать выполнение программы

Вопрос

Значит смысл темы такой: робот выполняет какую то программу, например фермы. Как прервать выполнение программы, не выключая робота(или компьютера), клавишей или вводом команды. Я хотел сделать с активной командной строкой, что бы ввести команду stop. Но что то не дошариваю, новичок я вообщем. Пробовал через term.read, прога вообще отказывается работать, вообщем запрос на ввод не получается. Где посмотреть, или поможете дописать?
https://pastebin.com/YmE4K22u
 

local robot = require("robot")
 
while true do
print("Введите [go] или [stop]")
  local a = io.read()
    if a == 'stop' then
      print("Программа остановлена")
      do return end
    else
      while true do
         if a == 'go' then    
          robot.forward()
          robot.turnLeft()
         else
          print("Введите задачу")
          do return end          
         end
      end
    end
end

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


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

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

 

В указанном примере робот проверяет отсутствие редстоун-сигнала, а затем, убедившись в этом, входит в бесконечный цикл на 26 строке. Чем больше циклов - тем больше жепы, все это дело можно заменить упрощенным вариантом:

while true do
  if rs.getInput(sides.right) == 0 then
    print("Программа работает")
    robot.forward()
    os.sleep(1)
    robot.back()
    os.sleep(1)
  else
    print("Программа остановлена")
    break
  end
end
Это решается созданием виртуальной системы координат и нескольких функций, изменяющих значение x/y/z робота при его перемещении, учитывая поворот. Сдвинулся вперед? Прибавь единичку. Уровень заряда маловат? Вычисляй оптимальную траекторию для возвращения на базу, сохраняй текущие координаты, возвращайся и заряжайся, а затем уже иди обратно и продолжай работу. Нечто подобное я писал давненько, если интересно - можешь ознакомиться: https://github.com/IgorTimofeev/OpenComputers/blob/master/Applications/Robot/robotAPI.lua

 

 

"Чем больше циклов - тем больше жепы" - Да именно так и получается). Вообщем пришел я к такому выводу что вот этот вариант оптимальный: "Просто вставляешь вызов функции в основной цикл которая занимается возвратом"

 

И получается пример общий для робота, который работает. Основная программа делается в бесконечным цикле, а переходы осуществляются между функциями с конечным циклом. Так у меня все заработало. 

=====================================
= Программа перехода от действия    =
= к действию для робота             =
=====================================
-- подключение API
-- подключение компонентов
-- объявление переменных

function Line_1() - например сажаем пшеницу

  for i = 1, 10 do - цикл обязательно должен быть конечным
  --- тело цикла

  end
end

или 

function Line_2() -- собираем пшеницу

  repeat     -- также цикл должен быть конечным
  i = i + 1
  ---
  --- блок команд

  until - проверка на не только <,>,==, >=, но и на true и false

end

-- Далее, что бы все делалось автоматически (основная программа)

while true do

Line_1()

if условие then Line_2() - инструкции могут быть как с условием, так и просто последовательные.
end

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

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


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

Так проблема в том, что если программа не получает stop, то ждёт только go из-за лишнего while на 10 строчке. Никто этого не увидел?

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


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

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

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

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

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

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

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

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

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


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