条件分岐コード 1. スイッチを調べる

前章までで練習した「同じ処理を繰り返す」ということはコンピュータの得意分野でした。あらかじめわかっている作業内用をプログラムに落とし込んでおけば、毎回自動でそれをやってくれて我々は楽をすることができます。しかし実際にプログラミングで自動化したい処理の中には「あらかじめわかっている」ことばかりとは限りません。そこで、その作業をしようと思った時の状況に応じて処理を切り替えられる「判断力」をプログラムにもたせることができたら、ということになります。我々も日常的に「雨だったら傘を持っていく」のようにある特定の状況を「条件」とし、行動を変える(分岐する)、ということをします。この「条件」によって処理を「分岐」するのがこの章のテーマです。

使うのはif文で、出題文にある

は、日本語にすると

という意味になります(ifは「もしも」という意味です)。こう書けばなんとく意味が見えてきませんか?
文法としては、

という形です。func文やfor文と同じく、{}でさせたい処理をサンドします。

ステージの作りは一本道で、途中スイッチが3つ連続で並んでいますが、オン(open)なものとオフ(Closed)なものがあります。まずはなにもしないで「コードを実行」してみてください。なんとそれぞれのスイッチの状態が変化します。toggleSwitchはオンのものはオフに、オフのものはオンにするので、どれとどれがオフかあらかじめわかっていないと、全てをオンにすることができません。
そこで活躍するのが条件分岐をするif文というわけです。「判断したい条件」の書き方は色々あるのですがこのステージでは出題分にあるように単純に「isOnClosedSwitch」としておけばOKです。()はいりません。
ということで、いままで通り3つのスイッチの上でtoggleSwitch()するコードを書き、そのtoggleSwitchをif文で囲む形に変形してみましょう。こうすることで、閉スイッチ上の時だけtoggleSwitch()が実行され、開スイッチなどそれ以外の場合は{}はスキップされるので実行されません。結果として、開スイッチはそのまま、閉スイッチはオンに変更され、全てのスイッチがオンになります。その場その場で判断するので、コードを実行する度に閉スイッチの場所がかわっても柔軟に対応できるのです。

forループ 7. 4つの場所に4つの宝石

forループ編の最終問題だけあってパット見ややこしそうなステージです。
ただし落ち着いてじっくり眺めるとやはりパターンがあることがわかります。宝石はタイトルの通り4カ所に固まっています。その並びに共通性があることに注目してください。そうです。スタート地点から見て「┴」の形に並んでますね。そして右の方にいくとワープがあります。ワープを抜けた位置を新たなスタート位置と考えると、まったく対称の配置で宝石と次のワープが並んでいるんじゃないでしょうか?

また直近の┴に並んだ4つを取る中でもパターンがあります。そこは連続した繰り返しなのでfor文を作って解決してみました。こうするとまたちょっとコードを短くシンプルになります。

最初からなにもかもfor文やfunc文に押し込む必要はありません。最初はベタに1動作1行で書き下していってもいいでしょう。プログラムはまずは目的が達成できることが第一です。
そうして出来上がった後で、もし余裕があればパターンを探してfuncやforに置き換えていきましょう。段々慣れてくればコードを書く前からパターンが読み取れるようになるかも知れません。

forループ 6. 右にも左にも

スタート地点を基点に、右に宝石が2つ、左に閉スイッチが2つあり、それが3列続くというステージです。
ここでも色々なやり方がありますが、私は、「宝石をとり戻る」「スイッチを入れ戻る」という2つのパターンを関数にし、それをfor文で繰り返すというアプローチを取りました。宝石とスイッチ1行文で1つの関数にしてもいいし、まずは宝石だけとって次にスイッチ、というやり方でもいいでしょう。

1列が終わって前の列に進む処理は本編のfor文の中に書いてもいいんですが、毎回必ずtoggle2switches()の直後に実行されることになるので、まとめてしまいました。ただしこれだと3列終わった後に無駄に4列目に進んでしまうという弱点がありますね。

forループ 5. 3つの分かれ道

3列ある脇道の奥にスイッチがあります。列と列は同じだけ離れているので、 「次の列の入り口まで進み、右を向き、スイッチまで7歩歩き、スイッチを入れ、振り向き、脇道の入り口まで7歩戻り、次へ進める様向き直る」がパターンでしょうか。その中で、7歩進むのが生き帰りで2回あるので、それを関数として切り出してみました。

このように、どちらも繰り返し使うパターンを見つけた時に便利なfor文とfunc文ですが、for文はその場で同じ内容を連続して繰り返すのに使い、funcは分散してあちこちに出現するパターンをまとめるのに使う、という違いを憶えておきましょう。

forループ 4. ワープしてループして

ワープがあるとどうしてもステージの見通しが悪くなり、難しく感じてしまいますが、「ワープを通る」ということ自体はコマンドで直接書くわけでなないので、まずは「宝石を取る」というコマンドを区切りとしてパターンを見つけ出してみましょう。