Ein mit Strom versorgter Block verfügt über mehrere Eingangs- / Ausgangsanschlüsse, aber an einem Startpunkt wissen wir nicht, wann er ein- oder ausgegeben wird.
Jeder Block hat eine "Spannung", die die Energie ist, die zu ihm kommt, abzüglich des Verlusts / Verbrauchs.
Ein mit Strom versorgter Block versorgt alle umgebenden Blöcke mit Strom, und jeder Block nimmt die höhere Spannung von den umgebenden Blöcken als Eingang. Sie könnten das System auch komplizieren, indem Sie eine Intensität definieren, aber ich werde der Einfachheit halber nur bei Voltage bleiben.
Jedes Mal, wenn eine Änderung an der Schaltung durch Hinzufügen / Entfernen von Blöcken oder durch die Schaltung selbst durchgeführt wird, muss die Änderung bis zur Stabilität auf die gesamte Schaltung übertragen werden.
Ich würde Ihnen vorschlagen, eine Schnittstelle für jedes angetriebene Objekt (Cube in MC) zu entwerfen:
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;
};
Angenommen, Sie implementieren addSibling und removeSibling. Der wichtigste Teil ist die Propagate-Funktion:
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);
}
}
Als rekursive Lösung sollte jeder Block die Energie ein wenig reduzieren, niemals erhöhen. Die Stromquelle kann einen festen Wert einstellen, jedoch niemals basierend auf den Eingaben erhöhen. Das sollte kein Problem sein, da alle "echten" Systeme auf diese Weise funktionieren.