パラメータ 8. 2つの山

大きく3種類の道から成っているステージです。両側の砂の道、草の道、そして真ん中のフロート板7枚で構成された道です。真ん中のフロート板の道を1段階上げてやると、両側の道の片方の端と高さが揃って、歩いて行き来できる一本道になります。ので、N字のように往復しながら宝石を規定数(totalGem)集めていきます。
まずフロート板の上げ下げ係のexくん(Expert型)を作り、スイッチ前に移動させます。彼の仕事はフロート板を1段終わりだけで終わりです。
次にchくん(Character型)を作りスタート地点に移動。今回は3つの道のそれぞれで、端から端まで移動しつつ宝石を取る動作をひとまとまりとし、関数jumpToEdge()を作りました。砂の道と草の道は段差があるのでmoveForward()だけでなくjump()も使い分けなければなりません(ぶっちゃけ全部jump()で進めるのですが、まぁプログラミングの練習なので一応if文で行き止まりかどうかで分岐させてます)。とった宝石の数はgemsという変数で記録していきます。collectGem()したら必ず+=1しておきましょう。

本編では「規定数の宝石を集める」のがゴールなので、「とった宝石数gemsが規定数totalGemに満たない場合は繰り返す」whileループをメインループとしています。その中でjumpToEdge()を呼んで今いる道の反対側の端まで行き、端の行き止まり状況に応じて左右に向きをかえる分岐をしています。

2019.1.17編集

Swift 4.2版では昇降スイッチの位置が変わったようで、それを操作するexくんの配置座標をatColumn:1 row:4からAtColumn:0 row:4に変更しました。

パラメータ 7. 2つのエキスパート

このステージのポイントはキャラクターが両方ともExpert型だということです。なので両方ともexpertやexという名前にしてしまうと混乱してしまいます(というかエラーになります)。そこで、私はex1とex2のように番号をふった名前にしてみました。taroとhanakoでも構いません。
それぞれの違いにだけ気をつけて、あとはじっくり順をおって作り込んでいけば大丈夫です。

パラメータ 6. 2つのキャラクターを置く

2つのキャラクターを使い分ける練習です。Character型のキャラに.jump()という能力(メソッド)が追加されました。isBlockedな場面でも1段分の高さなら飛び乗ったり飛び降りたりできるようになります。適切な場面で活用してクリアを目指しましょう。

パラメータ 5. 川を渡る

キャラクターをステージの好きな位置に移動する.placeメソッドに向きを指定できるプロパティが追加されました。同じ.placeでも
前ステージやったのはこういう形でした。

今回はこうです。

facing:が2番目のパラメータとして追加されていますね。facingにもたせるべき値は向きを示す東西南北の情報ですが、説明文によるとDirection.east、Direction.west、Direction.north、Direction.southという「列挙」という形式で指定するとあります。列挙がなにかはここではあまり気にしなくて良いでしょう。Bool型がtrueとfalseしか受け付けないように、予め決まった候補だけを指定できるものと考えておいてください。ただしDirectionは省略して、.west、.southなどドット以降だけで大丈夫とも書かれています。というか、予測候補には単にwest、southとドットもなしで出てくるし、実際それでエラーにもならないみたいですね。まぁ、これは.placeメソッドの設計がたまたまそうであるということで、常にメソッドのパラメーターはそういうものである、ということではないので、ここではそういうものだと思っておきましょう。いつか自分でメソッドを設計することになったら、自分でその辺りも決めることになります。

今回、expertと打つのがめんどくさいので省略してexとしました。その場合、他のあらゆる部分でもそれに統一していることに注目してください(もちろんいままで通りexpertとしてもいいですし、全然別の名前をつけてみてもOKです)。

ナビゲーションとしては、「行き止まりまで進みつつ、途中見つけた宝石を取っていく」と「それをした後、突き当たりにあるスイッチを操作。また左右曲がれる方向に曲がる」という2つの関数を作成しました。スイッチ操作は上げるべき箇所と下げるべき箇所があるので、さっそくパラメータをもたせる技を活用してみました。以前のステージであったように、func文の先頭行にある()にup:boolと書いておきます。

そうするとupという名前でtrueかfalseのどちらかを受け付けるようになります。そして関数内の処理で実際にturnLockする時のupにupを指定します。

ややこしいですが、ひとつめのupはturnLockメソッドのパラメーターを区別する名前、:の後の2つ目のupはfunc文で決めた変数の名前です。赤字部分同士が対応付いています。

もし、区別しやすくするなら、それぞれisUpと変えてもOKです。

これで、上げるか下げるかだけは都度変更できる関数が実現し、一箇所違うだけなのにわざわざ別々の関数を用意する必要がなくなりました。

パラメータ 4. 決まった位置に置く

メソッドは関数と似ていますが、

のように特定のオブジェクト(インスタンスなど)に向かって出すコマンドのことです。メソッドにも()がついてましたが、そこに規定の引数をもたせることができます。
このステージでは、world(世界)というオブジェクトに対してplaceというメソッドを使い、好きなキャラクターの位置や向きを移動させます。今まではlet文で用意するだけでいい感じの場所に勝手に配置してくれましたが、ここからはそれも自分で指定しなければなりません。
placeメソッドはworldの設計図にあらかじめ書き込まれているので、自分でfunc文で用意する必要はありません。アプリの出題文にあるように、

などとします。最初のexpertは動かしたい対象、atColumnとrowはコマを指定する為の列番号と行番号です。マップ上の好きなコマをタップすると「(3,0)」のように2つの数字が表示されます。これらをこの順番でatColumnとrowのところに入れてやればOKです。連続2回続けての処理なので関数にしなくてもfor文で繰り返すのが早いでしょう。

ステージのルートとしては、赤いスイッチと宝石の間を基点とすると、「宝石を取り、スイッチを操作し、道を5マス進む」を2回繰り返すとよさそうです。