3

这是我检查未来移动是否合法的代码,我假设它是合法的并将移动复制到 mySquares 数组中。然后我在表单中设置的游戏周期和计时器处理程序中调用此方法,即:

 canvas->drawGrid();
 testBlock->drawBlock();
 testBlock->moveDown();//this method has checkBounds for when hit sides, top & bottom

if(newBlock->canMoveDown()==false)
{
    newBlock->addMySelfToGameBoard();

    mainGameBoard->updateGrid();

}

//timer1 handler finish


bool TTetrisBlock::canMoveDown()
{
    array<Point>^ temporaryCopy = gcnew array<Point>(4);

    bool canGoDown = true;
    for(int i=0;i<mySquares->Length;i++)
    {
        //Set future move
        temporaryCopy[i].X = mySquares[i].X;
        temporaryCopy[i].Y = mySquares[i].Y+1;
    }
    //Check if future move cells are full, if not assign values to mySquares
    //Check if future move is legal
        for(int j=0;j<temporaryCopy->Length;j++)
        {
            if(gameBoard->isCellOccupied(temporaryCopy[j].X,temporaryCopy[j].Y) == true)
            {

                mySquares[j].X = temporaryCopy[j].X;
                mySquares[j].Y = temporaryCopy[j].Y;
            }

        }
    return canGoDown;

}

//end of moveDown

在我的游戏板类中,我有检查 TCell 是否被占用的方法。TGameBoar 拥有一个 TCells 数组,它有一个颜色并且 bool isOccupied = false;

bool TGameBoard::isCellOccupied(int c,int r)
{
    //Checks if TCell is occupied
    return myGrid[c,r]->getIsOccupied();
}

它崩溃并表明这是问题所在,我目前在学校学习 C++。我会很感激一些帮助。我也在为使用 e->KeyData == Keys::Left) 等向左和向右移动而苦苦挣扎,并在通过循环时创建一个新块。如果你想看看,我有我的项目 rar。我已经完成了所有的课程,只是把它放在一起是很难的。

俄罗斯方块项目

4

1 回答 1

1

我看到三个问题。

  • 首先,您应该只在 isCellOccupied 返回 false 时移动 mySquares(不是您当前拥有的 true)。我怀疑这是你崩溃的原因,因为看起来你将一个块移动到一个已经被占用的单元中。
  • 其次,当 isCellOccupied 返回 true 时,您应该将 canGoDown 设置为 false 并跳出您的 for 循环(或者更好的是,使 canGoDown (==true) 成为您的 for 循环的附加条件,即 j <temporaryCopy->Length && canGoDown)。实际上,您的函数始终返回 true,因为它永远不会设置为 false,而且这是不正确的。
  • 只是在这里做一个假设,但不是所有的 mySquares 都包含 4 个元素吗?您正在使用 4 个元素初始化temporaryCopy,但不清楚 mySquares 是否有 4 个元素。如果不是,这可能是危险的,因为在您的第一个循环中,您正在循环 mySquares->Length 并使用该索引值寻址temporaryCopy,这可能超出范围。然后再做相反的事情。在所有循环中使用常量 (4) 可能会更好,或者更好的是,始终使用 mySquares->Length(尤其是在创建temporaryCopy 数组时)以确保两个数组包含相同数量的元素。
于 2012-08-24T14:37:29.553 回答