为什么我的洪水填充只填充在正 x 和 z 方向?

Why is my flood fill only filling in the positive x and z direction?

下面是来自海关 NPC mod 界面的 JavaScript,它与 minecraft 一起运行。它被假设为 运行 洪水填充例程。它只正确填充到起始位置的正 x 和正 z。在我的世界中,x 和 z 在水平面上,y 是垂直轴。

var node1 = {
  xy: []
};
var blockp;
//starting block type and position
blockp = world.getBlock(npc.getBlockX(), npc.getBlockY() - 1, npc.getBlockZ() + 1);
node1.xy[0] = npc.getBlockX();
node1.xy[1] = npc.getBlockZ() + 1;
node1.xy[2] = npc.getBlockY() - 1;
//
var floodfill = function(nameb, node) {
  if (nameb == "minecraft:stone" ||
    nameb == null) {
    return;
  }
  var blkname;
  //
  world.setBlock(node.xy[0], node.xy[2], node.xy[1], world.createItem("minecraft:stone", 0, 1));
  //
  node.xy[0] = node.xy[0];
  node.xy[1] = node.xy[1] + 1;
  node.xy[2] = node.xy[2];
  blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
  floodfill(blkname, node);
  //
  node.xy[0] = node.xy[0];
  node.xy[1] = node.xy[1] - 1;
  node.xy[2] = node.xy[2];
  blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
  floodfill(blkname, node);
  //
  node.xy[0] = node.xy[0] + 1;
  node.xy[1] = node.xy[1];
  node.xy[2] = node.xy[2];
  blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
  floodfill(blkname, node);
  //
  node.xy[0] = node.xy[0] - 1;
  node.xy[1] = node.xy[1];
  node.xy[2] = node.xy[2];
  blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
  floodfill(blkname, node);
  //
  return;
}
floodfill(blockp.name, node1);

基本上,看起来您正在递减,但实际上您只是重置为默认值。看看这里的这个片段:

//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] + 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);
//
node.xy[0] = node.xy[0];
node.xy[1] = node.xy[1] - 1;
node.xy[2] = node.xy[2];
blkname = world.getBlock(node.xy[0], node.xy[2], node.xy[1]).name;
floodfill(blkname, node);

乍一看,您似乎在从原始位置移动 +1,然后移动 -1。但是,由于您正在修改对 node.xy[1] 的引用,您实际上是将其设置为 +1 然后是 +0。

相反,您可能会考虑这样的事情:

var xy0 = node.xy[0];
var xy1 = node.xy[1];
var xy2 = node.xy[2];

...

node.xy[0] = xy0 + 1;
...
node.xy[0] = xy0 - 1;

这样您就不会修改原始引用。