新規要素は2つ。
まず、今ステージ上にいる全キャラクターを配列に入れるメソッドです。world.allPossibleCoordinatesのキャラクター版といったところです。17行目まででブロックやキャラクターを条件に従って配置した後、20行目で、その時点の全キャラクターをcharactersという名前の配列を作って格納します。.existingCharacters()メソッド(existingは存在する、という意味)のパラメーターとして、allCordinatesを指定することで全マスが対象になるようですね。
そして、22行目でそのcharactersに入った個々のキャラクターについて、for〜in文を使ってアクションをさせます。このステージで新登場のメソッド、
- danceLikeNoOneIsWatching()
- turnUp()
- breakItDown()
- grumbleGrumble()
- argh()
などが使えます。それぞれどんなアクションをしてくれるか試してみましょう。
その他、6行目は最初、列の値しかheightに入っていないので、コメント支持にあるように行の値も足すように書き換えましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
let allCoordinates = world.allPossibleCoordinates for coordinate in allCoordinates { // Change height to be the sum of the column and row for each coordinate. // (各座標の行と列の合計を高さとしなさい) let height = coordinate.column + coordinate.row for i in 0...height { world.place(Block(), at: coordinate) } if height >= 2 && height < 4 { world.place(Character(name: .blu), at: coordinate) } else if height > 5 { world.place(Character(name: .hopper), at: coordinate) } } // Initialize an array of existing characters in the puzzle world. // (パズルワールドに存在するキャラクターの配列を作りなさい) let characters = world.existingCharacters(at: allCoordinates) // For each of the characters, perform a set of actions. // (それぞれのキャラクターにいくつかのアクションを設定しなさい) for ch in characters { ch.danceLikeNoOneIsWatching() } |
実行後はこんな状態になってると思います。