填充所有相同类型的连接网格方块

时间:2016-08-21 20:32:27

标签: algorithm minecraft traversal grid-layout graph-traversal

前言:我知道还有另外一个这样的问题,但是我有非常具体的限制。我已经尽力使这个问题适用于许多人,因为它是一个通用的网格问题,但如果它仍然不属于这里,那么我很抱歉,请相信它。我发现过去的stackoverflow是一个非常挑剔和充满敌意的问题,但是我希望这只是一对坏人。

目标(摘要):检查3D网格中所有连接的网格方块,这些方格是相同类型并且在一个面上触摸。

目标(具体/实施):创建一个"填充桶"带有命令块的Minecraft工具。 对Minecraft的了解并不是真的有必要回答,这更像是一个算法问题,我将远离Minecraft细节。

限制:我可以在具有递归函数的代码中执行此操作,但在Minecraft中存在一些限制,我想知道是否可以绕过。 1:不允许使用数组(数据结构)。在Minecraft中,我可以存储一个整数变量并用它进行基本计算(+, - ,*,/,%(mod),=,==),但这就是它。我无法动态创建变量或让程序创建任何名称我没有提前设置的东西。我可以做" IF"和"或"语句以及从它们派生的所有内容。我不能有多个程序指针 - 也就是说,我不能像递归函数那样需要程序停止执行,从头到尾执行自身,然后继续执行它在哪里 - 我对控制权的控制很少程序流程。我可以使用循环和条件退出(所以FOR循环)。我可以在3D空间中的网格上有一个标记,无论是否存在块都可以移动(我使用装甲架,对于那些知道的人),我可以测试相对于该标记的网格方块。

所以说我的网格只有空格。在相对的角落中存在单独的实心方块群,彼此不相互接触。如果我"使用"我的填充工具在一个块/填充网格方块上,我希望它使用单个标记来检查和识别所有连接的网格方块 - 基本上,我需要确保它遍历整个形状,所有的角落和缝隙,但是而不是没有连接到那个形状的方块。所以最后,两个集群中的一个,我只选择它的一个方块,将被另一种块擦除/替换,而不会影响其周围的其他块。

如果这不属于此,请再次道歉。如果你想要应对这个挑战,那么只有这样才能解决这个问题 - 它不重要或任何事情,我只想这样做。如果你不想,你不必回答它。或者,如果您可以为2D网格解决此问题,那么这也会有所帮助,因为我可以将其扩展为3D工作。

谢谢你,如果我因为我写这篇文章的方式或事实而没有让任何人侮辱我,那么我会认为这是成功的:)

1 个答案:

答案 0 :(得分:1)

在这个和其他来源的帮助下,我想出来了!事实证明,由于所有递归函数(或至少大部分函数)都可以写成FOR循环,我可以在Minecraft中创建递归函数。所以我做了,它的一般想法如下:

为了解释程序,你可以假设情况是一个基本上是空的网格,在其中的一部分中有一组填充的正方形,目标是用不同的块替换该分组的块的类型。我们说分组目前由红色块组成,我们希望将它们更改为蓝色块。

初​​始化:

ID - 用于保存每个标记的ID(分数)的目标(数据结构)

numIDs - 一个整数变量,用于保存ID /标记激活的数量

在ID为[1]的所选网格位置创建一个标记(也就是在" ID"目标中给它一个得分1)。此网格位置将是一个填充的正方形,从中开始替换块。

增加numIDs

主程序:

从1到numID的FOR循环 {

在ID [1]的标记处,用蓝色块填充网格方块

步骤1.将块1测试到+ x以获得红色块

步骤2.如果找到,请使用ID [numIDs]

创建标记

步骤3.增加numIDs

[//为其他五个相邻的网格方格重复步骤1 2和3:+ z,-x,-z,+ y和-y]

删除展位[1]

numIDs - = 1

从每个标记的ID中减去1,以便下一个要评估的标记,即[2],现在具有ID [1]。

}(结束循环)

这就是我想出来的,它就像一个魅力。对不起,如果我的解释很难理解,我试图以对编码员和Minecraft玩家都有意义的方式进行解释,也许两者都没有实现:P