俄罗斯方块功能,用于检查零件是否合适,无法正常工作



我在练习C++,一直在研究俄罗斯方块克隆。我试着在一些教程的帮助下找到自己的解决方案,学习用这种语言编写代码。我几乎所有其他功能都在工作,但这个功能给我带来了一些问题:

bool Board::isBoxFree(int pX, int pY, int pPiece[][4], int pBoard[][20])
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{

if (pPiece[i][j] != 0)
{
if (pBoard[(pX / 15) + i][(pY / 15) + j] != 0)
{
return false;
break;
}
if (pY / 15 + j > 18)
{
return false;
break;
}

else
return true;
break;
}



}
}

这适用于一些作品,但在不同的俄罗斯方块作品中系统地给出了错误的值。例如,当检查直线是否可以向右移动时,最后一个块与边界重叠。n型或t型没有问题。有时,在功能工作前,tetrominos会重叠一个块,而tetromino会保存到重叠位置的板上。一些tetrominos似乎没有撞到任何东西,但仍然被碰撞,并在本应碰撞的一个街区外被救到了木板上。

这个函数写错了吗?还是我使用二维数组有问题?

这就是我如何检查tetromino是否能在游戏中倒下的方法:

if (this->playBoard(xLoc, yLoc, this->arr, rotate, this->boardArr).isBoxFree(xLoc, yLoc + boxSize, this->arr, this->boardArr))

以下是我如何检查tetromino是否可以向左或向右:

if (this->ev.key.code == Keyboard::Left)
{
if (this->playBoard().isBoxFree(xLoc - boxSize, yLoc , this->arr, this->boardArr)&& move ==false )//(move == false && xLoc>boxSize)
{
xLoc = xLoc - boxSize;
move = true;

}
}
else if (this->ev.key.code == Keyboard::Right)
{
if(this->playBoard().isBoxFree(xLoc+boxSize*3, yLoc , this->arr, this->boardArr)&& move == false) //(move == false && xLoc<boxSize*7)
{
xLoc = xLoc + boxSize;
move = true;
}
}

正如你所看到的,我在检查boxSize是否有可能与至少一些tetrominos一起正常工作时,将其乘以了3。仅此一点就告诉我的代码有问题,我还没有弄清楚。

非常感谢帮助,因为这是我的俄罗斯方块最后遇到的问题之一。即使是清线功能也能工作。

Re:Is this function written wrong

您的Board::isBoxFree()函数在内部for循环中有一个错误(正如Paul所评论的,我已经删除了多余的break(:

if (pPiece[i][j] != 0)
{
if (pBoard[(pX / 15) + i][(pY / 15) + j] != 0)
return false;
if (pY / 15 + j > 18)
return false;
else
return true;
}

您也可以删除else,就像条件是true一样——您已经删除了return。因此:

if (pPiece[i][j] != 0)
{
if (pBoard[(pX / 15) + i][(pY / 15) + j] != 0)
return false;
if (pY / 15 + j > 18)
return false;
return true;
}

因此,对于不是0的第一个pPiece[i][j],如果该位置的板为空,则返回true,而不检查其他元素。

这是一种常见的模式。检查pPiece的所有元素,并在发现冲突后立即返回false。然后,当您退出循环(未发现冲突(时,返回true

回复:is there something wrong with my use of two dimensional arrays?

可能。看着那些/ 15> 18……我的眼睛有点疼。(

最新更新