Un blocco alimentato ha diverse connessioni input / output, ma a un punto iniziale non sappiamo quando è input o output.
Ogni blocco ha una "Tensione" che è l'energia che arriva ad esso meno il perso / usato.
Un blocco alimentato fornirà energia a tutti i blocchi circostanti e ogni blocco prende come input la tensione più alta dai blocchi circostanti. Potresti anche complicare il sistema definendo un'intensità, ma rimarrò con la tensione solo per semplicità.
Ogni volta che viene eseguita una modifica al circuito, aggiungendo / rimuovendo blocchi o dal circuito stesso, la modifica deve essere propagata a tutto il circuito fino alla stabilità.
Ti suggerirei di progettare un'interfaccia per qualsiasi oggetto alimentato (cubo in 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;
};
Supponendo quindi di implementare addSibling e removeSibling, la parte più importante è la funzione di propagazione:
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);
}
}
Come soluzione ricorsiva, ogni blocco dovrebbe ridurre un po 'l'energia, non aumentarla mai. La fonte di energia può impostare un valore fisso, ma non aumentare mai in base agli input. Questo non dovrebbe essere un problema poiché tutti i sistemi "reali" funzionano in questo modo.