Un bloque alimentado tiene varias conexiones de entrada / salida, pero en un punto de partida, no sabemos cuándo es entrada o salida.
Cada bloque tiene un "Voltaje", que es la energía que llega a él menos la pérdida / uso.
Un bloque alimentado proporcionará energía a todos los bloques circundantes, y cada bloque toma como entrada el voltaje más alto de los bloques circundantes. También podría complicar el sistema definiendo una Intensidad, pero me quedaré con Voltaje solo por simplicidad.
Cada vez que se realiza un cambio en el circuito, agregando / quitando bloques, o por el circuito en sí, el cambio debe propagarse a todo el circuito hasta la estabilidad.
Te sugiero que diseñes una interfaz para cualquier objeto alimentado (cubo en 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;
};
Entonces, suponiendo que implemente addSibling y removeSibling, la parte más importante es la función de propagación:
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);
}
}
Como solución recursiva, cada bloque debe reducir un poco la energía, nunca aumentarla. La fuente de energía puede establecer un valor fijo, pero nunca aumentar según las entradas. Eso no debería ser un problema ya que todos los sistemas "reales" funcionan de esta manera.