Một khối được cấp nguồn có một số kết nối đầu vào / đầu ra, nhưng tại điểm bắt đầu, chúng tôi không biết bất cứ khi nào nó là đầu vào hoặc đầu ra.
Mỗi khối có một "Điện áp" là năng lượng truyền đến nó trừ đi phần bị mất / sử dụng.
Một khối được cấp nguồn sẽ cung cấp năng lượng cho tất cả các khối xung quanh và mỗi khối sẽ lấy điện áp cao hơn từ các khối xung quanh. Bạn cũng có thể làm phức tạp hệ thống bằng cách xác định cường độ, nhưng tôi sẽ chỉ sử dụng điện áp cho đơn giản.
Mỗi khi thay đổi được thực hiện đối với mạch, bằng cách thêm / xóa các khối hoặc bằng chính mạch đó, thay đổi cần được truyền đến tất cả các mạch cho đến khi ổn định.
Tôi sẽ đề nghị bạn thiết kế một giao diện cho bất kỳ đối tượng được hỗ trợ (khối trong 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;
};
Vì vậy, giả sử bạn triển khai addSibling và removeSibling, phần quan trọng nhất là hàm tuyên truyề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);
}
}
Là một giải pháp đệ quy, mỗi khối nên giảm một chút năng lượng, không bao giờ tăng nó. Nguồn năng lượng có thể đặt giá trị cố định, nhưng không bao giờ tăng dựa trên đầu vào. Đó không phải là một vấn đề vì tất cả hệ thống "thực" đều hoạt động theo cách này.