मैंने सोचा कि अभी तक कोई नहीं होगा किसी कारण से मेरा प्रोग्राम काम नहीं करता है जब मैं लॉजिकल का उपयोग करता हूं और नेस्टेड इफ स्टेटमेंट के बजाय। मैंने एक टेट्रिस क्लोन बनाया है जिसमें एक होल्ड फीचर है जो खिलाड़ी द्वारा सी कुंजी दबाए जाने पर ब्लॉक को रखता/संग्रहित करता है। मेरे पास एक बूलियन था जो खिलाड़ी को अनियंत्रित रूप से ब्लॉक को स्वैप करने से रोकता है।

किसी कारण से यह काम करता है:

if (bKey[5]) //When C key is pressed
        {
            if (!pieceHold) //boolean to prevent player from holding the C key and swapping blocks constantly/uncontrollably
            {
                if (!bPieceHeld) //check to see if player is not holding a block
                {
                    r++;
                    nHoldPiece = nCurrentPiece; //set empty hold piece into the current piece
                    nHoldRotation = nCurrentRotation; 
                    nCurrentPiece = nNextPiece; //set the current piece into the next piece
                    
                    nNextPiece = rng[r - 1];
                    nCurrentX = nFieldWidth / 2;
                    nCurrentY = 0;
                    bPieceHeld = 1;
                }
                else if (bPieceHeld) //if player is already holding block, swap held block with the current block
                {
                    int tempPiece = nCurrentPiece;
                    nCurrentPiece = nHoldPiece;
                    nHoldPiece = tempPiece;

                    int tempRotation = nCurrentRotation;
                    nCurrentRotation = nHoldRotation;
                    nHoldRotation = tempRotation;
                }
            }
            pieceHold = 1; //set boolean to true if C is already held to prevent accidental double swapping
        }
else
            pieceHold = 0; //set boolean false if C key is held

लेकिन यह नहीं है:

if (!pieceHold && bKey[5])
    {
        if (!bPieceHeld)
        {
                r++;
                nHoldPiece = nCurrentPiece;
                nHoldRotation = nCurrentRotation;
                nCurrentPiece = nNextPiece;
                
                nNextPiece = rng[r - 1];
                nCurrentX = nFieldWidth / 2;
                nCurrentY = 0;
                bPieceHeld = 1;
        }
        else if (bPieceHeld)
        {
                int tempPiece = nCurrentPiece;
                nCurrentPiece = nHoldPiece;
                nHoldPiece = tempPiece;

                int tempRotation = nCurrentRotation;
                nCurrentRotation = nHoldRotation;
                nHoldRotation = tempRotation;
        }
        pieceHold = 1;
    }
    else
        pieceHold = 0;

माना जाता है कि इसे रोकने के लिए बूल पीस होल्ड होने के बावजूद खिलाड़ी अभी भी अनियंत्रित रूप से ब्लॉक को स्वैप कर सकता है। ऐसा क्यों है?

0
NotApollo 15 सितंबर 2020, 20:16

2 जवाब

सबसे बढ़िया उत्तर

बाहरी अगर पहले कोड स्निपेट में स्टेटमेंट में एक और हिस्सा होता है

if (bKey[5]) 
        {
            //...
            pieceHold = 1; //set boolean to true if C is already held to prevent accidental double swapping
        }
else
            pieceHold = 0; //set boolean false if C key is held

इसलिए

 if (bKey[5]) 
 //...
 else
 //..

के समान नहीं है

if (!pieceHold && bKey[5])
//...
else
//...

ध्यान दें कि यह अगर-और बयान

            if (!bPieceHeld) //check to see if player is not holding a block
            //..
            else if (bPieceHeld) 

की तरह सरल फिर से लिखा जा सकता है

            if (!bPieceHeld) //check to see if player is not holding a block
            //..
            else

इसके अलावा मैन्युअल रूप से पूर्णांकों की अदला-बदली करने के बजाय

            int tempPiece = nCurrentPiece;
            nCurrentPiece = nHoldPiece;
            nHoldPiece = tempPiece;

            int tempRotation = nCurrentRotation;
            nCurrentRotation = nHoldRotation;
            nHoldRotation = tempRotation;

तुम लिख सकते हो

           std::swap( nCurrentPiece, nHoldPiece );
           std::swap( nCurrentRotation, nHoldRotation );

जो आपके कोड को अधिक स्पष्ट और पठनीय बनाता है।

1
Vlad from Moscow 15 सितंबर 2020, 20:34

यह नेस्टेड अगर:

if (bKey[5]) 
{
   if (!pieceHold) 
   {
      // ...
   }
}

के बराबर है:

if (bKey[5] && !pieceHold)

आपके उदाहरण में, आपने शर्तों की अदला-बदली की है, जो नेस्टेड if के बराबर नहीं है।

ध्यान दें कि शर्त नेस्टेड if के बराबर है, क्योंकि && शॉर्ट-सर्किट होगा। इसका मतलब है, कि !pieceHold का मूल्यांकन केवल तभी किया जाता है जब bKey[5] सत्य हो।

7
cigien 15 सितंबर 2020, 21:55