配列 7. 取り除いた値を追加する

world.allPossibleCoordinates(ステージの全てのマスの座標)の代わりに、指定した行の全マスを取得するメソッドが紹介されます。それが3行目です。inRows:パラメーターで整数を指定するとその行の全マスの座標が返るので、それを配列に入れて使用します。

出題文には手順しか書かれておらず、結局ステージがどうなればクリアなのかがわからないままですが、とりあえず//で始まるコメント文に指示してある内容を埋めていくとこんな風になります。

先に実行結果を見てみましょう。シュールな光景ですね(笑)。

まず9行目のfor〜in文では、2列目の全てのマスの座標が配列に入っているので、それをtmpcdnという名前で1つずつ取り出してループ内を実行します。ちなみにtmpというのは「一時的な」という意味のtemporaryを略したもの、cdnはcoodinateを略したもので、あわせてtmpcdnです。深い意味はありませんので、自分で憶えやすい名前にしてください。

で、それらの全マスにword.place()メソッドが実行されるので、端から端までブロックが1段積み上がります。

次に14行目の

ですが、まず()内の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つずつ入っているので、それらすべてにキャラクターを置いていくと、写真のようになるわけです。
ややこしいですが順を追ってじっくり考えてみましょう。

改善希望!役に立った! (+8 rating, 12 votes)
読み込み中...

“配列 7. 取り除いた値を追加する” への2件の返信

  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()は、出てこなかった。このサイトに出会って、やっと完了にこぎつけた次第です。

  2. 急に配列からわからなくなった・・・
    じっくり読みながら理解したいと思います。

    このサイトがあってよかった!!!
    ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です