• 欢迎加入MineBBS QQ讨论群:点击查看所有的官方讨论群
  • 我们将于近期对服务器进行迁移,服务可能中断至多2日。请各位安排好自己的访问计划,造成不便敬请谅解!
  • MineBBS入站考试已经上线!想要成为【正式会员】解锁更多功能吗?快来参与吧!【点我去看】

教程攻略 命令方块上的函数抽象

众所周知, 每个命令方块每tick只能被执行一次
而有一种在1tick内执行不定数量指令的实现方式是自闭链, 这种方式看起来就像是命令方块圈了个封闭形状, 然后就每tick执行了很多遍
这种方式的原理是执行某段命令方块前使用clone复制本tick没执行过的命令方块到即将执行的位置, 覆盖掉那个位置本来的命令方块, 以此绕过每个命令方块每tick只能被执行一次的限制
这种做法被广泛采用, 但有一些弊端:
  • 对于较为复杂的逻辑, 排布命令方块的难度指数上升
一个典型的例子:
1000112860.webp
这个自闭链嵌套了一个子自闭链来实现双重循环, 它的排布复杂度读者们肉眼可见
而这个自闭链实现的只是这样一个简单的逻辑
1000112861.webp
  • 修改逻辑时, 可能会导致布局重排
  • 对于某些布局, 改一个命令方块要改两次, 分别是:
副本部分改一次
直接被执行的部分改一次
  • 较难复用一部分逻辑
这些叠加到一起极其致命
除此之外还有一些琐碎的弊端, 如
  • 由于布局不规则, 有时给某段逻辑划分了一片区域后, 修改时发现空间不够了
很明显这对于编写一些复杂逻辑并不友好, 但自闭链有一个可取之处, 它使用clone复制命令方块来执行
并且我们能发现自闭链的广泛存在的一个规律
  • clone总是用相同内容的命令方块覆盖掉一些本tick已被执行的命令方块
这启发我们去思考, 是否一定要用相同的内容去覆盖命令方块
我们做一个这样的思考, 要在mcbe的命令方块上进行一个通用的计算, 需要什么
答案很明显, 需要有在1tick内执行不定数量指令的能力
不难得出这样的结论:
  • 要做到这一点, 必须使用clone来复制命令方块到前方执行
而自闭链最致命的一个缺陷是命令方块难以排布
经过观察不难发现, 很多命令方块作品的连锁命令方块都会拐弯
1000112863.webp
如断链, 分支断链, 自闭链
它们拐弯都有目的, 如终止执行, 执行分支, 甚至自闭链会绕一圈指向执行过的路径
这带来了很大的不便, 开发者不仅需要思考逻辑, 还要合理排布命令方块
那么我们换个思路, 回归原始, 把命令方块都排到直线上
1000112865.webp
为了实现在1tick内执行不定数量指令, 我们做出以下改变
  • clone向正前方复制, 所有命令方块具有统一的方向
  • 将所有会被clone的逻辑以一列连锁命令方块的方式单独摆放
1000112864.webp
  • 终止逻辑时向前方setblock一个空气
  • 约定一个函数调用方式
作为例子, 可以参考我在bilibili的视频作品"函数范式命令方块"
这个视频中展示了一个实现:
  • 我抽象了一个栈出来, 调用时入栈, 返回是出栈
  • 若出栈时发现是空栈, 则调用终止逻辑
栈的实现方式很多, 我的例子中采用了使用盔甲架标记命令方块的策略
有一个更好的策略(我还没来得及用上), 使用命令方块栈, 使用盔甲架来作为指针
1000112862.webp
作为本文的结束, 也是为了证明这个理论的价值, 以下展示了在mcbe中使用纯命令方块逻辑实现的扫雷
1000076140.webp1000076139.webp1000076138.webp1000076142.webp
目前最大尺寸是63*65(高*宽)
这个例子证明了在mcbe中实现复杂逻辑的可能性
 
内容版权许可
作者保留一切权利,禁止转载
领取红包用户
坦白之深渊鲁脚无 Benxp 苍空和龙 公孙芳芸 XiaoXueli

在线管理成员

在线会员

  • oYuyio
  • taohua
  • 小小的子沐呀
后退
顶部 底部