Я хочу внедрить систему питания, такую как система Редстоун, в Minecraft.
У меня есть n источников питания и m кабелей. Если я отключу источник питания или кабель, цепь должна отключиться.
Как мне избежать кругов? Если каждый кабель со статусом «включен» питает близлежащие кабели, я могу создать бесконечные круги, где нет источника питания (см. Изображение). Плюс сайт в том что он работает в Т = м
Я мог посылать импульс питания через график, начиная с каждого источника питания, и при каждом обновлении я отключал каждый кабель. Проблема в том, что он работает в T = n * m.
Есть ли лучшая практика? В Minecraft система Redstone была очень медленной, так что, я думаю, я что-то упустил.
РЕДАКТИРОВАТЬ: система должна работать без затухания на основе расстояния.
Ответы:
Рекурсивное распространение. Например, у вас есть лампа, подключенная с помощью N кабельных объектов к аккумулятору. Лампа спрашивает, подключен ли N-й кабель (это кабель, подключенный непосредственно к лампе). Затем N-й кабель запрашивает кабель N-1, подключен ли он и т. Д. Каждый раз, когда объект спрашивается, включен он или нет, он устанавливает
lastEvaluated
переменную для текущего времени кадра. Рекурсия заканчивается на конечном узле, например на батарее, или когда он достигает объекта, который уже был оценен в этом кадре (это позволяет избежать бесконечной рекурсии). Эти распространения происходят только при изменении системы. Изменения включают добавление / удаление частей или переключателей.В этой системе нет уменьшения расстояния или подобных ограничений. Я использовал его для создания симулятора логических элементов, и он работает для различных логических примеров, таких как триггер.
источник
В Minecraft существует затухание на основе расстояния с очень коротким расстоянием затухания (диапазон 16 блоков).
Что вам нужно, это тест на связность между графиками .
Один из способов сделать это - многократно брать каждое ребро и объединять связанные узлы в один узел. После того, как все ребра исчезли, вы получите узел для каждой сети. Тогда посылка власти тривиальна.
источник
Блок питания имеет несколько входных / выходных соединений, но в начальной точке мы не знаем, когда он вводится или выводится.
Каждый блок имеет «Напряжение», которое представляет собой энергию, которая поступает к нему за вычетом потерянного / использованного.
Блок с питанием будет обеспечивать питание для всех окружающих блоков, и каждый блок принимает в качестве входных данных более высокое напряжение от окружающих блоков. Вы также можете усложнить систему, определив интенсивность, но я останусь с Voltage только для простоты.
Каждый раз, когда изменение выполняется в схеме, путем добавления / удаления блоков или самой схемой, изменение должно распространяться на всю схему до стабильности.
Я бы посоветовал вам разработать интерфейс для любого работающего объекта (куб в MC):
Итак, предположим, что вы реализуете addSibling и removeSibling, наиболее важной частью является функция распространения:
Как рекурсивное решение, каждый блок должен немного уменьшать энергию, а не увеличивать ее. Источник питания может устанавливать фиксированное значение, но никогда не увеличиваться в зависимости от входных данных. Это не должно быть проблемой, поскольку все "настоящие" системы работают таким образом.
источник