众所周知, 每个命令方块每tick只能被执行一次
而有一种在1tick内执行不定数量指令的实现方式是自闭链, 这种方式看起来就像是命令方块圈了个封闭形状, 然后就每tick执行了很多遍
这种方式的原理是执行某段命令方块前使用clone复制本tick没执行过的命令方块到即将执行的位置, 覆盖掉那个位置本来的命令方块, 以此绕过每个命令方块每tick只能被执行一次的限制
这种做法被广泛采用, 但有一些弊端:
除此之外还有一些琐碎的弊端, 如
并且我们能发现自闭链的广泛存在的一个规律
我们做一个这样的思考, 要在mcbe的命令方块上进行一个通用的计算, 需要什么
答案很明显, 需要有在1tick内执行不定数量指令的能力
不难得出这样的结论:
经过观察不难发现, 很多命令方块作品的连锁命令方块都会拐弯

如断链, 分支断链, 自闭链
它们拐弯都有目的, 如终止执行, 执行分支, 甚至自闭链会绕一圈指向执行过的路径
这带来了很大的不便, 开发者不仅需要思考逻辑, 还要合理排布命令方块
那么我们换个思路, 回归原始, 把命令方块都排到直线上

为了实现在1tick内执行不定数量指令, 我们做出以下改变

这个视频中展示了一个实现:
有一个更好的策略(我还没来得及用上), 使用命令方块栈, 使用盔甲架来作为指针

作为本文的结束, 也是为了证明这个理论的价值, 以下展示了在mcbe中使用纯命令方块逻辑实现的扫雷




目前最大尺寸是63*65(高*宽)
这个例子证明了在mcbe中实现复杂逻辑的可能性
而有一种在1tick内执行不定数量指令的实现方式是自闭链, 这种方式看起来就像是命令方块圈了个封闭形状, 然后就每tick执行了很多遍
这种方式的原理是执行某段命令方块前使用clone复制本tick没执行过的命令方块到即将执行的位置, 覆盖掉那个位置本来的命令方块, 以此绕过每个命令方块每tick只能被执行一次的限制
这种做法被广泛采用, 但有一些弊端:
- 对于较为复杂的逻辑, 排布命令方块的难度指数上升
一个典型的例子:
这个自闭链嵌套了一个子自闭链来实现双重循环, 它的排布复杂度读者们肉眼可见
而这个自闭链实现的只是这样一个简单的逻辑
- 修改逻辑时, 可能会导致布局重排
- 对于某些布局, 改一个命令方块要改两次, 分别是:
副本部分改一次
直接被执行的部分改一次
- 较难复用一部分逻辑
除此之外还有一些琐碎的弊端, 如
- 由于布局不规则, 有时给某段逻辑划分了一片区域后, 修改时发现空间不够了
并且我们能发现自闭链的广泛存在的一个规律
- clone总是用相同内容的命令方块覆盖掉一些本tick已被执行的命令方块
我们做一个这样的思考, 要在mcbe的命令方块上进行一个通用的计算, 需要什么
答案很明显, 需要有在1tick内执行不定数量指令的能力
不难得出这样的结论:
- 要做到这一点, 必须使用clone来复制命令方块到前方执行
经过观察不难发现, 很多命令方块作品的连锁命令方块都会拐弯

如断链, 分支断链, 自闭链
它们拐弯都有目的, 如终止执行, 执行分支, 甚至自闭链会绕一圈指向执行过的路径
这带来了很大的不便, 开发者不仅需要思考逻辑, 还要合理排布命令方块
那么我们换个思路, 回归原始, 把命令方块都排到直线上

为了实现在1tick内执行不定数量指令, 我们做出以下改变
- clone向正前方复制, 所有命令方块具有统一的方向
- 将所有会被clone的逻辑以一列连锁命令方块的方式单独摆放

- 终止逻辑时向前方setblock一个空气
- 约定一个函数调用方式
这个视频中展示了一个实现:
- 我抽象了一个栈出来, 调用时入栈, 返回是出栈
- 若出栈时发现是空栈, 则调用终止逻辑
有一个更好的策略(我还没来得及用上), 使用命令方块栈, 使用盔甲架来作为指针

作为本文的结束, 也是为了证明这个理论的价值, 以下展示了在mcbe中使用纯命令方块逻辑实现的扫雷




目前最大尺寸是63*65(高*宽)
这个例子证明了在mcbe中实现复杂逻辑的可能性
- 内容版权许可
- 作者保留一切权利,禁止转载
领取红包用户

