Saya ingin menerapkan sistem tenaga seperti sistem redstone di minecraft.
Saya memiliki n sumber daya dan kabel m. Jika saya mencabut sumber listrik atau kabel, sirkuit akan mati.
Bagaimana cara menghindari lingkaran? Jika setiap kabel dengan status "aktif" menyalakan kabel di dekatnya, saya dapat membuat lingkaran tanpa batas di mana tidak ada sumber daya yang terlibat (lihat gambar). Situs Plus adalah bahwa ia berjalan di T = m
Saya dapat mengirim daya meledak melalui grafik mulai dari setiap sumber daya dan di setiap panggilan pembaruan saya mematikan setiap kabel. Masalahnya adalah itu berjalan di T = n * m.
Apakah ada praktik terbaik? Di Minecraft sistem redstone sangat lambat jadi saya pikir saya mengabaikan sesuatu.
EDIT: Sistem harus bekerja tanpa kerusakan berbasis jarak.
Jawaban:
Perambatan rekursif. Misalnya, Anda memiliki lampu yang dihubungkan oleh benda kabel N ke baterai. Lampu menanyakan kabel ke-N apakah kabel menyala (ini kabel yang terpasang langsung ke lampu). Kabel Nth kemudian menanyakan kabel N-1 apakah itu aktif dan sebagainya. Setiap kali suatu objek ditanya apakah itu diaktifkan atau tidak, itu menetapkan
lastEvaluated
variabel ke waktu bingkai saat ini. Rekursi itu keluar pada simpul ujung, seperti baterai, atau ketika mencapai objek yang sudah dievaluasi bingkai itu (ini menghindari rekursi tak terbatas). Propagasi ini hanya terjadi ketika sistem berubah. Perubahan termasuk menambah / menghapus bagian atau sakelar yang sedang di-toggle.Tidak ada pembusukan jarak atau pengekangan serupa dengan sistem ini. Saya menggunakannya untuk membuat simulator gerbang logika dan berfungsi untuk berbagai contoh logika seperti flip-flop.
sumber
Di minecraft ada peluruhan berbasis jarak dengan jarak peluruhan yang sangat pendek (kisaran 16 blok).
Apa yang Anda butuhkan adalah tes konektivitas antara grafik .
Salah satu cara untuk melakukannya adalah berulang kali mengambil setiap sisi dan menggabungkan node yang terhubung dan menjadi satu node. Setelah semua tepi hilang, Anda akan berakhir dengan simpul untuk setiap jaringan. Maka daya kirim itu sepele.
sumber
Blok bertenaga memiliki beberapa koneksi input / output, tetapi pada titik awal, kita tidak tahu kapan itu input atau output.
Setiap blok memiliki "Tegangan" yang merupakan energi yang sampai padanya dikurangi yang hilang / digunakan.
Blok bertenaga akan memberikan daya ke semua blok sekitarnya, dan setiap blok mengambil sebagai input tegangan yang lebih tinggi dari blok sekitarnya. Anda juga dapat menyulitkan sistem dengan mendefinisikan Intensitas, tetapi saya akan tetap menggunakan Voltage hanya untuk kesederhanaan.
Setiap kali perubahan dilakukan ke sirkuit, dengan menambahkan / menghapus blok, atau oleh sirkuit itu sendiri, perubahan harus disebarkan ke semua sirkuit sampai stabilitas.
Saya sarankan Anda untuk mendesain antarmuka untuk objek bertenaga apa pun (kubus dalam MC):
Jadi seandainya Anda menerapkan addSibling dan removeSibling, bagian terpenting adalah fungsi merambat:
Sebagai solusi rekursif, setiap blok harus mengurangi sedikit energi, tidak pernah meningkatkannya. Sumber daya dapat menetapkan nilai tetap, tetapi tidak pernah meningkat berdasarkan input. Itu seharusnya tidak menjadi masalah karena semua sistem "nyata" bekerja dengan cara ini.
sumber