मेरा दृष्टिकोण थोड़ा स्मृति गहन (पैकमैन युग के दृष्टिकोण से) है, लेकिन आपको केवल एक बार गणना करने की आवश्यकता है और यह किसी भी स्तर के डिजाइन (कूद सहित) के लिए काम करता है।
एक बार नोड्स लेबल करें
जब आप पहली बार एक लेवल लोड करते हैं, तो सभी मॉन्स्टर लायर नोड्स 0 (लैयर से दूरी का प्रतिनिधित्व करते हुए) को लेबल करें। आउटवर्ड लेबलिंग से जुड़े नोड्स 1 को आगे बढ़ाएं, नोड्स उनसे जुड़े 2, और इसी तरह, जब तक कि सभी नोड्स लेबल नहीं हो जाते। (ध्यान दें: यह तब भी काम करता है जब खोह में कई प्रवेश द्वार हों)
मैं मान रहा हूं कि आपके पास पहले से ही प्रत्येक नोड का प्रतिनिधित्व करने वाली वस्तुएं और उनके पड़ोसियों के कनेक्शन हैं। छद्म कोड कुछ इस तरह दिख सकता है:
public void fillMap(List<Node> nodes) { // call passing lairNodes
int i = 0;
while(nodes.count > 0) {
// Label with distance from lair
nodes.labelAll(i++);
// Find connected unlabelled nodes
nodes = nodes
.flatMap(n -> n.neighbours)
.filter(!n.isDistanceAssigned());
}
}
आंखें नीची दूरी लेबल के साथ पड़ोसी के पास जाएं
एक बार जब सभी नोड्स लेबल होते हैं, तो आंखों को राउटिंग तुच्छ होता है ... बस पड़ोसी नोड को सबसे कम दूरी के लेबल के साथ चुनें (ध्यान दें: यदि कई नोड्स में समान दूरी है, तो इससे कोई फर्क नहीं पड़ता कि कौन सा उठाया गया है)। छद्म कोड:
public Node moveEyes(final Node current) {
return current.neighbours.min((n1, n2) -> n1.distance - n2.distance);
}
पूरी तरह से लेबल उदाहरण