这是我的代码,用于检查将来的移动是否合法,我已经假定其合法并将移动复制到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拥有TCell数组,该数组具有颜色,并且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,如果您想查看的话。我完成了所有的类(class),将其放在一起是很难的。

Project Tetris

最佳答案

我看到三个问题。

  • 首先,仅当isCellOccupied返回false时才应移动mySquares(当前不为true)。我怀疑这是导致崩溃的原因,因为您好像要将一个块移动到已经被占用的单元中。
  • 其次,当isCellOccupied返回true时,应将canGoDown设置为false并退出for循环(或者更好的是,使canGoDown(== true)成为for循环的附加条件,即j Length && canGoDown)。实际上,您的函数始终返回true,因为它永远不会设置为false,并且不能正确。
  • 只是在这里做一个假设,但不是所有mySquares都由4个元素组成吗?您正在初始化带有4个元素的临时复制,但尚不清楚mySquares是否具有4个元素。如果不是这样,这可能很危险,因为在您的第一个循环中,您正在mySquares-> Length上循环并使用该索引值(可能超出范围)来寻址temporaryCopy。然后相反。在所有循环中最好使用常量(4),或者最好使用mySquares-> Length(尤其是在创建临时复制数组时)以确保两个数组包含相同数量的元素。
  • 关于c++ - 当单元格是否为空时,CLI/C++ Tetris块崩溃MSVisualStudio 2008,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12109860/

    10-09 13:33