bob558
-
Публикации
95 -
Зарегистрирован
-
Посещение
-
Победитель дней
1
Сообщения, опубликованные пользователем bob558
-
-
Здравствуйте!
Подскажите, как с помощью опенкомпутера соединить две или три воротины из мода Stargate?
Пытался разобраться в чужих программах. Не понимаю как соединяться с другими воротами, если известны адреса ворот.
-
Я проверил по поиску, такой темы не было. Обсуждалось внутри других тем, поэтому найти, где об этом говорилось, достаточно сложно.
На моей ферме кропсов робот регулярно оказывается где- нибудь под столом.
Такая конструкция кода будет работать, если заранее известно, что роботу в передвижении ничего мешать не будет?
-
function go() while not robot.forward() do robot.forward() end end
Или он после первой неудачной попытки сделает 2 шага?
Может так?
repeat until robot.forward()
-
-
У сервера есть свооя частная жизнь и часто роботы об этом не знают. Запустив робота, его можно будет потом найти в дальнем углу, куда он ну никак не должен был пойти.
Заметил, что часто это лечат так:
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
Как вы справляетесь с лагами сервера?
-
Готова альфа-версия отладчика:
Отладчик позволяет выполнять код программы пошагово либо до точки останова. Также реализована возможность просмотра текущего значения переменных.
Предложите кто нибудь тестовый код, чтобы я оформил статью.
Как быстро! И это средствами LUA в майне?
-
После прочтения данной темы возникло желание написать под ОС отладчик, похожий на тот, о котором писал Боб. Как думаете, будет ли пользоваться спросом?
Я бы пользовался :
)) -
В далеком 93-м, когда программировал на ассемблере под КР580ВМ80А, была программа "Отладчик", которая показывала значение всех регистров, можно было делать точки останова программе....
Возможно ли такое для LUA?
Какие есть инструменты, методы, чтобы выявить ошибки кода?
-
Вот кстати непонятно, как лаг сервера может сбить робота.
Ведь выполнение программы производится на сервере и движение тоже, клиент только отображает изменение положения робота.
Была такая штука, когда я находил разряженного и выключенного робота забившегося в угол, куда он не должен был попасть по своей воле. Стоило ему добавить после каждого перемещения
os.sleep(0.3)
как он стал строго следовать программе.
-
У рoбoтoв есть не oчевидная прoблема, если ему дать кoманду сделать шаг, тo oн мoжет ее и не выпoлнить из-за лагoв сервера, пoэтoму каждoе движение дoлжнo быть пoдтвержденo.
Например: if robor.move(side) then i=i+1 end или даже
function move(side) if not robot.detect(side) and not robot.move(side) then move(side) end endЧтoбы рабoтать сo счетчикoм, тo лучше так пoдтверждать движение пo всем oсям, так рoбoт будет знать свoю пoзицию и прoще будет егo oтправить на тoчку старта.Нo я изначальнo, все фермы делал без всяких счетчикoв, рoбoт узнавал, кoгда надo пoвoрачивать дoстигнув стены, кoтoрая указывала границы пoля.
Дельное замечание. Но со своей стороны я даю некоторое время серверу подумать о лагах после каждого шага робота. Пока ошибок в перемещении не было.
robot.forward(); os.sleep(0.3)
-
1. Добавь скрин : сбоку от поля, на уровне робота - чтобы визуально было видно, уровень установки робота, относительно кактусов.
2. Будешь ли добавлять статистику сбора урожая ? Сколько собрал - за 1 проход, и сколько - за всё время.
Добавил новые картинки.
Да, буду добавлять статистику. Спасибо!
-
Это моя первая программа на этом ресурсе. Буду рад вашей критике, идеям по оптимизации кода.
Загрузить можно по ссылке http://pastebin.com/bzBkTvkZ
или набрать в терминале:
pastebin get bzBkTvkZ cactus
Начальные установки:
6 local len,w = 8,8 -- длинна и ширина поля 7 local s = 200 -- время ожидания созревания
В 6 строке кода надо указать размеры вашего поля. По умолчанию стоит 8 х 8. В 7 строке время полного созревания урожая.
Робота нужно установить на высоте 4 блока от уровня будущего поля. За ним поставить сундук. Робот должен обладать Апгрейтом -солнечная панель для подзарядки.
Если поле еще не сформированно, то робот сам может засеять поле кактусами в шахматном порядке.
Робот будет информировать вас о количестве высаженных кактусов, заряде батареи. При необходимости подзаряжаться.
P.S. Хочу сказать спасибо Alex, за гайд
http://computercraft.ru/topic/1520-chto-takoe-for-in-pairs/
Эта статья стала настольной книгой, чтобы разобраться в работе таблиц.
Fingercomp за объяснение логики lua.
Отдельное спасибо Totoro и qwertyMAN за быстрые ответы на мои порой нубские вопросы.
Спасибо вам за терпение.
) -
8
-
-
Вообще, как только возникает место, где копипастится дважды один и тот же кусок кода, стоит сразу задуматься - "а правильно ли я делаю?" =)
Например тут можно переписать код так:
for i = 1, #t do if t[i] == 9 then wX = wXst wY = wY + 1 else term.setCursor(wX, wY) term.write(draw[t[i]]) wX = wX + 1 end endP.S. К слову, для переноса строки лучше юзать число 0.
На случай, если у тебя будет бульше восьми символов для рисования.
А вот 0 никак не будет конфликтовать, т.к. индексы начинаются с 1.
Спасибо за дополнения!
Про "0" - это я не подумал
)))) - хорошая идея!Но символов может быть и больше, если ввести в таблицу двухзначные числа.
qwertyMAN, я с таблицами до этого еще не сталкивался. Для данной задачи удалять из таблицы нет необходимости. Но, возможно, это мне пригодится в будущем.Я правильно понял, что перебор таблицы через
for i = 1, #t do
работает быстрее?
Спасибо!
-
Не вчитывался в код, но мне кажется это из-за того, что ты сначала рисуешь символ, а потом перемещаешь курсор.
Т.е. после перевода строки, первый символ окажется не там где надо, т.к. позиция курсора ещё не обновилась.
Большое спасибо!!
Вставил строчку - заработало!
Сначала я подумал, что дело где-то в таблице
for k, v in pairs(t) do if v==9 then wY=wY+1; wX=wXst term.setCursor(wX, wY) -- установка новой позиции курсора! else term.write(draw[v]) wX=wX+1 term.setCursor(wX, wY) end end
-
Это мои первые попытки работы с таблицами. Извините, если это ну очень нубская ошибка.
Это продолжение вчерашнего вопроса - вывод на экран символов кодировки
Приведенный ниже код должен выводить квадрат из символов "#" со сторонами в 3 символа.
Но печатает на экран 4 символа "#"в подряд. Так не должно быть.
local term = require("term") local wX, wY, draw, wXst = 5, 5, {" ", "#", "*", "█", "▀", "▄", "▗"}, 0 local t = {2,2,2,9,2,1,2,9,2,2,2} -- 9- перевод строки term.clear() wXst=wX term.setCursor(wX, wY) for k, v in pairs(t) do if v==9 then wY=wY+1; wX=wXst else term.write(draw[v]) wX=wX+1 term.setCursor(wX, wY) end end -
Ну, во-первых можно просто взять и напечатать.

print("▓")CP437 лучше не юзай, юзай Юникод. OpenComputers поддерживает огромное количество символов Юникода.
Для этого предусмотрена специальная либа.
local unicode = require('unicode') print(unicode.char(12345)) -- переводим код символа в строку и распечатываем егоЯ бы рад напечатать, только как это сделать? Те же знаки псевдографики?
Сейчас буду с юникодом разбираться.
-
Не могу понять как выводить на экран символы, которые есть в кодировке, но не вводятся с клавиатуры. Пример тому знаки псевдографики и тп.
Нашел в интернете несколько статей с примерами, но не могу разобраться, как использовать.
http://lua-users.org/wiki/HexDump
http://stackoverflow.com/questions/9137415/lua-writing-hexadecimal-values-as-a-binary-file
-
Спасибо, Алекс! Забыл поставить второй знак "=". Увлекся булевыми значениями в другой программе, а этот код только выдержка из нее.
Рабочий код, как я думаю, выглядит так.
local args = {...} if #args ~= 1 then print("Ничего") else n = tonumber(args[1]) if n == 1 then print (n) end endqwertyMAN, спасибо за дополнения. Этим тестовым кодом хотел разобраться как ввести доп аргументы во время запуска программы.Ты предложил:
if n==1 then print(1)
Я правильно пронимаю, что print выведет первое значение из таблицы args?
И еще, что значит обработать событие #args==1?
-
Не знал, как назвать тему

Код из программы выдает ошибку в 6-й строке.
Хотел понять обработку аргументов.
local args = {...} if #args ~= 1 then print("Ничего") else n = args[1] if n = 1 then print (n) end end -
Огромное спасибо!
Я этого нюанса вообще незнал. Да и, вероятно, я мог бы не найти сам в интернете. Буду использовать в своих программах.
Хотел переписать для себя эту программу в новых реалиях.
То, что функции лучше делать тоже локальными не знал, спасибо!
-
- work_r и work_l лучше заменить вот на такую штуку
function work(lenght, side) turn = bot[(side == "right") and "turnRight" or "turnLeft"] digandplace(lenght) turn() bot.forward() turn() bot.forward() endа вызывать эту функцию так:work(l, (i % 2 == 0) and "right" or "left")
Очень интересные предложения. Это очень упрощает код.
Я только не понял, как осуществляется поворот. А именно вот эту строчку:
turn = bot[(side == "right") and "turnRight" or "turnLeft"]
Почему в квадратных скобках? И почему нет (side == "left")?
- work_r и work_l лучше заменить вот на такую штуку
-
Большое спасибо отписавшимся
) -
Я правильно понимаю, что запросить переменную можно так?
-
io.write("Введите X: ") x=io.read()
-
-
Как программа может спросить у пользователя значение некой переменной, которая будет впоследствии обрабатываться программой в дальнейшем?
-
Ой как не хватает наглядности. Если есть время добавь картинки рабочего процесса и примеры для экспериментов в фотмате .vox
----------
Не могу изменить файл в спец конверторе. Выбираю файл и больше ничего не происходит
-
Советую посмотреть мод Integated circuits.
Удобная вещь, есть интегррация с OC, хотя эту часть ещë не проверял.
Вот тут хороший гайд
Projectred вместил в себя все, что может Integated Circuits

Основы Stargate
в Разные (отсортировать)
Опубликовано: · Изменено пользователем bob558
Большое спасибо, за мысли !
Сейчас разбираюсь с информацией от врат.
Вот простой код, который соеденяет на 30 сеунд врата:
local comp = require("component") local sg = comp.stargate local term = require("term") function main() term.clear() print("Введите адрес врат: ") local address = io.read() sg.dial(address) os.sleep(30) sg.disconnect() end while true do main() endStarGate control panel смотрел, но там все завязано на keypad. Я хотел сам устанавливать адреса врат.