Перейти к содержимому
kcalBxoF

Управление узелстабами из Thaumcraft

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

Ничего сложного в этой программе нет, однако выкладываю код ради оценки его исполнения.
https://pastebin.com/Mw88qQvr

Последовательность запуска этой системы:

  1. Ставим N-ое кол-во узелстабов;
  2. Рядом с ними ставим таблички с номерами от 1 до N;
  3. Под ними ставим редстоун-контроллеры;
  4. Подключаем их все к компу;
  5. На комп ставим программу: pastebin get Mw88qQvr /home/bfnode.lua
  6. Запускаем программу с ключом -i для присвоения номеров адресам;
  7. После присвоения номеров программа продолжит свою работу в консольном режиме.

Доступные команды:

  1. on
  2. off

Аргументы к этим командам:

  1. Номер ноды
  2. all (т.е. запуск команды для всех нод)

Пример:
image.png.eb087c3d8b811264fac0d5dd899d4098.png

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


Ссылка на сообщение
Поделиться на других сайтах
5 минут назад, kcalBxoF сказал:

Ничего сложного в этой программе нет, однако выкладываю код ради оценки его исполнения.
https://pastebin.com/Mw88qQvr

Последовательность запуска этой системы:

  1. Ставим N-ое кол-во узелстабов;
  2. Рядом с ними ставим таблички с номерами от 1 до N;
  3. Под ними ставим редстоун-контроллеры;
  4. Подключаем их все к компу;
  5. На комп ставим программу: pastebin get Mw88qQvr /home/bfnode.lua
  6. Запускаем программу с ключом -i для присвоения номеров адресам;
  7. После присвоения номеров программа продолжит свою работу в консольном режиме.

Доступные команды:

  1. on
  2. off

Аргументы к этим командам:

  1. Номер ноды
  2. all (т.е. запуск команды для всех нод)

Пример:
image.png.eb087c3d8b811264fac0d5dd899d4098.png

Не понимаю смысла это выкладывать.Я просто для интереса хотел сделать управление стабилизаторами с помощью компьютеров.Зачем это выкладывать?Практической пользы тут нет.

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


Ссылка на сообщение
Поделиться на других сайтах
3 часа назад, vladimir сказал:

Не понимаю смысла это выкладывать.Я просто для интереса хотел сделать управление стабилизаторами с помощью компьютеров.Зачем это выкладывать?Практической пользы тут нет.

Во первых, код мой, делаю что хочу.

Во вторых, 

3 часа назад, kcalBxoF сказал:

Ничего сложного в этой программе нет, однако выкладываю код ради оценки его исполнения.

 

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


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, kcalBxoF сказал:

Во первых, код мой, делаю что хочу.

Во вторых, 

 

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

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

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


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

Что вы тут показываете?

80 строк кода что не дают никакой ценности ?

 

 

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


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, whiskas сказал:

Что вы тут показываете?

80 строк кода что не дают никакой ценности ?

 

 

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

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

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


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

@kcalBxoF, @vladimir: прошу вас обоих не тащить ваши разногласия из игрового чата в тему о программировании. Посты я скрыл, но при рецидиве обещаю репрессии.

 

Теперь о самом споре, в котором всем и так уже всё давно понятно, и развитие этого аспекта спора ничего нового не несёт:

 

Идея не несёт в себе новизны. То, что эту идею подсмотрел один у другого, является случайностью. Подобное где угодно можно подсмотреть. Обычная механика Майнкрафта. Идея перебирать список одинаковых механизмов и просить пользователя ввести номер среагировавшего механизма не нова. Я бы вообще избавился в этой цепочке от пользователя и задействовал бы робота. Но и эта идея не нова. Это просто логичная идея, до которой додумается любой инженер. Другое дело, что для данного форума эта идея может оказаться свежей.

 

Я соглашаюсь с тем, что правила хорошего тона обязывают сообщить, у кого идея была подсмотрена. С другой стороны, правила хорошего тона позволяют заявить и о своём участии в авторстве, но всё же не рекомендуют кричать об "украденной идее" при каждом удобном случае. Все читатели и так уже разобрались в ситуации. И тем более, не стоит переносить этот разговор в игровой чат, а из него обратно в эту тему. Из этого складывается негативное отношение к обоим участникам спора. Тем более, когда суть спора не стоит даже ломаного гроша.

 

Эта тема, как видно в шапке, создана с целью обсудить качество кода. Вот, давайте этим и займёмся, если есть что сказать.


Можно обсудить и саму схему. Я даже могу дать подсказки для её улучшения. Во-первых, привязку адресов адаптеров к их расположению можно выполнить автоматически. Во-вторых, состояние узлов ауры доступно для считывания. Тут можно было бы построить интересную схему.

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


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

Так как заявленной автором целью является оценка его кода, то этим и займусь. В целом код выглядит достойно, но я всё же попробую придраться.

  • В коде for a, _ in pairs(cl) do использовать фиктивную переменную _ не обязательно. Код for a in pairs(cl) do тоже является рабочим.
  local f, str = fs.open(cfg, "w")
  if(f==nil)then
  • В этом фрагменте кода считаю лишними скобки в условии. Вреда от них нет, но и пользы они тоже не несут. К слову, я по привычке тоже иногда ставлю скобки в условиях, а иногда и точки с запятой. Но оценивать, так оценивать.
  • Кроме того в данном случае условие можно упростить до if not f then. Оно эквивалентно f==nil or f==false, но записывается короче. А учитывая, что условие f==false на этом участке кода всегда ложно, то в данном конкретном случае условие эквиваленто и f==nil.
  • Аналогично условие if not (at==nil) then упрощается до if at then
  • Для считывания всего содержимого файла логичнее применять f:read("*all"), а не f:read(math.huge)

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


Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, eu_tomat сказал:
  • Для считывания всего содержимого файла логичнее применять f:read("*all"), а не f:read(math.huge)

С остальным все понятно, а этот пункт заставил задуматься. Для файловых потоков есть какие-то маски для чтения?

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


Ссылка на сообщение
Поделиться на других сайтах
45 минут назад, kcalBxoF сказал:

Для файловых потоков есть какие-то маски для чтения?

http://www.lua.org/pil/21.1.html

Цитата

"*all"    reads the whole file
"*line"    reads the next line
"*number"    reads a number
num    reads a string with up to num characters

 

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


Ссылка на сообщение
Поделиться на других сайтах
13 часов назад, kcalBxoF сказал:

С остальным все понятно, а этот пункт заставил задуматься. Для файловых потоков есть какие-то маски для чтения?

Продолжить позволю себе. Луа принимает спокойно сокращённые версии масок: `"*a"`, например. Окроме этого есть ещё и фича Lua 5.3: звёздочку можно не писать. В 5.2 работать не будет, разумеется.

 

Помимо этого, слишком часто ты юзаешь `component.proxy`. Каждый вызов создаётся совершенно новая таблица, хоть и пустая. Не особо оптимальное использование. Для прямого вызова по адресу лучше использовать `component.invoke(address, methodName, arguments...)`.

 

Наконец, советую чаще использовать пустые строки. Они очень полезны, как ни странно. Я, например, отделяю каждый блок пустой строкой, кроме тех, которые в начале или в конце, — читать такое гораздо проще. По той же причине, кстати, и на форуме стараюсь абзацы короткими делать и отделять их \n\n. Примеры кода:

local function recurse(g)
  return (function(f)
            return g(function(x)
                       return f(f)(x)
                     end)
          end)(function(f)
                 return g(function(x)
                            return f(f)(x)
                          end)
               end)
end

print(recurse(function(rec)
                return function(n)
                  if n == 0 then
                    return 1
                  else
                    return n * rec(n - 1)
                  end
                end
              end)(10))
--> 3628800
while true do
  t.write("> ", true)
  local tcom = t.read()

  if not tcom then
    os.exit()
  end

  local com, arg = tcom:match("(%w+)%s(%w+)")

  if arg == "all" then
    turn(0, coms[com], at)
  else
    turn(at[tonumber(arg)], coms[com])
  end
end

 

Изменено пользователем Fingercomp
и ещё немного стилистилизицирования

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


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

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

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

Гость
Ответить в тему...

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

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

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

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

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


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