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 は、色と bool isOccupied = false を持つ TCells の配列を保持します。

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

それはクラッシュし、ここに問題があることを示しています.Imは現在学校でC ++を学んでいます。助けていただければ幸いです。また、e->KeyData == Keys::Left) などを使用して左右に移動し、ループを通過したときに新しいブロックを作成するための Keydown にも苦労しています。あなたがそれをチェックしたいなら、私は私のプロジェクトrarを持っています。私はすべてのクラスを完了しましたが、それをまとめるだけでも大変です。

プロジェクトテトリス

4

1 に答える 1

1

3つの問題があります。

  • まず、isCellOccupiedがfalseを返した場合にのみmySquaresを移動する必要があります(現在の場合はtrueではありません)。すでに占有されているセルにブロックを移動するように見えるため、これがクラッシュの原因であると思われます。
  • 次に、isCellOccupiedがtrueを返す場合、canGoDownをfalseに設定し、forループから抜け出す必要があります(または、canGoDown(== true)をforループの追加条件(j <temporaryCopy-> Length && canGoDown)にします)。現状では、関数がfalseに設定されることはなく、正しくないため、関数は常にtrueを返します。
  • ここで仮定を立てるだけですが、すべてのmySquaresが4つの要素で構成されているわけではありませんか?4つの要素でtemporaryCopyを初期化していますが、mySquaresに4つの要素があるかどうかは明確ではありません。そうでない場合、これは危険である可能性があります。最初のループでmySquares-> Lengthでループし、範囲外の可能性があるそのインデックス値でtemporaryCopyをアドレス指定しているためです。そして後で反対のことをします。すべてのループで定数(4)を使用するか、常にmySquares-> Lengthを使用して(特にtemporaryCopy配列を作成する場合)、両方の配列に同じ数の要素が含まれるようにすることをお勧めします。
于 2012-08-24T14:37:29.553 に答える