首先我正在写一个小泡泡点击游戏,你点击一个泡泡(荷兰语'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个相同的泡泡长)
我不知道我做了什么,但它在某种程度上起作用了......
答案 0 :(得分:1)
想想当你在5,4和5,5处有2个活着的气泡时会发生什么。假设你打电话给checkIfNeighbors(5,4)
。
通过调用checkIfNeighbors(5,5)
,它会看到右边的邻居和recurse。
该呼叫将注意到左边的邻居需要被处理(另一次呼叫checkIfNeighbors(5,4)
。
这将成为一个永无止境的循环,您很快就会看到stack overflow错误。
修复方法是在处理任何邻居之前弹出当前气泡。
<强> --- ---编辑强>
我们需要以两种方式处理“我没有邻居”的情况:
如果从主程序调用,我们不会弹出泡泡。
如果由于递归而被调用(即,这是最后一个要弹出的气泡),我们会弹出泡泡。
修复是传递一个标志:
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;
}
}
在您的初始通话中,将inRecursion设置为 false :checkIfNeighbors(5,7,false)
。