Перейти к публикации
Форум - ComputerCraft
Sheratan

Кривой копатель ver1.00

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

Привет всем, я тут впервые и решил к вам обратиться вот с каким вопросом.

Что не так с моим кривым кодом? Почему не работает?

 

Черепашка-майнер должна копать 50 блоков в длину и 10 блоков в высоту, копает по типу змейки.

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

 

Помогите пожайлуста.

 

 

 

http://pastebin.com/XR4JPGC5

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

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


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

Вообще-то, принято кидать свой код на pastebin.com

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

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


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

А может для начала написать (автору), что именно в нем "кривым" (по мнению автора) и как именно не работает?

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


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

Какую ошибку кидает? Если ошибок не кидает, то что именно не работает? Что задумывалось? Слишком сложна, мой экстрасенс не понимать.

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


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

А мой почти понимать)
h изначально 0, и условие h == 50 никогда не будет верным.

Но комментарии в коде всегда полезны.
Или хотя бы здесь пояснить алгоритм.
 

Табуляция какая-то сбившаяся, попробуй делать два пробела.

Изменено пользователем SkyFogginer
  • Like 1

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


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

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

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


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

А мой почти понимать)

h изначально 0, и условие h == 50 никогда не будет верным.

 

Но комментарии в коде всегда полезны.

Или хотя бы здесь пояснить алгоритм.

Слушай, а ты похоже прав. Плюс прога в вечный цикл уйдет.

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


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

Давай немного проанализируем, как происходит выполнение кода.

 

  1. Запускается самый внешний цикл с условием c ~= 10. Кстати, это довольно опасная конструкция. Если переменная c, во внутреннем цикле успеет принять значение больше 10, цикл станет вечным, и никогда не остановится.
  2. Второй цикл имеет условие h == 50. Это условие уже равно false, так как переменная h равна 0. Цикл не выполнится.
  3. Таким образом первый цикл становится вечным, но программа при этом ничего не делает, раз за разом сравнивая перменную c с числом 50.

А если бы второй цикл все же выполнился, то программа пропустила бы третий цикл с условием r == true, потому что всего парой строк до него, переменная r получила значение false.

  • Like 1

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


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

Мая шатать глаза.

  • Like 2

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


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

А зачем целых две логических переменных и два ифа?else есть же, а состояние можно сменять так: l=not l.

При этом твою конструкцию из двух ифов можно сделать такой:

if l then поворот на лево else поворот на право end

l=not l

Изменено пользователем Quant
  • Like 1

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


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

Если, не брезгуешь, то можешь посмотреть - как у меня робо-экскаватор копает.

http://pastebin.com/VwiUAGFg

 

П.С. Только там принцип другой - снимается шар "грунта" высотой 3 блока. А размер можно, теоретически - задать любой.

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


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

Если, не брезгуешь, то можешь посмотреть - как у меня робо-экскаватор копает.

http://pastebin.com/VwiUAGFg

 

П.С. Только там принцип другой - снимается шар "грунта" высотой 3 блока. А размер можно, теоретически - задать любой.

    while r.detect () == true do  == while r.detect() do

  • Like 1

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


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

    while r.detect () == true do  == while r.detect() do

Спасибо. Когда набрасывал текст, этого не знал.

В связи с этим, возникли несколько вопросов :

1. Где глянуть остальные примеры, замены стандартного написания - на новое ?

2. Кроме эстетического удовольствия, такой формат, ещё как-то влияет на программу ? ( Ускорение работы ? Уменьшение ошибок ? )

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

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


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

1. Где глянуть остальные примеры, замены стандартного написания - на новое ?

2. Кроме эстетического удовольствия, такой формат, ещё как-то влияет на программу ? ( Ускорение работы ? Уменьшение ошибок ? )

 

1) Условия и циклы в Луа (да и любом другом языке программирования), принимают в качестве параметра выражения, результат которых - логическое значение (true, либо false).

Функция robot.detect() согласно документации возвращает true при обнаружении препятсвия, и false в обратном случае.

То есть твое выражение while r.detect () == true do будет в процессе выполнения программы сведено к одному из двух вариантов:

while true == true do    -- результат: true
или
while false == true do   -- результат: false

То есть, все выражение r.detect () == true можно смело упростить до r.detect ().

 

Аналогично и в других похожих случаях. Если функция уже возвращает логическое значение, сравнивать его с true или false часто бывает излишне.

 

 

2) Нет, особого ускорения не будет. Просто это выглядит короче, красивее, и даже иногда понятнее (у меня глаз всегда цепляется за такие конкструкции, и тратит пару секунд, чтобы понять, что дополнительное действие на самом деле ничего дополнительно не делает =))

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

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


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

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×