गिरने वाले ब्लॉक और जटिल आकार


10

वर्तमान में मेरे पास एक सरल टेट्रिस जैसा खेल है और एक समस्या है जो मैं हल नहीं कर सकता हूं।

टेट्रिस के विपरीत जहां एक एकल गिरने वाली आकृति है, मेरे पास कई, संभावित इंटरलॉकिंग आकार हैं जिन्हें गिरने की आवश्यकता है; मुझे उनकी अंतिम स्थितियों की गणना करने की आवश्यकता है। निम्नलिखित को धयान मे रखते हुए:

गिरते ब्लॉक समस्या के उदाहरण

  1. हरे रंग की आकृति की अंतिम स्थिति की गणना करने के लिए, मैं बस हर वर्ग के लिए नीचे स्कैन करता हूं जब तक कि मैं एक और वर्ग या बोर्ड के किनारे पर नहीं मारता। किया हुआ

  2. एकाधिक, सरल आकृतियों के लिए मैं अपने तरीके से यूपी बोर्ड का काम करता हूं। इस प्रकार लाल को हिलने की आवश्यकता नहीं होती है, नारंगी एक से नीचे जाता है, तीन से नीचे। किया हुआ

  3. मुझे नहीं पता कि इंटरलॉक की गई हरी और लाल आकृतियों का इलाज कैसे किया जाए। # 2 के तर्क का उपयोग करते हुए हम मध्य हवा को "अटक" खत्म कर देंगे। यदि मैं हरे रंग के आकार के लिए स्कैन करता हूं, तो मैं लाल का सामना करता हूं और इस प्रकार हिलता नहीं हूं, और लाल रंग के लिए इसके विपरीत। समाधान दो आकृतियों को एक मानने का हो सकता है।

  4. # 3 के समान, इस परिदृश्य में मैं वस्तुओं को एक मानकर भी सफल हो सकता हूं।

  5. # 3 और # 4 के विपरीत, मैं आकार को एक के रूप में नहीं मान सकता था, क्योंकि नारंगी आकार एक-वर्ग को बहुत ऊंचा कर देगा ...

  6. समस्या का एक और रूप # 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 समाधान के प्रत्येक पास दिखा रहा है

संक्षेपित करते हुए:

  • जब एक वर्ग "रोक", हम भी बंद:
    • इसके ऊपर कोई भी वर्ग। हमेशा।
    • पड़ोसी वर्ग जिसे हम (एक ही आकार) से जुड़ा हुआ है।
  • हम पूरे निचले पंक्ति को रोकते हैं, और फ़ंक्शन वर्गों के माध्यम से पुनरावृत्ति करता है।
  • हम तब तक दोहराते हैं जब तक सभी वर्गों को रोक नहीं दिया जाता है।
  • तब हम चेतन।

एनिमेटेड जीआईएफ तार्किक अनुक्रम के प्रत्येक पास दिखा रहा है


मुझे लगता है कि अगर आपने 5 हल कर दिया है कि 6 को भी हल किया जाएगा। वास्तव में, मेरा मानना ​​है कि 5 को हल करना शायद इन सभी स्थितियों को हल करेगा।
अंडरस्कोरजेरो

साझा करने के लिए +1 धन्यवाद। अद्भुत समाधान। एनीमेशन से प्यार करें :)
ashes999

चियर्स ashes999, मुझे लगता है कि मुझे तीर के साथ एक नए एनीमेशन की आवश्यकता है जो स्टॉप लॉजिक को दिखाता है कि नीचे की पंक्ति से "
फ़्लो

जवाबों:


4

ठीक है, आपको आकार के इलाज के लिए बिल्कुल ज़रूरत नहीं है अगर वहाँ आकृतियों के बीच एक अंतर है जो आगे बढ़ रहे हैं और आकार जो कि बाकी हैं। एक आकृति (ए) इसके नीचे सीधे एक आकृति (बी) का पता लगा सकती है और यदि यह चलती है, तो बी आकार फिर देख सकता है कि क्या इसके नीचे कुछ भी है, और यदि कोई आराम करने वाला आकार है, तो ए और बी अब आराम कर रहे हैं, और यदि कुछ नहीं है, तो वे दोनों नीचे चले जाते हैं, लेकिन यदि कोई चलती हुई आकृति है, तो इस नए आकार को ए और बी द्वारा ए ट्रीटेड बी माना जाएगा, इसलिए यह पुनरावर्ती है। ध्यान रखें कि प्रत्येक चरण के लिए, सबसे कम आकृतियों को पहले उनके नीचे के आकृतियों की जांच करने की आवश्यकता होती है।

इसलिए, समस्या # 6 के लिए, हरे रंग की आकृति सबसे कम चलती हुई आकृति है, और यह देखेगा कि एकमात्र आकार जो इसके सीधे नीचे है वह लाल आकार है, इसलिए तब लाल आकार सीधे इसके नीचे कुछ भी नहीं पता लगाएगा, और वे नीचे चले जाएंगे । एक बार जब हरे रंग की आकृति नारंगी आकार के समीप होती है, तो वह आराम करती है, और लाल आकार नीचे आ जाता है और फिर बाकी हरे रंग का पता लगाता है, और वह आराम भी करेगा।


क्या मैं यह सोचने में सही हूं कि जब तक हम अन्यथा साबित नहीं हो जाते, तब तक हमें सभी आकृतियों को आराम नहीं करना होगा?
oodavid

मैंने अभी इस पर विचार करने में कुछ समय बिताया है और मुझे कहना होगा कि यह एक बहुत अच्छी तकनीक है। मैं इसे कल / सप्ताहांत में आजमाता हूँ और देखता हूँ कि यह कैसे निकलता है।
oodavid

3

ऐसा लगता है कि एक ही जड़ से मामलों # 5 और # 6 स्टेम के साथ समस्या: आप केवल आंदोलन पास की एक जांच कर रहे हैं। आपको चीजों को नीचे ले जाना चाहिए (इसे "गुरुत्वाकर्षण पास" कहते हैं) जब तक कि आप कुछ भी नहीं जानते हैं।

उदाहरण के लिए, यदि 6, यदि आप कई पास का उपयोग करते हैं तो यह होगा:

  • ऑरेंज नीचे चला जाता है
  • हरा नीचे चला जाता है
  • ऑरेंज नीचे चला जाता है
  • हरा नीचे चला जाता है
  • ऑरेंज नीचे चला जाता है
  • नीचे कुछ भी नहीं किया (किया!)

मल्टीपल ग्रेविटी पास की यह रणनीति # 5 को भी हल कर सकती है, हालांकि यह केस # 3 और # 4 के साथ मदद नहीं करेगा, जहां ऐसा लगता है कि आपको उन्हें एक टुकड़े की तरह व्यवहार करने की आवश्यकता है।

भेद करने के लिए जब दो या अधिक टुकड़ों को एक ही टुकड़े के रूप में माना जाना चाहिए, मुझे लगता है कि सबसे आसान एल्गोरिदम यह जांचना है कि क्या सभी टुकड़ों के संयुक्त स्थान में कोई "छेद" हैं। यदि वहाँ हैं, तो इसे कई टुकड़ों के रूप में माना जा सकता है।


1
# 3 और # 4 के साथ ऐसी विविधताएँ भी हो सकती हैं जहाँ 2 या 3 आकृतियाँ पूरी तरह से एक बड़े "C" आकार से आच्छादित होती हैं, यह पता लगाना कि यदि टुकड़े कोष्ठबद्ध किया गया है तो आगे की समस्याएँ उत्पन्न हो सकती हैं। मैं देता हूँ कि जाओ और देखो क्या आता है! चीयर्स @ ashes999
oodavid

@ आपकी आवश्यकताओं / डिजाइन को अनावश्यक रूप से मुझे जटिल लगता है। कुछ सरल से शुरू करें और इन समस्याओं को हल करने के साथ-साथ अपने तरीके से काम करें।
ashes999

Nahhhh, ऊपर की समस्या अधिक जटिल समस्या का वर्णन करने के लिए पूरी तरह से सरलीकृत / सार तरीका है। मैं पीछा के रोमांच के लिए यह कर रहा हूँ!
२०:०
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.