【发布时间】:2022-01-14 14:47:42
【问题描述】:
我正在练习 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 形没有问题。有时,在功能工作之前,tetromino 会重叠一个块,并且 tetromino 会以重叠位置保存到板上。有些tetrominos似乎没有撞到任何东西,但仍然碰撞并保存在一个街区之外的棋盘上,而它们本应该碰撞。
这个函数是写错了还是我使用二维数组有什么问题?
这就是我检查 tetromino 是否可以在游戏刻度内下降的方法:
if (this->playBoard(xLoc, yLoc, this->arr, rotate, this->boardArr).isBoxFree(xLoc, yLoc + boxSize, this->arr, this->boardArr))
这是我检查四联牌是否可以向左或向右的方法:
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;
}
}
如您所见,在检查是否可以正确使用至少一些 tetrominos 时,我将 boxSize 乘以 3。仅此一项就说明我的代码有问题,我还没有弄清楚。
非常感谢您的帮助,因为这是我的俄罗斯方块最后遇到的问题之一。连线清线功能也有效。
【问题讨论】:
-
return false; break;--break什么都不做,因为你已经返回了。 -
这个函数是写错了还是我使用二维数组有什么问题? -- 你应该写一个简单的
main或test函数给你的isBoxFree函数一个失败案例。然后debugging 问题将是您的下一步。 -
感谢您的澄清和正确做法的帮助。我调查一下。我使用 memcpy 函数将二维数组保存到板上,以避免使用它们的语法困难。这可能会引起反弹,并给我带来一些我还没有弄清楚的问题。或者它可能完全是别的东西......
标签: c++ function multidimensional-array tetris