型 5.宝石があちこちにランダムに

宝石は毎回どこに出現するか予測不可能なので、whileループで目標としては利用しづらいです。なので、今回は多少無駄に行きすぎることもありますが、「行き止まりまで進み」かつ「途中に宝石を見つけたら回収しておく」というスタンスにしました。

スイッチにはtoggleSwitch()という関数があり、オンならオフに、オフならオンにと現在の状態と逆の状態に自動でできて便利でした。なのでワープについても同じようなことができる関数を自作してみました。それがtoggleBluePortal()とtogglePinkPortal()です。

このステージの課題文の後半に、「単に規定数の宝石を集めるだけでなく、関数にまとめるなどしてコードを上手に書こう」的なことが書かれています。本編の繰り返し部分がたったの三行、それも自分で用意した関数三つを呼び出すだけ、で済んでしまったのはなかなかに模範解答じゃないかと思いますが、プログラミングの正解はひとつではないので、単にマネして打ち込むだけでなく、自分なりにパターンを見つけることに挑戦してみてください。

型 4.隅々まで歩き回る

ワープのインスタンスはgreenPortalとorangePortalの2種類があります。
ステージからパッと見て取れるパターンとしては、宝石のゾーンとスイッチのゾーンが線対称になってる点で、片側をひとまとまりの関数にできるかも知れません。ただ左右が逆になると、turnLeftとturnRightの部分を入れ替えなければならないので大変そうです。
そこでもっと小さい単位の共通パターンに目を付けました。「右前にある宝石またはスイッチを処理する」というくくりです。「一歩前へ出て、右を向き、また一歩出て、そこにある宝石またはスイッチを処理」します。宝石/スイッチが4つ固まっているところではこれを4回、2つだけのところでは2回繰り返せば良さそうです。
宝石かスイッチかはif文で判別してそれぞれに適した処理をするよう関数の中に書いておけば、同じ関数で宝石とスイッチどちらにも対応できます。そうしておけば本編部分では宝石ゾーンなのかスイッチゾーンなのかは考えなくてもよくなり、ナビゲーション処理に集中できます。

このステージのナビゲーションはやや複雑で、色々な解き方が考えられます。以下はあくまで参考ですので、自分で良いと思う方法を考えてみてください。またこのステージの主旨はピンクとグリーンのワープを適切にオンオフすることなので、ナビゲーション周りであまり凝ったことをしなくても大丈夫でしょう。

型 3.ワープを正しく操作する

2種類のワープがあるステージです。bluePortalとpinkPortalです。これらはそれぞれ共通の設計図から作られた別々のインスタンス(個体)であり、どちらもisActiveプロパティを備えています。ただ

としても、どちらに対する指示なのかわかりませんし、可能だからといって両方に反映されても困ります。そこでドット記法を使って、どちらに向かってisActiveの内容を変更するのか明確にする必要が出てくるわけです。

ワープがいい感じにオンオフされていれば、ナビゲーションとしては、「宝石に行き当たるまで進み、取ったら振り向く」の繰り返しでいけそうです。今回もfuncで関数化してみました。これでプログラム本編(?)は各ワープのオンオフとナビゲーションの3種類だけで組み上げられるようになります。いつどちらのワープをオンオフすればいいかの検討に集中しましょう。

型 2.ワープのオンとオフ

ここも、必要なタイミングでpurplePortalをオンオフするという以外は比較的単純なステージです。
私はまずワープをオフにして素通りしつつ、「行き止まりまで宝石をとって進む」 というところをひとまとまりの処理と考えて関数にしました。関数の主旨がわかりやすいよう日本語名にしてみました。
振り返った後は、ワープをオンに戻せば、閉スイッチまでが実質の一本道となりますので、「閉スイッチまで進んでオン」という処理をこれまた関数にしました。
もう一度振り返ってワープをオフにすると、再び「行き止まりまで宝石をとって進む」為の関数、行き止まりまで宝石集め()の出番です。

型 1.ワープをオフにする

この節から「ドット表記」という考え方が登場。Aというインスタンス(物体やキャラクターの個体)のBというプロパティ(性質や状態を表す枠)をCという値にする、という指示を

みたいに書きます。この時「.(ドット)」は助詞の「の」みたいなニュアンスです。.がいつでもこういう意味をもつわけではないですが、うしろに「=(イコール)」があって何かを代入してるっぽかったらそういうことだと思えば良いでしょう。
解説文に出ている例の

はgreenPortalというインスタンスの、isActive(オンかどうか)というプロパティをtrue(オン)にするという意味ですね。「isナンチャラ」はこれまでisOnGemなどがそうだったようにtrue(真)かfalse(偽)のどちらかの値しか許されないことを示しています。中には、

みたいにtrue/false以外の値を入れたり取り出したりできる場合もあります。あるインスタンスがどんなプロパティ枠をもっていて、そこのどんな種類の値を出し入れできるかは、インスタンスの元となっている設計図であらかじめ決まっています。同じ設計図から作られたインスタンスなら同じプロパティを扱えます。逆に、

とかやってもエラーになるでしょう。宝石にはisActiveというプロパティがそもそもないからです。この辺りは先々でまた出てくると思いますが、現状知っておくといいのは、.を入力した後の予測変換で思った候補が出て来ない時は、そもそもそのインスタンスに対しては思っているプロパティを使えない→違うインスタンスを選んでたり、綴りを間違っていないかチェックしてみる、ということです。

余談が長くなりましたが、このステージの正解例です。
最初にドット表記でgreenPortalをオフにできれば、あとはそう難しいステージではないと思います。
連続で散歩進む場面がとても多いので、funcを使ってmove3()という関数を作って見ました。そして「真ん中のワープゾーンを基点に先端まで行ってスイッチを入れて戻って来て横を向く」を1まとまりにしてforで繰り返しています。これをfuncにするのももちろんアリです。