RinKirin 1 Опубликовано: 15 апреля, 2016 Привет ребят, хочу показать вам мою первую адекватную программу для OC.(Hello world не в счет)С lua знакомлюсь 2-й день. И мне пришла в голову идея сделать подобие карьера из BC(вроде из него)Получился "говнокод" но рабочий. Вот ссылка http://pastebin.com/81NPj2fi У этого шахтера есть несколько недостатков, и все они вытекают из моего незнания.Например если энергия кончится то он просто остановится.Поэтому просто хотя-бы немного поведать о ивентах, например подходит к концу заряд робота.Или инструмент сломался.Спасибо за просмотр Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 15 апреля, 2016 В общем для новичка код норм, но есть над чем поработать. 1. Добавь очистку экрана, там где она нужна: local term = require("term") term.clear() -- очистка экрана 2. Используй отступы, вот пример на твоём коде: function cir() for i=1,3 do -- этот цикл я добавил от себя. У тебя почему-то всё было вручную вбито. for i=1, widthC do -- так как i - локальная переменная, всё должно корректно работать с циклом в цикле. mine() end robot.turnRight() end widthD = widthD-1 widthC = widthC-1 for i=1, widthD do dcir() end end 3. Не пиши в ручную то что помещается в цикл - рассмотрено в коде ранее. 4. Используй локальные переменные вместо глобальных, когда объявляешь переменную: --объявление переменной local width = 0 local height = 0 local widthC = 0 local heightC = 0 local function start() robot.forward() robot.swingDown() robot.down() robot.swingDown() robot.down() robot.swingDown() end --использование width = width + 1 start() Пока что это все советы. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pofigist 35 Опубликовано: 15 апреля, 2016 По поводу энергии. Возвращает количество энергии. computer.energy(): number Ну и вот для получения максимального количества возможной энергии. computer.maxEnergy(): number Далее. По поводу износа предметов. Нужен "Апдейт - контроллер инвентаря". Название компонента - inventory_controller А вот эта функция возвращает данные о выбранном слоте getStackInInternalSlot(slot:number):table Возвращается таблица с данными о предмете. Не помню какие именно данные, но метаданные(износ) там точно есть. Разбирайся, короче Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 15 апреля, 2016 robot.durability() — прочность инструмента возвращает. Может быть полезно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
RinKirin Автор темы 1 Опубликовано: 15 апреля, 2016 (изменено) Про отступы да, это я знаю.А зачем нужна очистка?Локальные переменные да, тоже понимаюА т.е не писать в ручную то что помещается в цикл?В смысле не так:for i=1, 3 do r.forward() end r.turnLeft() for i=1, 3 do r.forward() endr.turnLeft а так?for i=1, 2 do for i=1, 3 do r.forward() r.turnLeft() end Изменено 15 апреля, 2016 пользователем RinKirin Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pofigist 35 Опубликовано: 15 апреля, 2016 (изменено) Про отступы да, это я знаю. А зачем нужна очистка? Локальные переменные да, тоже понимаю А т.е не писать в ручную то что помещается в цикл? В смысле не так: for i=1, 3 do r.forward() end r.turnLeft() for i=1, 3 do r.forward() end r.turnLeft а так? for i=1, 2 do for i=1, 3 do r.forward() r.turnLeft() end Да, это значительно удобнее. Символы тоже место в памяти занимают и чем их меньше тем лучше, особенно когда это не влияет на читаемость кода. И раз уж говорим о читаемости, то после do идет перенос строки. for i=1, 3 do for i=1, 3 do r.forward() end r.turnLeft() end Плюс я немного подправил пример. Тебе ведь, я так понимаю, нужно чтобы робот сделал три шага вперед, а потом повернул влево? Изменено 15 апреля, 2016 пользователем Pofigist Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 722 Опубликовано: 15 апреля, 2016 (изменено) А зачем нужна очистка? Чтобы очищать экран от всякого мусора который мог накопится (записаться на экране). Хотя конечно это не обязательно. Но очистка экрана в начале программы как правило полезна. А т.е не писать в ручную то что помещается в цикл? Да, верно понимаешь. Это нужно чтобы повысить читаемость кода, ну и за одно оптимизации его. Изменено 15 апреля, 2016 пользователем qwertyMAN Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Pofigist 35 Опубликовано: 15 апреля, 2016 А зачем нужна очистка? Очистка term.clear() просто очищает экран и возвращает курсор в самое начало(Верхний левый угол). Кстати, я все же открыл твою программу. Было бы не плохо называть функции не rep, fin и т.д. а полностью, типа final и т.д. Еще еще встречный вопрос. Зачем создавать переменную, аля height и потом присваивать ее схожей переменной(heightC)? :/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 625 Опубликовано: 15 апреля, 2016 цикл против тупого набора ; этот код делает ничего 10 раз nop nop nop nop nop nop nop nop nop nop ; этот тоже mov ecx, 9 lp: nop loop lp решай сам Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах