很抱歉我在用一般程序语言的思维使用Minecraft的命令系统。
我在试图构思这样的代码:
复制代码
但是,当我试图把以上代码转换为mcfunction的时候,我发现两个问题:
第一,与判断可以用两个if子命令来实现,但是或判断需要怎么实现呢?
对于这个问题,我查到的一个方案是使用tag+选择器,但是我的应用对象是虚拟变量而不是实体。
而我自己想到的方案是两条判断条件单独写一条命令,但我担心这会尝试一些额外的开销:
复制代码
请问这样的实现合理吗?或者有一些更优雅的写法?
第二,如何让if-else不执行其它分支?
对于命令方块而言,可以通过blockdata的设置去实现分支,但是mcfunction没有方块可以交互,又应该怎样确保不执行其它分支呢?
我的想法是,把每一个if的代码块都拆开,然后设置一个flag。如果这个flag没有清除,就可以进入该代码块执行,并且代码块在最后清除这个flag。
复制代码
这是一个好的设计吗?有没有更加优雅的写法?
期盼您的解答!
我在试图构思这样的代码:
- if(cond.a == 1 && cond.b == 1)
 
-         AwesomePlayer.someScore = 2
 
- else if(cond.a == 1 || cond.b == 1)
 
-         AwesomePlayer.someScore = 1
 
- else
 
- AwesomePlayer.someScore = 0
但是,当我试图把以上代码转换为mcfunction的时候,我发现两个问题:
第一,与判断可以用两个if子命令来实现,但是或判断需要怎么实现呢?
对于这个问题,我查到的一个方案是使用tag+选择器,但是我的应用对象是虚拟变量而不是实体。
而我自己想到的方案是两条判断条件单独写一条命令,但我担心这会尝试一些额外的开销:
- execute if a cond = 1 const run ...(设置分数)
 
- execute if b cond = 1 const run ...(设置分数)
请问这样的实现合理吗?或者有一些更优雅的写法?
第二,如何让if-else不执行其它分支?
对于命令方块而言,可以通过blockdata的设置去实现分支,但是mcfunction没有方块可以交互,又应该怎样确保不执行其它分支呢?
我的想法是,把每一个if的代码块都拆开,然后设置一个flag。如果这个flag没有清除,就可以进入该代码块执行,并且代码块在最后清除这个flag。
 
- scoreboard player set if flag 1
 
- execute if if flag = 1 const if a cond = 1 const run function test:if_block_a_eq_1
 
- execute if if flag = 1 const if b cond = 1 const run function test:if_block_b_eq_1
 
 
- # test:if_block_a_eq_1
 
- ...
 
- scoreboard player set if flag 0
 
这是一个好的设计吗?有没有更加优雅的写法?
期盼您的解答!
圈内有人,匿了。
1. 非常合理。此外提供另一个思路,众所周知,「且」是「乘」,「或」是「加」。
2. 是。更优雅的办法没有,但是有更烂的办法,也就是并不分成多个函数,而是在后续每个命令前面加一个 execute if 判断 flag。
最后,停下你优化的脚步。在命令真正开始卡之前考虑细节优化都是耍流氓。不对,真正开始卡了你优化这些细节也没用。记分版相关操作是命令中性能最高的东西之一,真正需要避免的是对实体、方块实体 NBT 的访问、修改等操作。
以上。
1. 非常合理。此外提供另一个思路,众所周知,「且」是「乘」,「或」是「加」。
2. 是。更优雅的办法没有,但是有更烂的办法,也就是并不分成多个函数,而是在后续每个命令前面加一个 execute if 判断 flag。
最后,停下你优化的脚步。在命令真正开始卡之前考虑细节优化都是耍流氓。不对,真正开始卡了你优化这些细节也没用。记分版相关操作是命令中性能最高的东西之一,真正需要避免的是对实体、方块实体 NBT 的访问、修改等操作。
以上。