C ++ Tetris:删除行的函数

时间:2014-08-14 07:48:21

标签: c++ tetris

我一直在研究这个俄罗斯方块教程,并且我遇到了删除行并将行/ s降低一级的功能。我对这些功能有什么了解,但有些部分让我感到困惑。我会尝试尽力解释,但如果您需要,请点击课程链接:http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/

对我来说,这看起来像是一个让数组从最后一行开始的函数:

void Board::DeleteLine (int pY)
{
    // Moves all the upper lines one row down
    for (int j = pY; j > 0; j--)
    {
        for (int i = 0; i < BOARD_WIDTH; i++)
        {
            mBoard[i][j] = mBoard[i][j-1];
        }
    }   
}

然后,有一个导致我出现问题的功能,我将解释:

void Board::DeletePossibleLines ()
{
    for (int j = 0; j < 20; j++)
    {
        int i = 0;
        while (i < 10)
        {
            if (mBoard[i][j] != 1) break;
            i++;
        }

        if (i == 10) DeleteLine (j);
    }
}

如果您不熟悉,此处的想法是删除完全由1组成的行。但如果第一行不是if (mBoard[i][j] != 1) break;1会停止循环。如果1阻止它立即做出任何可能的事情,那么循环如何到达mBoard[][]数组中间某处的break

我在这里遗漏了什么吗?这是我对它的解释。也许有人看到了我做的事情?

修改

感谢您的回复,谢谢。

3 个答案:

答案 0 :(得分:0)

break仅中断一个循环,在您的情况下为while循环。 for循环继续愉快。

在旁注中,while可以轻松(并且应该)重构为for,并且可以根据其可识别的for-if-break模式进行压缩:

for (int j = 0; j < 20; ++j)
{
    int i;
    for(i = 0; i < 10 && mBoard[i][j] == 1; ++i);

    if (i == 10) DeleteLine (j);
}

答案 1 :(得分:0)

休息将跳出while循环。因此,如果遇到中间位置为非1的行, i 将成为行中的索引,for循环将继续下一行( j ),再次从i = 0开始。

答案 2 :(得分:0)

您可以像这样构建代码:

for (int j = 0; j < 20; j++)
{
 int i = 0;
    while (i < 10)
    {
        if (mBoard[i][j] != 1) 
        {
            break; //only breaks the while loop and will continue with if (i == 10)
        }
        else 
        {
            i++;
        }
    }

    if (i == 10)
    {
        DeleteLine (j);
    }
}

现在您可以清楚地看到,break;只会中断您的while循环,但不会中断您的for循环。