繁体   English   中英

简单扫雷游戏中的stackoverflow异常

[英]stackoverflow exception in simple mine sweeper game

我正在调用递归函数(在方框上单击鼠标左键),但找不到问题所在。

应该将背景图像更改为正确的数字,将其设置为“按下”,如果该正方形附近的地雷数为0,则将鼠标左键单击附近的所有正方形。

“木板”是二维正方形数组(地雷类)

private void leftClick(int x, int y)
{
    if (!board[x][y].pressed)
    {
        if (board[x][y].bomb == true)
        {
            board[x][y].BackgroundImage = Properties.Resources.bomb;
            if (MessageBox.Show("You lost! new game?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                Form.ActiveForm.Hide();
                Form form2 = new MineSweeper.mainForm();
                form2.ShowDialog();
            }
            else
                Application.Exit();
        }
        else
        {
            switch (board[x][y].numOfMines)
            {
                case 0:
                    board[x][y].BackgroundImage = Properties.Resources._0;
                    if (x - 1 >= 0 && y - 1 >= 0 && x - 1 < row && y - 1 < column && board[x-1][y-1].pressed==false)
                        leftClick(x - 1, y - 1);
                    if (x >= 0 && y - 1 >= 0 && x < row && y - 1 < column && board[x][y - 1].pressed == false)
                        leftClick(x, y - 1);
                    if (x + 1 >= 0 && y - 1 >= 0 && x + 1 < row && y - 1 < column && board[x + 1][y - 1].pressed == false)
                        leftClick(x + 1, y - 1);
                    if (x - 1 >= 0 && y >= 0 && x - 1 < row && y < column && board[x - 1][y].pressed == false)
                        leftClick(x - 1, y);
                    if (x + 1 >= 0 && y >= 0 && x + 1 < row && y < column && board[x + 1][y].pressed == false)
                        leftClick(x + 1, y);
                    if (x - 1 >= 0 && y + 1 >= 0 && x - 1 < row && y + 1 < column && board[x - 1][y + 1].pressed == false)
                        leftClick(x - 1, y + 1);
                    if (x >= 0 && y + 1 >= 0 && x < row && y + 1 < column && board[x ][y + 1].pressed == false)
                        leftClick(x, y + 1);
                    if (x + 1 >= 0 && y + 1 >= 0 && x + 1 < row && y + 1 < column && board[x + 1][y + 1].pressed == false)
                        leftClick(x + 1, y + 1);
                    break;
                case 1:
                    board[x][y].BackgroundImage = Properties.Resources._1;
                    break;
                case 2:
                    board[x][y].BackgroundImage = Properties.Resources._2;
                    break;
                case 3:
                    board[x][y].BackgroundImage = Properties.Resources._3;
                    break;
                case 4:
                    board[x][y].BackgroundImage = Properties.Resources._4;
                    break;
                case 5:
                    board[x][y].BackgroundImage = Properties.Resources._5;
                    break;
                case 6:
                    board[x][y].BackgroundImage = Properties.Resources._6;
                    break;
                case 7:
                    board[x][y].BackgroundImage = Properties.Resources._7;
                    break;
                case 8:
                    board[x][y].BackgroundImage = Properties.Resources._8;
                    break;
            }
        }
        board[x][y].pressed = true;
    }         
}

设置board[x][y].pressed = true; 在左键单击其他地雷之前。 如果您不这样做,其他地雷可能会再次左舔原始地雷。

if (!board[x][y].pressed)
{
    board[x][y].pressed = true;
    ... do the other stuff here
}

除了Olivier指出的问题外,这里还有另一个递归问题,您尚未击中,几乎可以肯定不会进行测试。

if (MessageBox.Show("You lost! new game?", "", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                Form.ActiveForm.Hide();
                Form form2 = new MineSweeper.mainForm();
                form2.ShowDialog();
            }

与其以相同的形式再次玩游戏,不如创建一种新的形式并隐藏旧的形式。 虽然每个游戏只能递归一层,但它消耗了GDI资源(它们不是无限的,如果您泄漏它们,很容易耗尽),因此如果用户玩足够的游戏,就会引爆。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM