वर्तमान में मेरे पास एक सरल टेट्रिस जैसा खेल है और एक समस्या है जो मैं हल नहीं कर सकता हूं।
टेट्रिस के विपरीत जहां एक एकल गिरने वाली आकृति है, मेरे पास कई, संभावित इंटरलॉकिंग आकार हैं जिन्हें गिरने की आवश्यकता है; मुझे उनकी अंतिम स्थितियों की गणना करने की आवश्यकता है। निम्नलिखित को धयान मे रखते हुए:
हरे रंग की आकृति की अंतिम स्थिति की गणना करने के लिए, मैं बस हर वर्ग के लिए नीचे स्कैन करता हूं जब तक कि मैं एक और वर्ग या बोर्ड के किनारे पर नहीं मारता। किया हुआ
एकाधिक, सरल आकृतियों के लिए मैं अपने तरीके से यूपी बोर्ड का काम करता हूं। इस प्रकार लाल को हिलने की आवश्यकता नहीं होती है, नारंगी एक से नीचे जाता है, तीन से नीचे। किया हुआ
मुझे नहीं पता कि इंटरलॉक की गई हरी और लाल आकृतियों का इलाज कैसे किया जाए। # 2 के तर्क का उपयोग करते हुए हम मध्य हवा को "अटक" खत्म कर देंगे। यदि मैं हरे रंग के आकार के लिए स्कैन करता हूं, तो मैं लाल का सामना करता हूं और इस प्रकार हिलता नहीं हूं, और लाल रंग के लिए इसके विपरीत। समाधान दो आकृतियों को एक मानने का हो सकता है।
# 3 के समान, इस परिदृश्य में मैं वस्तुओं को एक मानकर भी सफल हो सकता हूं।
# 3 और # 4 के विपरीत, मैं आकार को एक के रूप में नहीं मान सकता था, क्योंकि नारंगी आकार एक-वर्ग को बहुत ऊंचा कर देगा ...
समस्या का एक और रूप # 6।
ऐसे अन्य परिदृश्य भी हो सकते हैं जिनमें मेरी कई आकृतियाँ हैं जो अधिक से अधिक जटिल परिदृश्यों में हस्तक्षेप करती हैं, लेकिन मुझे लगता है कि उपरोक्त समस्या के सबसे बुनियादी हिस्सों को कवर करता है।
मुझे लगता है कि वहाँ एक सुंदर समाधान है कि मैं अभी तक मुठभेड़ / लगता है और किसी भी अंतर्दृष्टि, विचारों या संसाधनों पर बहुत आभारी होंगे।
समाधान
नीचे दिया गया समाधान वास्तव में सुरुचिपूर्ण है, जो नीचे दिए गए @ user35958 के उत्तर पर आधारित है, मैंने निम्नलिखित पुनरावर्ती कार्य (छद्म कोड) बनाया है
function stop(square1, square2){
// Skip if we're already stopped
if(square1.stopped){
return;
}
// Are we comparing squares?
if(!square2){
// We are NOT comparing squares, simply stop.
square1.stopped = true;
} else {
// Stop IF
// square1 is directly above square2
// square1 is connected to square2 (part of the same complex shape)
if(square1.x == square2.x && square1.y == (square2.y+1) || isConnected(square1, square2)){
square1.stopped = true;
}
}
// If we're now stopped, we must recurse to our neighbours
stop(square1, squareAbove);
stop(square1, squareBelow);
stop(square1, squareRight);
stop(square1, squareDown);
}
एनिमेटेड GIF समाधान के प्रत्येक पास दिखा रहा है
संक्षेपित करते हुए:
- जब एक वर्ग "रोक", हम भी बंद:
- इसके ऊपर कोई भी वर्ग। हमेशा।
- पड़ोसी वर्ग जिसे हम (एक ही आकार) से जुड़ा हुआ है।
- हम पूरे निचले पंक्ति को रोकते हैं, और फ़ंक्शन वर्गों के माध्यम से पुनरावृत्ति करता है।
- हम तब तक दोहराते हैं जब तक सभी वर्गों को रोक नहीं दिया जाता है।
- तब हम चेतन।