我有一堆物体(气球)向上移动,撞到屋顶(即object.yPos< = 0),然后停下来。跟随他们的气球击中现有的气球并停下来。现在,我在气球上射击并移除那些被击中的球......如果它们已经在底部那么容易。 然而,我还必须移除那些在其支撑锚被击中和移除后悬挂的气球,即它们不再连接到屋顶或任何其他球。 与此相关,我在Balloon对象中有以下支持方法:
balloon.getAdjacentList() - >返回附加到气球
的所有气球的ArrayListballoon.getX() - >返回气球的X Pos
balloon.getY() - >返回气球的Y Pos 的
我能想到的一种检测“悬空”气球的方法是使用DFS或BFS的“图形遍历”,其中原点将是被击中(并被移除)的目标所有相邻的球。是...如果任何相邻的球(或“相邻的相邻”球或“邻近的相邻”等等)具有getY()< = 0,即找到通往屋顶的路径。
这项检查似乎非常昂贵,特别是在移除一个或两个吊球时,我必须进行数十次搜索。还要记住,从理论上讲,一个气球可能还有许多其他气球,并且仍然有它的锚(支撑它们全部到屋顶的那个)撞击和移除,因此所有它们都必须......所以... if(getAdjacent()。size()== 0)不起作用。
1-有什么更好的想法,看起来很容易想象,并在如此多的游戏中实现? 2-我可以添加哪些支持方法来帮助我检测球?
提前感谢您提供任何帮助
答案 0 :(得分:1)
这是一个简单的算法,可能会为您的目的正常执行:只需从锚点开始,并将您从锚点到达的每个节点标记为可达。完成后,弹出所有未标记为可到达的气球。这个成本在气球加连接的数量上是线性的,我认为这个问题接近最优(因为一个镜头可能会弹出图中的每个气球,你至少需要做O(气球)工作)
答案 1 :(得分:0)
你为什么不告诉我们你正在制作一个Frozen Bubbles克隆?会让问题缩短:)
如果您想避免搜索,请执行某种引用计数计划:
对于每个气球,保留子(附加)气球列表以及计算父(锚定)气球数的整数。当一个气球弹出时,经过它的所有孩子并减少他们的锚数。如果儿童气球在此之后没有留下任何父母,那么也将其弹出(递归地执行或将其添加到某个队列中......)
只要没有循环依赖,这就应该有效。 (我认为情况就是这样。但是,如果存在循环依赖,则图搜索是唯一的解决方案)
顺便说一句 - 进行一次搜索以找到连接的气球只是O(气球的数量)。我非常怀疑你的游戏有这么多气球,这将成为一个真正的问题。毕竟,首先渲染气球应该具有相同的复杂性......
答案 2 :(得分:0)
当气球找到锚点时,让它告诉锚点它正在锚定。 在锚点上保留锚定气球列表 保留发现锚点的气球上的锚点列表 当锚点消失时,告诉锚定的气球它已经消失了。 然后,您可以使用锚点列表来确定是否需要向上移动。
假设你可以堆叠两个以上的气球,你也应该向下移动,只需向上移动最后一个气球,而不是单独移动每个气球。