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


Фотография

Установка схемы в реактор роботом


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 28

#1 Оффлайн   Appo

Appo
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 08 Октябрь 2017 - 20:09

18915388.png

  • Робот выставляет в реактор записанную Вами схему из базы данных Grid_%D0%90%D0%BF%D0%B3%D1%80%D0%B5%D0%B используя компоненты из сундука над ним или из внутреннего инвентаря

Установка:
pastebin get NAuav7sx q

Минимальная конфигурация робота:

Спойлер

Процесс использования:
Спойлер

Сообщение отредактировал Appo: 10 Октябрь 2017 - 23:46


#2 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 08 Октябрь 2017 - 20:39

А зачем всё через pcall?



#3 Оффлайн   Appo

Appo
  • Автор темы
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 08 Октябрь 2017 - 20:53

А зачем всё через pcall?

Эта прога универсальная. Как на биосе, так и на OpenOS работает


  • Totoro это нравится

#4 Оффлайн   Totoro

Totoro
  • Хранители Кода
  • Сообщений: 1 683
  • Уровень сигнала: 0,36%
  • В игре: 2 час. 13 мин.

Награды

                                      

Отправлено 08 Октябрь 2017 - 21:27

Ты кстати понтовый ID для топика отхватил =) 2222.


  • cyber01 и Appo это нравится

#5 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 08 Октябрь 2017 - 22:36

Маловато толку от такой программы. Обслуживает только один реактор и только на этапе начальной выкладки компонентов. Кроме того, после установки реактора приходится вручную, как минимум, установить робота, сундук и загрузить его компонентами, а как максимум, дождаться загрузки OS и запустить программу.

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

Далее робот пред выкладкой каждой позиции заново перебирает все слоты сундука. Учитывая, что реактор может иметь 54 слота, а сундук – 108, то в худшем случае проверка содержимого слота сундука может быть вызвана 4401 раз. Однократно она выполняется 0.05 секунд, а в сумме – 220 секунд. Но можно однократно прочитать содержимое сундука, выполнив 108 итераций и затратив всего 6 секнуд. В случае нехватки каких-либо компонент и их докладывания игроком можно перепроверять содержимое сундука в следующей итерации. На случай, если в процессе выполнения программы игрок вынул какие-то компоненты из сундука, их тоже можно будет пометить как отсутствующие и повторить поиск в следующей итерации.

Код вообще заинтриговал. Зачем такие выкрутасы c pcall?
 
pcall(function() computer,component = require("computer"),require("component") end)
Делается это так:
computer = computer or require"computer"
component = component or require"component"
А этот фрагмент
function printT(a) pcall(function() print(a) end) end
Логичнее было бы написать так:
print = print or function()end
Такая конструкция позволит не вызывать каждый раз pcall и не менять везде в тексте программы print на printT

А этот код
for _, mod in component.list() do
  if mod ~= 'computer' then
    pcall(load(mod..' = component.proxy(component.list(\"'..mod..'\")())'))
  end
end
будет выполняться быстрее в таком виде:
for address, type in component.list() do
  if type ~= 'computer' and not _G[type] then
    _G[type] = component.proxy(address)
  end
end
А впрочем, зачем вообще потребовалось все компоненты копировать в глобальное окружение? Достаточно же взять лишь нужные. Тем более, нужным далее по коду даются новые имена.

В общем, pcall в этой программе – лишний костыль. Да и от сам робот-помощник неудобный получился.

Сообщение отредактировал eu_tomat: 08 Октябрь 2017 - 23:25

  • Totoro, Doob и Appo это нравится

#6 Оффлайн   Appo

Appo
  • Автор темы
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 08 Октябрь 2017 - 23:11

Обслуживает только один реактор ....

Он не должен их обслуживать, лишь заполняет схему из бд.. Например если реакторов много, а теплообменники не стакаются..

По поводу замечаний и критики, огромное спасибо) Не знал как это по другому делается, делал как умел)
Обязательно всё учту и переделаю)


Сообщение отредактировал Appo: 08 Октябрь 2017 - 23:12


#7 Оффлайн   BarBoss

BarBoss
  • Пользователи
  • Сообщений: 49
  • Уровень сигнала: 60,64%
  • В игре: 371 час. 43 мин.

Награды

                          

Отправлено 09 Октябрь 2017 - 01:42

Это проще транспозером делать. Попутно будет стержни менять.

Был одно время сервер, где простым смертным к реактору доступа не было. :)



#8 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 129
  • Уровень сигнала: 62,7%
  • В игре: 384 час. 21 мин.

Награды

           

Отправлено 09 Октябрь 2017 - 01:47

Это проще транспозером делать. Попутно будет стержни менять.

Был одно время сервер, где простым смертным к реактору доступа не было. :)

микроконтроллером можно(подобную дичь уже писал)


Сообщение отредактировал ivan52945: 09 Октябрь 2017 - 01:47


#9 Оффлайн   evgkul

evgkul
  • Пользователи
  • Сообщений: 366
  • Уровень сигнала: 0,01%
  • В игре: 0 час. 3 мин.

Награды

     

Отправлено 09 Октябрь 2017 - 04:35

А этот фрагмент

function printT(a) pcall(function() print(a) end) end
Логичнее было бы написать так:
print = print or function()end
Такая конструкция позволит не вызывать каждый раз pcall и не менять везде в тексте программы print на printT

А то и 

local print = print or prn or function() end

Сообщение отредактировал evgkul: 09 Октябрь 2017 - 04:50


#10 Оффлайн   Doob

Doob
  • Пользователи
  • Сообщений: 787
  • Уровень сигнала: 23,85%
  • В игре: 146 час. 10 мин.

Награды

                                   

Отправлено 09 Октябрь 2017 - 05:50

Ещё и адаптер прицепить, чтобы контролировать все функции.
Апгрейд БД тут лишний, можно хранить в прошивке все возможные схемы, определяя и устанавливая по имеющимся компонентам доступную. Игроку в таком случае остается только крафтить компоненты и отбирать энергию.

#11 Оффлайн   Appo

Appo
  • Автор темы
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 09 Октябрь 2017 - 11:05

Обновил программу, с учётом всей критики ( жду новую :D )
Старая версия



#12 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 09 Октябрь 2017 - 20:39

В своём сообщении я заменил эту строку if not print then print=function()end end
на более компактную: print = print or function()end
Результат тот же, а выглядит проще.

Ещё обнаружил такую конструкцию:
function chekDatabase() for _ in component.list("database") do return false end return true end
while chekDatabase() do ... end
В ней я предлагаю избавиться от функции и от содержащегося в ней цикла:
while not component.list("database")() do ... end
От такой записи у меня рябит в глазах: items[slot.name][#items[slot.name]+1] = j
Визуально проще воспринимается: table.insert(items[slot.name], nil, j)


А еще я вдруг подумал, что в таблице следует запоминать содержимое не сундука, а базы данных. Дело в том, что содержимое базы данных на протяжении работы программы остаётся неизменным, а содержимое сундука может меняться. Кроме того, игрок может не только приносить компоненты в сундук, но и забирать что-то положенное по ошибке и даже забрать то, что робот уже запомнил, а потом попытается всосать предмет из уже пустого слота или даже забрать предмет, подмененный игроком. Из этого следуют две рекомендации:
1) Проверять успешность попытки перемещения нужного предмета из сундука;
2) Минимизировать время между обнаружением предмета в сундуке и его перемещением. А из этого следует, что полное сканирование сундука и долгое хранение данных о его содержимом крайне нежелательно. Лучше запоминать содержимое базы данных, а обнаруженный в сундуке подходящий компонент – тут же перемещать, пока ситуация не успела измениться.

Напомню другим критикам: не тратьте силы, автор программы уже сказал, что не собирается управлять реактором и согласен на незначительность практического применения своей программы. Будем рассматривать её, как тренировочную задачу, чтобы набить руку.

  • Totoro и Appo это нравится

#13 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 129
  • Уровень сигнала: 62,7%
  • В игре: 384 час. 21 мин.

Награды

           

Отправлено 09 Октябрь 2017 - 20:58

А еще я вдруг подумал, что в таблице следует запоминать содержимое не сундука, а базы данных. Дело в том, что содержимое базы данных на протяжении работы программы остаётся неизменным, а содержимое сундука может меняться. Кроме того, игрок может не только приносить компоненты в сундук, но и забирать что-то положенное по ошибке и даже забрать то, что робот уже запомнил, а потом попытается всосать предмет из уже пустого слота или даже забрать предмет, подмененный игроком. Из этого следуют две рекомендации:

1) Проверять успешность попытки перемещения нужного предмета из сундука;
2) Минимизировать время между обнаружением предмета в сундуке и его перемещением. А из этого следует, что полное сканирование сундука и долгое хранение данных о его содержимом крайне нежелательно. Лучше запоминать содержимое базы данных, а обнаруженный в сундуке подходящий компонент – тут же перемещать, пока ситуация не успела измениться.

 

или можно просто инвентарь робота юзать как буфер(или впихнуть буферный сундук)
тоесть робот сканирует сундук и берёт то, что нужно(выкладывает в буфер), и выкладывает так, как ему удобно, и уже с буфера сунет в реактор
и да, в цикле на 6-й строке добавь, чтоб монитор чистило


Сообщение отредактировал ivan52945: 09 Октябрь 2017 - 21:05


#14 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 09 Октябрь 2017 - 21:13

или можно просто инвентарь робота юзать как буфер(или впихнуть буферный сундук)
тоесть робот сканирует сундук и берёт то, что нужно(выкладывает в буфер), и выкладывает так, как ему удобно, и уже с буфера сунет в реактор

Робот уже использует свой инвентарь как буфер с одним слотом. Задействовать все слоты робота можно. Это усложнит программу, но какие это даст преимущества?


#15 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 129
  • Уровень сигнала: 62,7%
  • В игре: 384 час. 21 мин.

Награды

           

Отправлено 09 Октябрь 2017 - 22:13

Робот уже использует свой инвентарь как буфер с одним слотом. Задействовать все слоты робота можно. Это усложнит программу, но какие это даст преимущества?

а стоп, затупил
робот чисто расставляет схему, не следит(а думал, что следит за реактором будет)

 


 



#16 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 10 Октябрь 2017 - 08:24

А то и

local print = print or prn or function() end

А что такое prn?


#17 Оффлайн   Appo

Appo
  • Автор темы
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 10 Октябрь 2017 - 23:34

Вновь обновил :) (ссылка в первом сообщении темы)

Теперь сундук над роботом не обязателен, можно во внутренние слоты робота пихать.
(При перемещении предметов шифтом в робота, сначала предмет попадёт в его лапки, только потом в инвентарь)

Вот такой комп можно собрать, используя EEPROM ( Без запуска OpenOS и без монитора )

18944709.png

Кому интересно как я изменял программу по мере критики, то вот старая версия, а вот еще старее старой


Сообщение отредактировал Appo: 10 Октябрь 2017 - 23:47


#18 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 11 Октябрь 2017 - 01:21

На данном этапе бесполезно обсуждать код, т. к. испортилась сама схема.

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

Это регресс. Не для того мы используем роботов, чтобы терпеть от них неудобства.

Ситуацию могли бы спасти три улучшения:

1) Отображение на мониторе списка недостающих компонентов поможет игроку быстро принять верное решение.
2) Перемещение в первые слоты инвентаря всего лишнего хлама, который игрок закинул в робота по ошибке, избавит его от необходимости пользоваться скроллингом.
3) Обработка события inventory_changed позволит оперативно отслеживать, что игрок положил, а что забрал из инвентаря робота, сделав ненужными повторные сканирования инвентаря.


#19 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 1 958
  • Уровень сигнала: 187,35%
  • В игре: 1148 час. 24 мин.

Награды

                                               

Отправлено 11 Октябрь 2017 - 04:31

И, да, ты же в курсе, что у робота максимум 64 слота инвентаря может быть (= 4 апгрейда)?


  • eu_tomat это нравится

#20 Оффлайн   Appo

Appo
  • Автор темы
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 11 Октябрь 2017 - 09:29

испортилась сама схема.


Что именно испортилось? Всё осталось прежним, я лишь добавил возможность сканирования инвентаря робота, вдруг игрок в него захотел положить компоненты.
 

1) Отображение на мониторе списка недостающих компонентов поможет игроку быстро принять верное решение.

 
Ставь монитор, кто тебе мешает? Я разве говорил "не ставьте монитор" ?  Я сделал и так и так, для удобства, позже попробую сделать отображение на экране через использование биоса
 

2) Перемещение в первые слоты инвентаря всего лишнего хлама, который игрок закинул в робота по ошибке, избавит его от необходимости пользоваться скроллингом.


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

Если вы считаете что это действительно необходимо, пожалуйста упомните об этом еще раз.
 

3) Обработка события inventory_changed позволит оперативно отслеживать, что игрок положил, а что забрал из инвентаря робота, сделав ненужными повторные сканирования инвентаря.

 
Как это реализовать? Разве ивенты не будут путатся в очереди? А если я в определенный момент не успею проверить ивент и он проигнорится?


При дополнении новыми возможностями не изменяя прежний принцип работы, типо это регресс? окда

 
 

И, да, ты же в курсе, что у робота максимум 64 слота инвентаря может быть (= 4 апгрейда)?


Спасибо) Не знал..


Сообщение отредактировал Appo: 11 Октябрь 2017 - 09:35


#21 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 11 Октябрь 2017 - 11:16

@Appo На самом деле улучшить это решение уже невозможно. Просто хотелось придраться к чему-нибудь. Никак не могу избавиться от этой привычки. Прошу понять и простить.


#22 Оффлайн   Appo

Appo
  • Автор темы
  • Пользователи
  • Сообщений: 50
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

        

Отправлено 11 Октябрь 2017 - 11:48

@eu_tomat , думаю улучшить всё-таки можно, например ни кто не отменял апгрейд чата из conputronics :D

Претензий у меня нету, я лишь хотел по подробнее узнать о ваших предложениях и обсудить их :)

Вы и так много полезного сказали, я вам благодарен)

P.s.
Ах да.. и интерес угасает, из за не надобности этого робота ( как оказалось на сервере, где я играю, костыльная защита от грифа роботом из за чего робот не может получать данные об инвентарях) T_T

Сообщение отредактировал Appo: 11 Октябрь 2017 - 11:49


#23 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 12 Октябрь 2017 - 08:59

я лишь хотел по подробнее узнать о ваших предложениях и обсудить их

интерес угасает, из за не надобности этого робота

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

Регрессом я посчтитал новый способ взаимодействия системы с игроком в сравнении со старым.
Скриншот, в котором нашлось место восьми сундукам, но не нашлось место монитору, воспринимается как рекомендуемая конфигурация для новой схемы. Возможно, это не так, но в чем тогда был смысл скриншота?

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

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

Чтобы не тратить кучу времени на многократное сканирование БД, его следует выполнить лишь один раз, перенеся все данные в таблицу. А содержимое таблицы проверяется быстро. Перекладывание предметов из слота в слот выполняется не очень быстро, но происходит это в то время, пока игрок бегает на склад за компонентами, и для игрока это всяко удобнее, чем ручная прокрутка инвентаря.

Можно, конечно, обойтись и одним улучшением инвентаря, но, думаю, что с тремя улучшениями, монитором и соответствующей программой система станет удобнее и быстрее: внешний сундук становится совершенно ненужным, перемещать предметы из сундука не требуется, отслеживание изменений в инвентаре ускоряется за счет обработки сигналов. Почему с тремя улучшениями? Потому что инвентарь игрока имеет всего 36 слотов. И пока игрок ходит за следующей порцией компонентов, робот успеет раскидать уже имеющиеся по слотам реактора. Скорее всего, достаточно будет даже двух улучшений инвентаря, но с одним робот вряд ли будет успевать перемещать компоненты в реактор, пока игрок шифтом перемещает их в инвентарь робота. С одним улучшением инвентаря игроку придётся тратить время на ожидание, пока освободится инвентарь робота.
 

Как это реализовать? Разве ивенты не будут путатся в очереди? А если я в определенный момент не успею проверить ивент и он проигнорится?

Сколько я ни экспериментировал, порядок поступления сигналов никогда не нарушался. В течение 1-2 секунд у меня ни одно событие не было проигнорировано, а более экстремальных экспериментов я не ставил.

Сообщение отредактировал eu_tomat: 12 Октябрь 2017 - 09:04


#24 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 12 Октябрь 2017 - 11:03

А если я в определенный момент не успею проверить ивент и он проигнорится?

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


#25 Оффлайн   ivan52945

ivan52945
  • Пользователи
  • Сообщений: 129
  • Уровень сигнала: 62,7%
  • В игре: 384 час. 21 мин.

Награды

           

Отправлено 12 Октябрь 2017 - 18:02

впринципе даже есть идея как всё это реализовать(помню сталкивался с подобием этой задачи)
но пока говорить не буду(поломайте голову сами)



#26 Оффлайн   lokin135

lokin135
  • Пользователи
  • Сообщений: 28
  • Уровень сигнала: 108,74%
  • В игре: 666 час. 35 мин.
  • ГородПсков

Отправлено 07 Ноябрь 2017 - 20:38

Делается это так:computer = computer or require"computer"component = component or require"component"

Не совсем с тобой согласен (зачем так?!)

Да, все через pcall() делать совсем убого, но подключать библиотеки Я считаю ​нужно вот так:

local computer = require("computer")

Хоть программа может быть и в дроне, но local никогда не крашила проги :D



#27 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 07 Ноябрь 2017 - 21:21

Я считаю ​нужно вот так:

local computer = require("computer")
Хоть программа может быть и в дроне, но local никогда не крашила проги :D

local, конечно же, не крашит. А вот, require не даст взлететь твоему дрону.

  • Zer0Galaxy это нравится

#28 Оффлайн   Quant

Quant
  • Пользователи
  • Сообщений: 537
  • Уровень сигнала: 0,01%
  • В игре: 0 час. 4 мин.
  • Городinterface IQuant

Награды

     

Отправлено 08 Ноябрь 2017 - 20:22

local, конечно же, не крашит. А вот, require не даст взлететь твоему дрону.

Хотя это оригинальный способ пикнуть дроном.



#29 Оффлайн   eu_tomat

eu_tomat
  • Хранители Кода
  • Сообщений: 793
  • Уровень сигнала: 0,05%
  • В игре: 0 час. 19 мин.

Награды

                          

Отправлено 09 Ноябрь 2017 - 14:02

Хотя это оригинальный способ пикнуть дроном.

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





Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

Яндекс.Метрика