X836696023
本帖最后由 X836696023 于 2020-12-9 15:03 编辑

如何获取玩家脚下"岛屿"(与大地以AIR隔绝开的空中方块(不知道该怎么表达了233~))的所有Block实例?
如下图所示,玩家站在那堆STONE上获取这7个STONE方块(不包含AIR)。






天辉胡萝卜
递归

获取脚下方块——方块的相邻非空气方块——(方块的相邻非空气方块)的 方块的相邻非空气方块——...

注意控制递归层数,否则堆栈溢出

X836696023
本帖最后由 X836696023 于 2020-12-10 01:35 编辑
暮色胡萝卜 发表于 2020-12-9 15:35
递归

获取脚下方块——方块的相邻非空气方块——(方块的相邻非空气方块)的 方块的相邻非空气方块——... ...

我使用了递归,但是出现刷屏报错。
实际上我测试的时候就1个方块,都能造成栈溢出。
不知道我哪里写错了。




  1.     fun checkBlock(original: Block, prev: BlockFace? = null): Map<Location, Block> {
  2.         val map = mutableMapOf<Location, Block>()
  3.         for (blockFace in BlockFace.values()) {
  4.             if (blockFace == BlockFace.SELF) continue
  5.             if (prev != null && blockFace == prev.oppositeFace) continue
  6.             val block: Block = original.location.block.getRelative(blockFace)
  7.             if (block.type != Material.AIR) {
  8.                 map[block.location] = block
  9.                 map.putAll(checkBlock(block, blockFace))
  10.             }
  11.         }
  12.         return map
  13.     }
复制代码



天辉胡萝卜
本帖最后由 暮色胡萝卜 于 2020-12-10 01:41 编辑
X836696023 发表于 2020-12-10 01:31
我使用了递归,但是出现刷屏报错。
实际上我测试的时候就1个方块,都能造成栈溢出。
不知道我哪里写错了。 ...



你似乎没排除已有方块的情况
方块A传方块B,方块B回传方块A

X836696023
暮色胡萝卜 发表于 2020-12-10 01:40
你似乎没排除已有方块的情况
方块A传方块B,方块B回传方块A

应该怎样正确排除。
我上面代码尝试用排除对面方块,但仍然失败。

天辉胡萝卜
X836696023 发表于 2020-12-10 10:57
应该怎样正确排除。
我上面代码尝试用排除对面方块,但仍然失败。

调用树中判断map中是否已包含location