0

我正在编写俄罗斯方块克隆,这是我真正做过的最大的项目。在实现行删除代码时,我已经开始收到堆栈溢出异常。我认为这可能与我的大量收藏或对 Linq 的低效使用有关。以下是导致问题的具体方法:

void MoveAllAboveDown(int row)
    {
        List<Block> newBlockList = new List<Block>();
        for (int rowCheck = row; rowCheck > _VertOffset; --rowCheck)
        {
            for (int i = _HorizOffset; i < _HorizOffset + _Width; ++i)
            {
                //If the spot above this is filled
                if (_blockList.Where(block => block.Contains(new Vector2(i, rowCheck - 1))).ToList().Count > 0)
                {
                    //insert block here
                    newBlockList.Add(new Block(new Vector2(i, rowCheck), new[,] { { true } }, Color.Black, _texture));
                }
                else
                {
                    var list = _blockList.Where(tempBlock => tempBlock.Contains(new Vector2(i, rowCheck - 1))).ToList();
                    if (list.Count > 0)
                        list.ElementAt(0).Delete(new Vector2(i, rowCheck - 1));
                }
            }
        }
        for (int rowToDelete = row; rowToDelete > _VertOffset; --rowToDelete)
        {
            DeleteRow(rowToDelete);
        }
        foreach (Block block in newBlockList)
        {
            _blockList.Add(block);
        }
    }

如果我能弄清楚如何(如果必须的话,甚至使用单独的站点),我会附上整个源代码。

如果您愿意,我真的不介意有人查看整个代码库并告诉我我写了什么和错误(例如命名约定、算法等)。显然,这不是该网站的用途,但我想我会把它扔进去,因为无论如何我都在攻击代码库。

编辑:这是主游戏文件: http: //pastebin.com/PqVAS56U
这是其余代码: http: //pastebin.com/JjBKZgwN

Edit2:我相信这是一个堆栈跟踪:

'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Users\Patrick\Desktop\OldComp\Users\patrick\Documents\Visual Studio 2010\Projects\Tetris\Tetris\Tetris\bin\x86\Debug\Tetris.exe', Symbols loaded.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\Microsoft.Xna.Framework.Game\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.Game.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\Microsoft.Xna.Framework.Graphics\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.Graphics.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_32\Microsoft.Xna.Framework\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Xna.Framework.Input.Touch\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.Input.Touch.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.Xna.Framework.GamerServices\v4.0_4.0.0.0__842cf8be1de50553\Microsoft.Xna.Framework.GamerServices.dll'
'Tetris.exe' (Managed (v4.0.30319)): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.

Process is terminated due to StackOverflowException.
The program '[7484] Tetris.exe: Managed (v4.0.30319)' has exited with code 0 (0x0).
4

3 回答 3

5

在不跟踪其余代码的情况下,我怀疑其中一部分是使用row而不是rowToDeletein:

for (int rowToDelete = row; rowToDelete > _VertOffset; --rowToDelete)
{
    // DeleteRow(row); // Woops! Typo
    DeleteRow(rowToDelete);
}

编辑:如果不存在,那么它很可能在 DeleteRow 中。

于 2011-10-24T22:33:03.147 回答
3

我没有看到你减少row你传递给MoveAllAboveDown()然后进入的值DeleteRow()。您的DeleteRow()函数再次MoveAllAboveDown()使用相同的row号码调用。

所以他们会一直互相打电话,直到 StackOverflow。

于 2011-10-24T22:43:20.540 回答
3

我认为您获得堆栈跟踪的原因是 MoveAllAboveDown(int row) 调用 DeleteRow(int row) 调用 MoveAllAboveDown(int row) 创建无限循环,正如cornerback84已经指出的那样。

这里有一些其他的提示:

  • 您编辑的问题不是堆栈跟踪,而是跟踪输出
    • 堆栈跟踪意味着调用堆栈的打印输出,它将显示嵌套的当前正在执行的方法。
    • 要查看调用堆栈,请在 Visual Studio 菜单中选择“调试”>“Windows”>“调用堆栈”。
    • 要复制调用堆栈以粘贴到问题中,请单击“异常助手”对话框中的“复制异常详细信息”
  • 由于您要求对命名约定等发表评论,我建议您查看:
于 2011-10-24T23:27:53.030 回答