world.allPossibleCoordinates(ステージの全てのマスの座標)の代わりに、指定した行の全マスを取得するメソッドが紹介されます。それが3行目です。inRows:パラメーターで整数を指定するとその行の全マスの座標が返るので、それを配列に入れて使用します。
出題文には手順しか書かれておらず、結局ステージがどうなればクリアなのかがわからないままですが、とりあえず//で始まるコメント文に指示してある内容を埋めていくとこんな風になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Create an array of all coordinates in row 2. // (2行目の全ての座標の配列を作りなさい) var allCoordinates = world.coordinates(inRows: [2]) // Create an empty array of coordinates. // (座標の空の配列を作りなさい) var cdns:[Coordinate] = [] for i in 1...12 { for tmpcdn in allCoordinates { world.place(Block(), at: tmpcdn) } // Remove a coordinate and append it to your empty array. // (座標を削除し、空配列の方に追加しなさい) cdns.append(allCoordinates.removeFirst()) } // Place a character for each coordinate added to your empty array. // (空配列に追加した各座標にキャラクターを配置しなさい) for tmpcdn in cdns { world.place(Character(), at: tmpcdn) } |
先に実行結果を見てみましょう。シュールな光景ですね(笑)。
まず9行目のfor〜in文では、2列目の全てのマスの座標が配列に入っているので、それをtmpcdnという名前で1つずつ取り出してループ内を実行します。ちなみにtmpというのは「一時的な」という意味のtemporaryを略したもの、cdnはcoodinateを略したもので、あわせてtmpcdnです。深い意味はありませんので、自分で憶えやすい名前にしてください。
で、それらの全マスにword.place()メソッドが実行されるので、端から端までブロックが1段積み上がります。
次に14行目の
1 |
cdns.append(allCoordinates.removeFirst()) |
ですが、まず()内のallCoordinates.removeFirst()で、全ての2列目の座標の配列から、最初の1つを削除します。つまり(0,2)〜(19,2)の20個の配列から先頭の(0,2)が抜かれ、(1,2)〜(19,2)の19個が残ります。配列内での背番号は詰められていきますが、実際の座標自体が詰まるわけではないので注意してください。allCoordinates[0]が(0,2)から(1,2)になります。抜いた(0,2)の座標が()の外側にあるcdns(最初に用意しておいた空の配列)に.append(追加)されます。ちょっと特殊な書き方ですが、removeFirst()などのメソッドを使うと、そこに削除したオブジェクトがその行の中に一時的に残ると考えてください。なので、.append()のパラメータとして引き継がれます。
これが8行目のfor i in 1…12によって12回繰り返されるわけですが、2回目はallCordinatesの中が(1,2)〜(19,2)になっているので、ひとつ奥の(1,2)から(19,2)の19座標に対してworld.place()が実行されます。結果としてさっきよりも1列短い形で2段目が形成されます。そのあとまた.removeされるので、3周目は(2,2)〜(19,2)となり、、結果として1段上がるごとに1列少ないブロックが12段積み上がっていきます。
8〜15行目のループが終わった後は、19行目からのループです。これには1行上がるごとに削られた左端の座標が1つずつ入っているので、それらすべてにキャラクターを置いていくと、写真のようになるわけです。
ややこしいですが順を追ってじっくり考えてみましょう。
このサイトに出会う前に、このAppending Removed Value ( 英語圏)のオリジナルの説明文に四苦八苦しました(Goal:Remove coordinated from one array while appending to another. その後も、// Remove a coordinate and append it to your empty array. だけでは、removeFirst()は、出てこなかった。このサイトに出会って、やっと完了にこぎつけた次第です。
急に配列からわからなくなった・・・
じっくり読みながら理解したいと思います。
このサイトがあってよかった!!!
ありがとうございます。