我如何制作更好的算法,这样某些东西就不会一直“堆叠溢出”

本文关键字:一直 堆叠溢出 溢出 更好 何制作 算法 | 更新日期: 2023-09-27 18:35:13

首先,我正在编写一个小泡泡点击游戏,在其中你点击一个泡泡(荷兰语"Bubbel"),所有直接接触爆泡的相同颜色的泡泡都会弹出。

我对一段代码有一点问题,我不知道为什么它一直这样做。代码如下:

public void checkIfNeighbors(int x, int y)
    {
        bool left = false;
        bool right = false;
        bool up = false;
        bool down = false;
            if(x != 0)
                left = Bubbels1[x - 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x - 1, y].IsAlive;
            if(x != 11)
                right = Bubbels1[x + 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x + 1, y].IsAlive;
            if(y != 0)
                up = Bubbels1[x, y - 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y - 1].IsAlive;
            if(y != 11)
                down = Bubbels1[x, y + 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y + 1].IsAlive;
            if (left)
            {
                pop = true;
                checkIfNeighbors(x - 1, y);
            }
            if (right)
            {
                pop = true;
                checkIfNeighbors(x + 1, y);
            }
            if (up)
            {
                pop = true;
                checkIfNeighbors(x, y - 1);
            }
            if (down)
            {
                pop = true;
                checkIfNeighbors(x, y + 1);
            }
            if (pop)
            {
                Bubbels1[x, y].IsAlive = false;
            }
    }

有没有办法使它更快、更有效?此外,它总是会产生堆栈溢出,但是当我将"ifs"减少到只有一个"if"时,它不会(即使我的气泡线有 12 个相同的气泡长)

我不知道我做了什么,但它以前以某种方式起作用了......

我如何制作更好的算法,这样某些东西就不会一直“堆叠溢出”

想想当你在 5,4 和 5,5 处有 2 个活泡时会发生什么。 假设您打电话给checkIfNeighbors(5,4).

它将看到其右侧的邻居并通过调用checkIfNeighbors(5,5)递归。

该调用将注意到需要处理其左侧的邻居(另一个调用 checkIfNeighbors(5,4)

这成为一个永无止境的循环,您很快就会看到堆栈溢出错误。

解决方法是在处理任何邻居之前弹出当前气泡。

---编辑---

我们需要以两种方式处理"我没有邻居"的情况:

如果从主程序调用,我们不会戳破气泡。

如果由于递归而调用(即,这是最后一个爆破的气泡),我们就会弹出气泡。

解决方法是传递一个标志:

public void checkIfNeighbors(int x, int y, bool inRecursion)
    {
        bool left = false;
        bool right = false;
        bool up = false;
        bool down = false;
            if(x != 0)
                left = Bubbels1[x - 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x - 1, y].IsAlive;
            if(x != 11)
                right = Bubbels1[x + 1, y].GetType == Bubbels1[x, y].GetType && Bubbels1[x + 1, y].IsAlive;
            if(y != 0)
                up = Bubbels1[x, y - 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y - 1].IsAlive;
            if(y != 11)
                down = Bubbels1[x, y + 1].GetType == Bubbels1[x, y].GetType && Bubbels1[x, y + 1].IsAlive;
            if (left)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x - 1, y, true);
            }
            if (right)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x + 1, y, true);
            }
            if (up)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x, y - 1, true);
            }
            if (down)
            {
                Bubbels1[x, y].IsAlive = false;
                checkIfNeighbors(x, y + 1, true);
            }
            if (inRecursion)
            {
                Bubbels1[x, y].IsAlive = false;
            }
    }

在初始调用中,将递归设置为 falsecheckIfNeighbors(5,7,false)