初期化 1.エキスパートを初期化する

いままで、ステージに動かすキャラクターは一人(一匹?)だけだったので、moveForward()やturnLeft()などはドット表記で誰に対する指示かを示す必要はありませんでした。ただこれはプログラミングとしては本当は不完全で、ここからはより本格的な文法にそって、キャラクターのインスタンスも明示してドット記法で指示することになります。正直、Swift Playgroundsの入力操作でこれを徹底するのはかなり面倒くさいですが、先々キャラクターも複数になってきたりするので致し方ありません…

また前ステージまではbluePortalやpinkPortalなどのインスタンスが最初から用意されていましたが、これも本当に自分でプログラミングする時は逐一用意が必要です。これが初期化です。いままでも変数を

などとして用意(宣言)しましたが、それと同じことです。

はExpert()(先頭が大文字で()がついてることに注意)という設計図(クラス)に沿って、expert(先頭小文字で()無し)というインスタンスを作成(初期化)しなさい、ということです。
var(変数)ではなくlet(定数)として作成するのは、expertという名前はプログラム終了まで同じインスタンス(個体)のことを指してかわらないよ、という事です。
初期化が無事完了すれば、いままでどおりmoveForward()やturnLeft()といった命令を与えられるようになります。ただし今後はドット記法を使って、

とセットで書く必要があります。いくつもの命令を連続して書くのはウンザリしがちですが仕方ありません。もうちょっとアプリの反応がサクサクしてるといいんですけどね…

それ以外は今までのステージとかわりません。ナビゲーション周りについては、3歩連続で進む場面が多いので、今回もmove3()という名前で関数を作りました。関数の中でexpert.moveForward()と命令相手を明記しているので、move3()自体はexpert.move3()などとドット表記にする必要は(当面は)ありません。
続いて、中心にあるスタート地点から三方向に同じ距離だけいったところに宝石があるので、これを取ってスタート地点に戻ってくるというのをひとかたまりの処理として関数getGem()を作りました。
そして一方向だけ途中道が途切れていて渡れないところがあります。ここは残り1方向を進んだところにあるスイッチを操作して床板を浮上させる必要があります。ここはmove3()を活用しつつ個別に処理をしました。

余談ですが、いまいちインスタンスの初期化のイメージがわかないという人は、たい焼きとその型をイメージしてみましょう。Taiyaki()という型にたい焼きの形状があらかじめ彫り込んであります。これを使って実際に使える(食べられる)たい焼きを作るのが、

という記述になります。実際にはたくさんのたい焼きを作るので、区別ができるよう名前を変えていきます。

のように番号を振ってもいいし、

と丁寧に名前をつけても構いません。
このステージの

の左辺のexpertは、一体しか使わないことがわかっているので手抜きでそのまんまexpertとしてるので、型/設計図であるExpert()とかぶってわかりづらいのです。
さて、型であり設計図であるTaiyaki()には、「たい焼きにはあんこが入っているもので、その種類も選べる」という決まりも書き込まれていたとします。これは出来上がった個々のたい焼きがぞれぞれもつ個性(プロパティ)であり、

などと指定できるかも知れません。
あるいは、

とかして命令を出せたりして?これらは設計図(クラス)であるTaiyaki()で予め決まっています。それを元に量産された個体がインスタンスです。

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