Minecraft Python开发width>depth时交换x/z变量后无法生成泳池问题
问题原因
你只交换了坐标向量的x/z值,没有同步交换width和depth的取值,当width>depth时:
- x/z坐标轴互换后,x轴方向应该对应原本的depth长度、z轴对应原本的width长度,但后续所有生成逻辑仍使用原有的width、depth参数计算方块范围,会导致
setBlocks的起止坐标大小颠倒。mcpi的setBlocks要求第一个参数的各维度坐标必须小于第二个参数,否则不会生成任何方块,这就是width>depth时无结构生成的核心原因。 - 另外注意你贴出的代码里
>是HTML转义字符,实际运行的代码中需要替换为>,否则判断条件会直接失效。
修复方法
- 交换x/z坐标的同时,同步交换width和depth的值,后续所有计算统一使用实例属性
self.width、self.depth,不要混用入参 - 修正后的判断逻辑如下:
if width > depth: # 交换x/z坐标 temp = self.vec.x self.vec.x = self.vec.z self.vec.z = temp # 同步交换宽深取值 temp = self.width self.width = self.depth self.depth = temp
- 调整
fillpool方法的调用传参,使用实例属性而非原入参:
self.fillpool(self.vec.x, self.vec.y, self.vec.z, self.width, self.depth)
额外优化建议
你可以封装一个安全生成方块的工具方法,自动修正setBlocks的起止坐标大小,避免后续其他逻辑出现同类问题:
def safe_set_blocks(x1, y1, z1, x2, y2, z2, *args): x_min, x_max = min(x1, x2), max(x1, x2) y_min, y_max = min(y1, y2), max(y1, y2) z_min, z_max = min(z1, z2), max(z1, z2) mc.setBlocks(x_min, y_min, z_min, x_max, y_max, z_max, *args)
内容的提问来源于stack exchange,提问作者Mitch Callahan
相关产品推荐
相关产品推荐

