forループ 1. ループを使う

同じ処理を何度も繰り返すfor文の登場です。
基本形はこんな感じ。

関数と同じで{}にはさまれた部分が繰り返し実行される内容になります。iとかinとか若干意味不明な部分がありますが、当面はそういうものだと思っておきます。特にSwift Playgroundsではfor文のショートカットをタップすれば、基本文法は自動で入力されて、繰り返したい数字を入れるだけですし。とにかく{}で繰り返す内容をサンドすることだけ注意しておきましょう。たまにうっかり}を消してしまったりしがちなので。またこれもfuncと同じく、{と}の間の行は先頭にスペース4つ入れて字下げしておくとコード全体の見通しがよくなるのでオススメです。

このステージでは、「2歩進み宝石を取り、さらに1歩進む」とワープを通って最初の行の2つ隣の列に移動します。なのでこれをパターンとして列の数(5回)繰り返せばクリアできます。
今までなら

などとするところでしょう。しかしいくら関数が繰り返しに便利だといっても、こう単純に何度も同じコマンドを書くのはめんどくさいですし、後で何回繰り返しているのかも数えないとわかりません。
そこで同じことをその場で繰り返すだかならfor文の方が便利というわけです。

コマンド 5. バグを見つけて直す

ある程度完成しているコードからバグ(間違い)を見つけるステージです。
ある行のコマンドが少し早すぎるタイミングで書かれているので、順番を入れ替えて少し後に実行されるように変更する必要があります。

このステージは修正操作の練習でもあります。単純に間違った行を消して、正しい場所に入れ直してもいいんですが、ここでは手順2,3にある方法を試してみてください。
2では移動させたいコマンドをタップします。するとコマンド全体が青色でハイライトされます。
次に3にあるように、青色になった部分を押さえ、指を離さずに押さえたまま指を移動します(ドラッグ操作)。この時、慣れないうちは右手を使うといいでしょう。青い部分をドラッグすると、指がある辺りの先頭(左端)に青い縦線が表示されます(左手だと自分の手に隠れて見辛いので是非右手でやってみてください)。この青線は、「今指を離すとここに移動するよ」という意味です。周りの行が青線を避けるようにニュルっと動いていきます。なので、最初に青くしたコマンドを新しく置きたい場所に青線をあわせて指を離します。
慣れるまでちょっと面倒ですが、憶えておくとちょっと便利です。ただし必須の操作ではありませんので、どうしても上手くできなくても気にせず先に進んで大丈夫です。プログラムを学ぶということとはあまり関係がない裏技のようなものです。

以下が修正後のコードです。

配列 12. 配列の技

このステージは特にクリア条件はありません。どこか一ヶ所でも変更すればクリア扱いになるようです。好きなようにコードを修正してみましょう。
以下、英文コメントの日本語訳だけ追加しておきます。

19、24、29行目のfor〜in文で、ループ内の一時変数名がどれもcoorとなっていますね。coordinateの略でしょう。別々のループで同じ変数名を使ってますが、それぞれの中で使い捨てなので構いません。ただしあるループの中で他のループをネスト(入れ子)する時は気をつけましょう。

配列 11. 違う方法で配列を作る

新規要素は2つ。

まず、今ステージ上にいる全キャラクターを配列に入れるメソッドです。world.allPossibleCoordinatesのキャラクター版といったところです。17行目まででブロックやキャラクターを条件に従って配置した後、20行目で、その時点の全キャラクターをcharactersという名前の配列を作って格納します。.existingCharacters()メソッド(existingは存在する、という意味)のパラメーターとして、allCordinatesを指定することで全マスが対象になるようですね。

そして、22行目でそのcharactersに入った個々のキャラクターについて、for〜in文を使ってアクションをさせます。このステージで新登場のメソッド、

  • danceLikeNoOneIsWatching()
  • turnUp()
  • breakItDown()
  • grumbleGrumble()
  • argh()

などが使えます。それぞれどんなアクションをしてくれるか試してみましょう。

その他、6行目は最初、列の値しかheightに入っていないので、コメント支持にあるように行の値も足すように書き換えましょう。

実行後はこんな状態になってると思います。

配列 10. ランダムな地形

新登場要素は、毎回ランダムな数字(乱数)を返すrandomInt関数です。

などとすると、randomNumber変数に、0から12までのうちのどれかの整数が入ります。プログラムを実行する度に毎回違った数字になるので、サイコロを振るなどゲーム的なアプリには欠かせない関数です。
このステージでは、7行目で.appendメソッドのパラメータとして使っています。前後のfor文で20回繰り返されるので、9行目の時点でheights配列には0〜12の中のどれかの数字が20個入っていることになります。続くループの中で、これを先頭から取り出し、積み上げるブロックの高さとして利用しているのです。前ステージ同様、コマが20個目以降になるとindexがheights配列がもっている要素数を超えて範囲外エラーになってしまうので、12-14行目のif文で0に戻しています。

ステージとしては、何か所かあるコメント文の下に、その条件に当てはまるコマの時になにかしらの処理(world.place()的なこと)をしろとあります。自分のセンスで好きな処理を書きましょう。また40行目のところには、if文の条件そのものを自分で決めてなにか処理を追加しましょう(以下のコードでは書いてありません)。

上記のコードの実行結果はこんな感じになります。ただし乱数を使っているので、実行する度に各コマの高さが変わり、毎回違った風景になるでしょう。