Un bloc alimenté a plusieurs connexions d'entrée / sortie, mais à un point de départ, nous ne savons pas quand il est en entrée ou en sortie.
Chaque bloc a une "tension" qui est l'énergie qui y arrive moins la perte / l'utilisation.
Un bloc alimenté alimentera tous les blocs environnants, et chaque bloc prendra en entrée la tension la plus élevée des blocs environnants. Vous pouvez également compliquer le système en définissant une intensité, mais je ne resterai avec Voltage que pour plus de simplicité.
Chaque fois qu'un changement est effectué sur le circuit, en ajoutant / supprimant des blocs, ou par le circuit lui-même, le changement doit être propagé à tout le circuit jusqu'à la stabilité.
Je vous suggère de concevoir une interface pour tout objet propulsé (cube dans 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;
};
Supposons donc que vous implémentiez addSibling et removeSibling, la partie la plus importante est la fonction de propagation:
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);
}
}
En tant que solution récursive, chaque bloc devrait réduire un peu l'énergie, ne jamais l'augmenter. La source d'énergie peut définir une valeur fixe, mais ne jamais augmenter en fonction des entrées. Cela ne devrait pas être un problème car tous les "vrais" systèmes fonctionnent de cette façon.