问题描述
我认为由于某种原因,当我使用逻辑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 );
使您的代码更清晰易读。