7 Billion Humans
if コマンドの説明
if は「もし、○○が××なら△△する」というコマンドです。
if で指定した条件を満たしているかいないかをキャラクターが判断して、実行するコマンドを自動で選んでくれます。
if の中に if を入れる "入れ子" が可能です。「else」で実行するコマンドが必要ないのであれば else はなくても大丈夫です。
上手くいかないときは、単純に条件の指定を間違えていないかを確認するのがいいと思います。
このコマンドを使うと、例えば、立っている場所にパネルがなければ進んで、パネルがあるなら持ち上げる、ということを判断して行動してくれます。
入力欄の説明1 : 何を比較するか
2 : どう比較するか
3 : 何と比較するか
4 : 条件の追加
5 : 条件を満たしていた時のコマンド
6 : 条件を満たしていないときのコマンド
7 : if コマンドの範囲
1
「方向」はキャラクターを中心とした方向です。方向を指定したときは、その方向に何があるかで変わります(*)。
「アイテム」を指定したときは "自分が持っているパネルの数字" です。
2
「=」は "1 と 3 が同じなら"
「≠」は "1 と 3 が違うなら"
「>」は "1 が 3 より大きいなら"
「>=」は "1 が 3 より大きいか同じなら"
「<」は "1 が 3 より小さいなら"
「=<」は "1 が 3 より小さいか同じなら"
例えば、1 が「方向」、2 が「=」、 3 が「穴」という条件の場合、1 の方向が穴なら 5 を実行し穴でなければ 6 を実行します。
3
「方向」は 1 のときと同じです。
「何かある」は何もない床以外です。パネルでもカベでも何かがあるのなら「何かある」です。鉢植えとか机とかを指定したい場合にも使えます。
「何も無い」は何もない状態です。"アイテム=何も無い" と指定すると "パネルを持っていないなら" となります。
「0~99の数字」はパネルの数字です。1 で「方向」を指定している場合は、床にあるのか社員が持っているのかに関係なく、指定した方向のパネルの数字になります。
4
条件の追加は、「and」なら "2つの条件を両方とも" 満たしていたら 5 のコマンドを実行、「or」なら "2つの条件のうちどちらか" を満たしていたら 5 のコマンドを実行、になります。どの条件も満たさない場合は 6 のところのコマンドを実行します。
5
条件を満たしていたときに実行して欲しいコマンドはここに組みます。条件を満たしていないときは実行しません。
条件を満たしていたらここのコマンドを実行して、6 にあるコマンドは実行せずに if コマンドを終了します。
6
条件を満たしていないときに実行して欲しいコマンドはここ(else の下)に組みます。条件を満たしていたときは実行しません。
条件を満たしていなかったらここのコマンドを実行して if コマンドを終了します。
ここのコマンドを省略することも可能です。その場合、条件を満たしていないときは何もせずに if コマンドを終了します。
7
青い縦線が if コマンドの範囲になります。線の外側のコマンドは通常のコマンドになります。
※ 1 で「方向」を指定したときの仕組み
指定した方向が、何もない床なら「何も無い」、パネルなら「パネル」 と「パネルの数字」の両方、パネルを持った社員なら「社員」と「社員が持っているパネルの数字」の両方、という感じで、そこにあるもの全てが対象になります。
例えば、方向で上を指定してそこにパネルがある場合、仕組みとしては "上はパネル" でもあるし "上は数字" でもあるということになります。そのため "上にパネルがあるかどうか" という条件の指定もできるし "上のパネルの数字" という条件の指定もできます。
社員がパネルを持っている場合も同じなので、社員にパネルを持たせたままで数字の比較などをすることができます。
具体的な例立っている場所にパネルがあれば持ち上げる 、パネルがなければ上に進む
右が穴なら上に進み、穴でないなら右に進む
右に穴があるキャラは上に進んでパネルを持ち上げる、他のキャラは右に進んでパネルを持ち上げる
2つのパネルのうち数字の小さいほうを持ち上げる
状況によっては、違う条件の if コマンドでも同じ結果になることもあります。
画像上は、上がカベなら右に進む、上がカベでなければ上に進む
画像中は、上がカベでなければ上に進む、上がカベなら右に進む
画像下は、上に何もなければ上に進む、何かがあれば右に進む
条件が違いますが3つとも同じ結果になります。どのコマンドでも右に進んで穴に落ちます。
and と or の具体的な例and は "条件を全て満たすなら"
or は "どれか1つの条件を満たしているなら"
and : 右と左の両方が穴なら上に進む、それ以外なら右に進む
or : 上が穴かカベのどちらかなら右に進む、穴でもカベでもなければ上に進む
条件の複数指定は分かりにくいのですが、凄く便利な使い方でもあるので覚えるといいかなと思います。
3つ以上の条件指定and と or で3つの条件を指定したときはわかりにくいです。 例えば、A and B or C とした場合、(A and B) or C なのか A and (B or C) なのか分かりません。 断言はできないのですが、3つ指定したときの実際の動きを見ると A and B or C は (A and B) or C で、A or B and C は (A or B) and C に見えます。どういう順番で and と or が並んでいても A and (B or C) といった判断の仕方はしないようです。 4つだと、A and B and C or D は ((A and B) and C) or D になり、A and B or C and D は ((A and B) or C) and D になっているように思えます。条件の頭のほうからカッコでくくられていくのだとすれば、5つだと、(((A or B) and C) and D) or E になるかもしれないです。ただ、4つ以上というのは使うことはないかもしれないです。
jump と組み合わせるif と jump を組み合わせると、例えば、立っている場所にパネルがなければ進んで、進んだ先にパネルがあれば持ち上げて止まる、なければまた進む、ということを繰り返し判断して行動してくれます。
else の省略 や jump の位置によって全く違う結果になることもあるので難しいですが、覚えると色々な動きを実現できます。
条件を満たしていたときに jump させると、条件を満たしているかぎりは if コマンドを繰り返します。
下の画像の場合は、上が穴でなければ上に進み続け、穴の前まで来たら右に進んで if コマンドを終了します。
条件を満たしていないときに jump させると、条件を満たすまで if コマンドを繰り返します。
下の画像の場合は、パネルのところまで上に進み続け、パネルのところまで来たら持ち上げて if コマンドを終了します。
if コマンドの外に jump があると、if コマンド自体を繰り返すことになります。この場合は、キャラクター全員がずっと if コマンドを繰り返すことになるので次のコマンドに移れません。
jump の具体的な例"if (足元=パネル)" にしてコマンドを組み、パネルのところまで進ませることができます。
"if (足元≠パネル)" and "(上≠穴)" という条件にすると、足元がパネルでなくて上が 穴でないなら進む、となるので進み続けて落ちてしまうことを防げます。
if コマンド自体を複数組み合わせると、穴を上手く避けてパネルを拾わせることもできます。
if と jumpif と jump を組み合わせることで色々な行動を実現できます。
クリアするためだけではなく、コマンド数の節約や、if と jump で分岐先だけを指定して行動用のコマンドは別に用意しておくという使い方もできると思います。
プログラムとかを少しでも習ったことがあれば把握できるとは思いますが、もし意味が分からないときは時間をかけて色々と試して覚えるしかない気がします。
コマンド数と行動時間の関係"コマンドが少ない = 行動時間が短い" ではないです。例えば、if を使うとコマンド数を節約できる場合もあるのですが、if を使わず素直にコマンドを並べたほうが行動時間を短縮できるときがあります。
5歩進んでパネルを持ち上げるというのを実現する方法として、step を5つ並べるのと if で分岐させるのを比べると、行動時間は step を並べたほうが短いです。if は分岐の判断で処理時間が発生するので、判断をするたびに立ち止まることになるからです。
ただ、step を並べるといった方法は中盤を過ぎると凄まじいコマンド数になって入力が面倒になってしまうので、その辺のバランスを取るのに悩むことになると思います。
大きく時間を短縮するには発想を変える必要がありますが、もう少し時間を短縮したいといった場合は、コマンド数は増えますが if の無駄をチェックするといいかもしれません。
下の画像は32年目でキャラクター1人1人に対して単純にコマンドを追加していった場合です。コマンド数は200になります。31秒でクリアできますが凄く面倒です。