我在练习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
……我的眼睛有点疼。(