条件分岐コード 7. 繰り返しを探す

条件分岐コードの最終課題ステージです。
まず一件複雑そうなステージからパターンを探しましょう。中央の道は途中宝石と開/閉両方のスイッチが並んでいます。まずは枝道を無視して、この中央の道をif文でチェックしながら反対側の端まで進むコードを書いてみるといいでしょう。
それができたらあらためて残りの脇道について考えます。どうも右は右、左は左でパターンがあります。そして中央の道から左右どちらに脇道が生えているかもそのコマにあるものと関連付いているようですよ?

連続で進んだり、振り返ったりが多いステージなので、そこも関数にして簡単に一括処理できるようにしてみました。

条件分岐コード 6. 囲まれる

各辺3マスの正方形のステージです。真ん中を除き全てのコマに宝石かスイッチのどちらかが出現するので、漏らさず処理していきます。
4辺の全てのコマの上を通るルートは色々考えられるでしょう。ただし個別にmoveForward()とturnRight()/Left()を書いていくのではなく、上手くループで済ませてみましょう。

σ(^^)は角を基点に1辺をひとまとまりとして考えてみました。ただしスタート地点から最初の角だけはループにおさまらない個別のコードで処理しています。

他にも辺の真ん中のコマを基点にするのであれば、スタート地点から1歩進んだところのコマまで個別に処理し、あとは4回のループにまとめる、なんて捉え方もできるかも知れませんよ?

条件分岐コード 5. 関数をじょうずに使う

今まで学んだ関数(func)、ループ(for)、条件分岐(if)を駆使してステージを攻略します。
最初にbyte君がいる方を手前、向いている方を奥とします。最初に突き当たりまで進むのをA区間、左の階段を降りて振り返ってから、また手前に戻るまでをB区間、さらに振り返って再び奥へ行くのをC区間と呼びましょう。
まずステップ1に指示されるcollectOrToggle()関数を作成します。名前の通り「宝石があれば取り、閉スイッチなら切り替える」関数です。2コマおきにどちらかが出現するのでその前進部分も含めてしまって「1区間を処理する」関数としてみました。

6行目からのif文では「宝石があったら取る」と「閉スイッチなら切り替える」の2つの条件分岐をelse ifをつかって1つにまとめています。

もちろん、↓のように2つの独立したif文にしても構いません。

ただこのステージでは1つのコマに宝石とスイッチが同時に出ることは多分なさそうなので、else ifにしておくと、宝石がでた時点でスイッチがあるかどうかの判断処理はしなくなり、ほんのちょっとだけ実行を速くできる可能性があります。

条件分岐コード 4. 階段を上がる条件を探す

if文の扱いがなんとなく掴めてきたところで、少し詳しい説明が出てきます。
ブール値(ぶーるち、と読みます)というキーワードが登場です。英語ならBool値と書きます。追々登場する変数というものの形の一種なのですが、ここではYesかNoで答えられる疑問文のようなものと思って下さい。例えば、「Is this a pen?(これはペンですか?)」という疑問文は基本的に「はい」か「いいえ」の二択(=ブール値)で答えられます。一方「What is your name?(あなたの名前はなんですか?)」という疑問文は「はい」「いいえ」では答えられません。if文が分岐の条件に扱えるのは前者の「はい」「いいえ」で答えられる内容だけなのです。そしてプログラミングの世界では、この「はい」「いいえ」をそれぞれ「true」「false」と表現します。日本語では「真」「偽」ともいいます。与えられた疑問(条件)が肯定される(成り立つ)時をtrue、否定される(成り立たない)時はfalseと呼びます。

ステージを眺めていきましょう。らせん状のルートを進んで宝石を4つ取ります。ステージは固定なので、「3歩進んで左に曲がり、4歩進んでまた左に…」というコードを書いていってもゴールできます。しかしこのステージではif文を使って解く必要があります。ステップ1の指示に従って、if文の条件にisOnGemを書いたのが下のコードです(//でコメント文を追加してあります)

「宝石があった時になにかをし、それ以外の時は一歩進む」のを16回繰り返す、ということになります。その「なにか」を追加しなければなりません。さて、なにかとはなんでしょう?
宝石があったらやることは大抵決まっていますね。そしてもうひとつマップの最後まで辿り着くまでにしなければならないことがあります。ステージを眺めて考えてみてください。

正解例はこちら。

前のステージではif文の後にelse ifというものがでてきました。今回は単なるelseです。似ているようで違うこの2つを整理しておきましょう。

まずは単なるelseの時。これがif文の基本形です。

if文から連なる一連の}が閉じた後の書かれたものは、もはやif文の関係ないので、条件文のtrue/falseに関係なく常に実行されます。{}で囲んでいる範囲に注目しましょう。
falseの場合に特にすることがない場合はまるっと省略してこう書くこともできます。

次にelse ifを使う場合。

条件(疑問)が2段階になるわけですね。もちろんこの場合も最後のelse以降が必要ない場合は省略できます。
注意して欲しいのは、前ステージで疑問を投げかけた、「else ifではなくifを2つ並べた時」との違いです。

この場合は、3行目の}でAを条件にしたif文は終了していますので、続くB条件のif文には関係しません。else ifでつなぐか新しいif文をはじめるかで動きが違ってくるので注意しましょう。

さらにいうと、if文のtrueやfalseのブロック({}に挟まれた部分)に更に別のif文を書くなんてこともあります。慣れないとちょっとこんがらがってきますね(笑)。

これらの使い分けは追々実際に活用しながら身についていくので、いまは「{}で囲む範囲が重要」と憶えておくくらいで大丈夫です。

条件分岐コード 3. 条件分岐コードをループする

このステージも実行する度に宝石やスイッチの配置が変化します。ただしワープの動作も考えると実は単純な一本道マップなので、お題にあるfor文を使って繰り返すコードは作りやすいでしょう。