パワードブロックには複数の入力/出力接続がありますが、最初は、それが入力または出力であるかどうかはわかりません。
各ブロックには、そこに到達するエネルギーから失われた/使用されたエネルギーを差し引いた「電圧」があります。
給電ブロックは周囲のすべてのブロックに電力を供給し、各ブロックは周囲のブロックからのより高い電圧を入力として受け取ります。強度を定義してシステムを複雑にすることもできますが、ここでは単純にするために電圧のみを使用します。
ブロックを追加/削除することにより、または回路自体によって回路に変更が行われるたびに、変更は安定するまですべての回路に伝播する必要があります。
動力を与えられたオブジェクト(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);
}
}
再帰的な解決策として、各ブロックはエネルギーを少し減らし、決して増やしてはなりません。動力源は固定値を設定できますが、入力に基づいて増加することはありません。すべての「実際の」システムがこのように機能するため、これは問題になりません。