【问题标题】:Tetris function for checking if piece fits doesn't work right俄罗斯方块功能,用于检查是否适合不正常工作
【发布时间】: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 什么都不做,因为你已经返回了。
  • 这个函数是写错了还是我使用二维数组有什么问题? -- 你应该写一个简单的maintest 函数给你的isBoxFree 函数一个失败案例。然后debugging 问题将是您的下一步。
  • 感谢您的澄清和正确做法的帮助。我调查一下。我使用 memcpy 函数将二维数组保存到板上,以避免使用它们的语法困难。这可能会引起反弹,并给我带来一些我还没有弄清楚的问题。或者它可能完全是别的东西......

标签: c++ function multidimensional-array tetris


【解决方案1】:

回复:Is this function written wrong

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

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&gt; 18... :)

【讨论】:

  • 谢谢!在 for 循环之后移动了 return true,并进行了一些清理。现在我有了功能性俄罗斯方块!
猜你喜欢
  • 1970-01-01
  • 2017-02-22
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多