Блок питания имеет несколько входных / выходных соединений, но в начальной точке мы не знаем, когда он вводится или выводится.
Каждый блок имеет «Напряжение», которое представляет собой энергию, которая поступает к нему за вычетом потерянного / использованного.
Блок с питанием будет обеспечивать питание для всех окружающих блоков, и каждый блок принимает в качестве входных данных более высокое напряжение от окружающих блоков. Вы также можете усложнить систему, определив интенсивность, но я останусь с Voltage только для простоты.
Каждый раз, когда изменение выполняется в схеме, путем добавления / удаления блоков или самой схемой, изменение должно распространяться на всю схему до стабильности.
Я бы посоветовал вам разработать интерфейс для любого работающего объекта (куб в MC):
class PowerInterface
{
protected:
std::vector<shared_ptr<PowerInterface>> sibling;
double energy=0;
bool isActive = false;
virtual void propagate(double inEnergy) = 0;
virtual void addSibling(shared_ptr<PowerInterface> newSibling) = 0;
virtual void removeSibling( shared_ptr<PowerInterface> remSibling) =0;
};
Итак, предположим, что вы реализуете addSibling и removeSibling, наиболее важной частью является функция распространения:
void PoweredCube::propagate( double inEnergy )
{
// Define the behaviour
energy = inEnergy-1.0; // Normal device
energy = inEnergy-0.1; // Normal cable
energy = 10.0; // Normal source of power.
if (energy<0.0)
{
energy = 0.0;
isActive = false;
// No energy, so do not propagate anymore
return;
}
isActive = true;
// Propagate
for (auto &s: sibling)
{
// Only propagate to sibling with less energy.
if (energy > s->energy) s->propagate( energy);
}
}
Как рекурсивное решение, каждый блок должен немного уменьшать энергию, а не увеличивать ее. Источник питания может устанавливать фиксированное значение, но никогда не увеличиваться в зависимости от входных данных. Это не должно быть проблемой, поскольку все "настоящие" системы работают таким образом.