ロボットのループを手なずけたい

# はじめに
最近ベーシックエンジンロボット![BR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/ca62e0c2-b10f-74b3-1873-322be705530f.png)よりロボット![GR.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/c279b984-be9c-8bbe-0dcf-af79825a4212.png)を多用するようになりました。ベーシックエンジンロボットから入ると、ロボットのループがなんとなくお尻のすわりが悪いというか、モゾモゾしませんか？それはステップの組み方がちょっと違うせいかもしれません。私も最近までモゾモゾしていたのですが、ようやく手なずけられたような気がします。
そこで、条件を元にループを抜けだすためのいくつかの動きを共有します。もっといい方法があるよ！という方は是非教えてください。
（以下画像はBizRobo!11.4のものです。）
# 条件判断後にどう動かしたいのか？
ループの中で特定の条件に合致した/合致しなかった場合に、やりたいことはいくつかあると思います。今回は以下の4つの方法についてご紹介します。
<strong> 
1\. 通常処理の一部を飛ばす
2\. 次のイテレーションを実行する
3\. ループを終了させる
4\. ロボット自体を終了させる
</strong> 
それでは順番に見てみましょう。

# 通常処理の一部を飛ばす

![B10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/31c05ea7-5ce2-00dc-0e51-b92c6e42f743.png)

条件判断によって実行するステップとしないステップがあって、その後に条件判断の結果に限らず実行するステップがある場合に使います。頻繁に使いますよね。
![例①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/790b5783-1923-d6c5-719c-1ca1449715da.png)
例えば、上の表から順番に、品名にコーヒーがあるか判断し、ある場合は購入者の値をとる、品名がコーヒーであるかないかに関わらず、次の行に移動するため、行数の変数を加算する、といった場合、②のステップで品名がコーヒーか判断、TRUEだったら④のステップで購入者の値を取得、⑤のステップで次の行数を変数に割当する、といった感じです。③は品名がコーヒーでない場合の判断を入れておきます。

これはカンタン！条件によって実行するステップは、判断ステップのすぐ後に並べます。条件に限らず実行するステップは条件付きステップの後に並べます。
通常のステップの流れは①→②→④→⑤→①（以下繰返し）、イレギュラーの場合は①→③→⑤→①（以下繰返し）となります。

:::note info
条件付きステップは、設定した条件がTRUEの場合は条件付きステップ内の後続のステップが実行され、FALSEの場合は条件付きステップ内のステップを実行せず、条件付きステップの外のステップに移動します。つまり、②のステップでFALSEになった場合は④を実行せず⑤のステップに移動しますので、③のステップを入れる必要はありません。今回は分かりやすさ優先で、あえて入れています。
:::

# 次のイテレーションを実行する

![B4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/15f1bee2-20a4-a151-557e-9c8871dd2b15.png)

条件判断の結果によって、ループの中のステップすべてをすっ飛ばし（実行しない）、次のイテレーション（繰り返し）を実行する場合に使います。
![例②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/a7e644df-477b-2f17-ff83-1eb74149edf4.png)
上の表で、先ほどと同じく上から順番に、品名にコーヒーがあった場合購入者の値を取得、加えて取得完了の意味で記号欄に○を入力する、といった場合です。②で品名がコーヒーか判断、④のステップで購入者の値を取得、⑥で記号の欄に○を入力、といった形です。③は先ほど同様、品名がコーヒーでない場合、となります。

この時に使うステップは`コンテニューステップ`です。判断ステップの後にコンテニューステップを入れると①のステップに戻り、次のイテレーションが実行されます。`通常処理の一部を飛ばす`では⑥を実行しましたがこの場合は実行されません。
通常のステップの流れは①→②→④→⑥→①（以下繰返し）、イレギュラーの場合は①→③→①（以下繰返し）となります。

ここで、「ちょっと待て、行数の変数加算は？」と思いました？行数の変数割り当てはループの最初で行ってもいいので、この場合ループ内で、条件付きステップの前に置くと、同じ動きになります。

ただし、上の図の流れであれば、⑥のステップを条件付きステップの中、④ステップのすぐ後に入れれば、`通常処理の一部を飛ばす`と同じように、コンテニューステップを使わなくともできます。じゃあ、このステップいらなくない？？と思ったあなた！意外と使いますよ（笑）

# ループを終了させる
![B6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/1dd99e5e-e976-a651-630e-bbd1ae2a8a48.png)

条件判断の結果によって、ループ処理自体を終了させる場合に使います。
![例③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/7ac9f404-f3d1-4e4c-6d65-24a2c62bd909.png)
上の表で、品名に値がある行は値の取得などを行うが、品名が空欄のB9に来たら、ループ処理を終了させたい、といった場合です。②に品名が空欄ではない、の判断を入れ、その後ろに品名がある場合の処理を入れます。③には品名が空欄である、の判断が入ります。私、これ結構使います。

この時に使うステップは`ブレークステップ`です。判断の結果ループを終了させたい場合は、判断ステップの後にブレークステップを入れます。
通常のステップの流れは①→②→④→⑥→①（以下繰返し）、イレギュラーの場合は①→③→⑦（以下繰り返さない！！）になります。

# ロボット自体を終了させる
![B8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/a76c0274-7443-8b5d-3f9d-5fe1e3115e64.png)

レアケースかと思いますが、条件判断の結果ロボット自体を終了させたい場合に使います。
![例③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/7ac9f404-f3d1-4e4c-6d65-24a2c62bd909.png)
先ほどの表と同じく、品名が空欄になったら、ロボットの処理自体を終了させる、という場合です。`ループを終了させる`と何が違うんだ？と思った方に。`ループを終了させる`の場合はループのみを終了させるので、ループステップの後ろのステップは実行されます。ファイルの保存ステップなどがありますね。`ロボット自体を終了させる`は、なんの処理も行わずに終了します。

この時使うステップは`リターンステップ`です。ロボットフローの最後に必ずある、アレです。これも同じように判断ステップの後ろに入れます。
通常のステップの流れは①→②→④→⑥（以下繰返し）、イレギュラーの場合は①→③（終了！！）となります。

# まとめ
上でご紹介したステップは以下にあります。
![step.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/0290eac8-42d8-5475-42b2-d324419a3040.png)![step2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3617070/03b39e98-8287-088e-79a0-c0d3590be1c9.png)
ブレークとコンテニューはループに、リターンは条件と制御にあります。


ループは必ず使う機能なんですが、最初は混乱してしまいます。（私だけかもしれませんが）頭の中もループから抜け出せなくなっちゃうんですが、ちょっとしたコツを知っていると「こう組み合わせればできるな」がピカーンッと閃くようになりますよ。