ランダム実行

Last-modified: 2024-02-08 (木) 07:09:17

ランダム実行とは

通常、コマンドを実行するときにはそのコマンドに書いてある内容が実行され、毎回同じ処理が行われることになる。しかし、それだとダンジョンギミックがワンパターンになってしまい、面白みが減ってしまう。
そのような場合に役に立つのが、ランダム実行である。
ランダム実行とは、複数のコマンドの中から一つを選んで実行することができる機能の事であり、これにより確率で分岐するようなギミックを作成することができる。

ランダム実行には複数の実装方法があるが、主なものは以下である

 

実装法

基本的な実装法

/randomExecコマンドを用いて、コマンドを直接選択する

応用的な実装法

/randomCommandコマンドを用いて、実行時に乱数をコマンドに埋め込む
/commandscoreコマンドを用いることで確率分岐させる

 

randomExecを使った実装

一番基本的な実装方法。大体のことはこれで事足りる。

簡単な例として、50%の確率でsay 1、50%の確率でsay 2を実行したいなら

randomExec say 1 ? say 2

とすればよい。

この応用で、たとえば1/4の確率でsay 1、3/4の確率でsay 2を実行したいなら

randomExec say 1 ? say 2 ? say 2 ? say 2

とすればよい。

 

ただ、実際にギミックを作る時はもう少し複雑な処理を分岐させたいとなることもある。
そういう時は、その一連の処理を別の所にコマンドブロックの塊として作り、そこにsetredstoneで繋ぐという実装方法が楽である。

例: 50%の確率で音を鳴らし、モブをプレーヤーの周りに召喚する/50%の確率で別の音を鳴らし、プレーヤーにデバフを与えるコマンド

コマンド群① (座標 dungeon:x1,y1,z1に赤石が置かれると実行される)

/soundplay WITHER_SPAWN 2 1

/execute @a[x=●●,y=●●,z=●●,r=●] ~ ~ ~ spawnmob <モブ名> x y z 1 -randamCircle:3

コマンド群② (座標 dungeon:x2,y2,z2に赤石が置かれると実行される)

/soundplay WITHER_DEATH 2 1

/effect @a[x=●●,y=●●,z=●●,r=●] minecraft:blindness 10 1

実際に分岐するためのコマンド

/randomExec setredstone dungeon:x1,y1,z1 ? setredstone dungeon:x2,y2,z2

 

この方法で実装するメリットは、
実装が単純/たかだかn÷mの確率(n,mが十分小さい)を実装するのが簡単/被らずに2個以上選択することも可能という点であり
デメリットは
確率が常に固定される/分岐が増えるにつれコマンドが冗長になりがち(=保守性に欠ける)という点である

randomcommandを使った実装

randomcommandは、その後に書くコマンドに好きな範囲の乱数を挿入できる機能を持ったコマンドであり、これをうまく用いることでランダム実行を行うことができる。

最も単純な例は、赤い床を踏むとダメージを食らうギミックにて、5x5の範囲のどこか1つだけを赤い床にしたい場合

/randomCommand setblock &[11239~11244],120,&[46712~46717] <赤い床のblock名>
とすると11239,120,46712から11243,120,46716までのブロックのうち一個が赤い床になる。

 

これを応用すると、setredstoneと組み合わせることでもっと柔軟なランダム実行が出来ることも分かる。

たとえば5つの分岐をするコマンドがあり、それぞれsay 1/say 7/say 12/say 129/say 1034を実行するとする。

これは以下の様に実装することが可能である。

まず上のコマンドを書いたコマンドブロックを1列にならべる(ここではdungeon:0,100,0からdungeon:4,100,0に並べたとする)

次に、/randomcommand setredstone &[0~5] 101 0のコマンドを格納したコマブロを用意する

最後に上のコマブロを実行する

すると、自動でsetredstone内の&[0~5]が0~4の数字のどれかに置換され、実行されることによりdungeon:0,100,0からdungeon:4,100,0に並べたコマブロのうち一つのみが実行される

 

この方法で実装するメリットは
状況によってrandomexecよりきれいなコマンドにすることができる/分岐処理をするコマンドが単純なので、保守がしやすい/ギミックにもよるが、直感的なコマブロの配置が可能/かぶりを認めて複数コマンド実行可能という点であり、
デメリットは
&の中の最大値の指定をミスりやすい/setredstoneと組み合わせる場合、コマブロの数が膨大になることがあるという点である。

commandscoreを使った実装

これは上のrandomcommandとの合わせ技となる。
commandscoreは基本はコマンドブロックの中にデータを保存し、利用することができる便利なコマンドであるが、そのうちの比較機能を借りるとランダム実行をすることもできる。
基本的な実装は以下となる。

37%の確率でcommand Aを実行する場合

まずcommandscoreを使ってスコアの値を1~100の中からランダムに設定

randomcommand commandscore set &[1~101] dungeon:x,y,z

次に、最低1tickずらして37以下か判定し、37以下ならcommand Aを実行するコマンドを用意

delaycommand 0.05 commandscore under 38 dungeon:x,y,z <command A>

これをうまく応用すると、確率が適宜変わるランダム実行なんかも可能である

好きな確率でcommand Aを実行する場合

commandscoreの比較対象は数字だけでなく、他のcommandscoreも指定できることを利用すると

まず比較対象(すなわち確率を指定するcommandscore)を設定

commandscore set 50 dungeon:x1,y1,z1

後は同様に

randomcommand commandscore set &[0~100] dungeon:x,y,z

delaycommand 0.05 commandscore under dungeon:x1:y1:z1 dungeon:x,y,z <command A>

とすることにより、ランダムに選ばれた数がdungeon:x1:y1:z1に保存されている数字未満であるならcommandAを実行という処理をすることができる。

確率を途中で変更する場合、例えばダンジョンの最初は50%だが、後半に難しくするために75%にする場合なら、その変更時に

commandscore set 75 dungeon:x1,y1,z1
のコマンドを実行すると確率を変更することができる。

この実装方法のメリットは
自由な確率を設定できる/確率の変更が容易/保守性に優れる点であり
デメリットは
commandscoreに対する理解が必要/commandscoreを管理するコマブロを用意する必要がある点である。