逻辑AND运算符与嵌套的if语句有什么区别?

问题描述

我认为由于某种原因,当我使用逻辑AND而不是嵌套的if语句时,我的程序无法运行。我制作了一个具有保持功能的俄罗斯方块克隆,当玩家按下C键时可以保持/存储一个方块。我有一个布尔值,可以防止玩家不受控制地交换积木。

由于某些原因,它起作用:

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;

玩家仍然可以不受控制地交换积木,尽管据推测可以防止积木。为什么呢?

解决方法

如果满足以下条件,则嵌套:

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

等效于:

if (bKey[5] && !pieceHold)

在您的示例中,您交换了条件,这不等于嵌套的if。

请注意,该条件等于嵌套的if,因为&&会短路。也就是说,!pieceHold仅在bKey[5]为真时才被评估。

,

第一个代码段中的外部if语句包含else部分

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-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 );

使您的代码更清晰易读。