gpt4 book ai didi

java - 迭代所有相同类型的连接 block

转载 作者:行者123 更新时间:2023-12-01 18:00:42 25 4
gpt4 key购买 nike

我有一个事件,当用指南针右键单击时,将一个 Block 添加到 HashSet 中。但是,我想将连接到第一个 block 的相同类型的所有 block 添加到集合中。我应该如何做才能防止延迟?

最佳答案

首先,创建一个 BlockFace 数组,它代表 block 的所有 6 个边。 (前、后、左、右、上、下)。

//These are all the sides of the block
private static final BlockFace[] faces = {
BlockFace.DOWN,
BlockFace.UP,
BlockFace.NORTH,
BlockFace.EAST,
BlockFace.SOUTH,
BlockFace.WEST
};

接下来,您创建一个私有(private)方法来遍历所有这些 block 面并检查该侧的 block 是否具有相同类型,并将这些 block 添加到尚未检查的 block 列表中。我们稍后将使用此列表。

在此方法中,results 是连接到用指南针单击的 block 的所有 block 的集合,todo 是尚未连接的 block 的列表以同样的方式进行检查。

private void getConnectedblocks(Block block, Set<Block> results, List<Block> todo) {
//Here I collect all blocks that are directly connected to variable 'block'.
//(Shouldn't be more than 6, because a block has 6 sides)
Set<Block> result = results;

//Loop through all block faces (All 6 sides around the block)
for(BlockFace face : faces) {
Block b = block.getRelative(face);
//Check if they're both of the same type
if(b.getType() == block.getType()) {
//Add the block if it wasn't added already
if(result.add(b)) {

//Add this block to the list of blocks that are yet to be done.
todo.add(b);
}
}
}

最后,使用以下方法遍历所有尚未检查的 block ,并为所有这些 block 调用上面的私有(private)方法。这是我能想到的最有效的方法。

    public Set<Block> getConnectedblocks(Block block) {
Set<Block> set = new HashSet<>();
LinkedList<Block> list = new LinkedList<>();

//Add the current block to the list of blocks that are yet to be done
list.add(block);

//Execute this method for each block in the 'todo' list
while((block = list.poll()) != null) {
getConnectedblocks(block, set, list);
}
return set;
}

请注意,您不能在 aSync 线程上运行这些方法,因为这可能会导致 CurrentModificationException,并且这可能会导致游戏本身出现奇怪的行为,具体取决于您使用它的用途。

关于java - 迭代所有相同类型的连接 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41203118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com