俄罗斯方块游戏的行清算算法问题?

时间:2017-06-23 22:46:18

标签: c#

我正在研究基于文本的俄罗斯方块游戏,并遇到一些清除线问题。我有我的DeleteRow()方法,它通过从给定行向上工作删除给定的行,用它上面的行的数据覆盖每一行的数据。这似乎有效:

setWindowIcon

其中“still”是这样定义的2D数组。

/**
 * Deletes row r from the array of landed Tetromino blocks.
 * @param r The row to delete from the landed array.
 **/
private void DeleteRow(int row) {
    for(int r = row; r > 0; r--) {
        for(int c = 0; c < Board.WIDTH; c++) {
            // Overwrite the value of this column from the row above.
            still[r, c] = still[(r - 1), c];
        }
    }
}

并在此处初始化:

private int[,] still;

但是在我的CheckRows()方法中调用了DeleteRow(),我似乎遇到了一个问题,即它将清除传递给它的第一行,但后续行被忽略或者它会删除错误行:

public Board() {
    still = new int[Board.HEIGHT, Board.WIDTH];
}

我必须假设这与调用DeleteRow之后的行有关,在那里我增加了需要清除的其他行的行号,以便考虑到我将每行向下移动到删除该行。

我注意到,如果在第一次CheckRows()调用中没有删除这些行,它们将在主游戏循环的下一次迭代中。

我使用的逻辑中是否存在一些缺陷?这是我第一次制作俄罗斯方块游戏。我这样做是为了熟悉C#,我只是不确定这里的问题是什么。其他人可以发现什么是错的吗?

2 个答案:

答案 0 :(得分:2)

  

我必须假设这与调用DeleteRow之后的行有关,在那里我增加了需要清除的其他行的行号以解释我移动每行的事实向下删除该行。

这就是你要说的话:

rowsToClear.ForEach(x => x++);

这行代码绝对没有:值不会增加。

您可以对在ForEach中传递给委托的元素执行操作,但不能用新值替换它。以下是MSDN的文档:

  

不支持修改Action委托主体中的基础集合,并导致未定义的行为。

这不起作用,也不会这样:

foreach (var thisNum in nums)
{
    thisNum++; // <== will not compile
}

这将增加列表:

for (int i = nums.Count - 1; i >= 0; i--)
{
    nums[i]++;
}

<== Try Me ==>

答案 1 :(得分:0)

在重新安排我的CheckRows方法之后,我意识到解决方案是我需要从上到下删除行,而不是从下到上。