Swift Playgrounds

コードを学ぼう2【違う方法で配列を作る】解答例と解説

違う方法で配列を作る

解答例

let allCoordinates = world.allPossibleCoordinates

for coordinate in allCoordinates {

  // 各座標について、その列と行の値を足したものを高さに設定します。
  let height = coordinate.column + coordinate.row
    
  for i in 0...height {
      world.place(Block(), at: coordinate)
  }
    
  if height >= 8 && height < 10 {
      world.place(Character(name: .blu), at: coordinate)
  } else if height > 9 {
      world.place(Character(name: .hopper), at: coordinate)
  }
}

// ステージ内にすでにいるキャラクターを含む配列を初期化します。
let characters = world.existingCharacters(at: allCoordinates)

// 各キャラクターを動かします。
for character in characters {
  character.turnUp()
}

解説

for-inループの中で指示されている通りに、heightを『列と行の値を足したもの』にします。

let height = coordinate.column + coordinate.row

 

足された値の数だけブロックを積み上げていくので、
例えば『0,0』の座標には0段、『3,4』の座標には7段のブロックが積まれているはずです。
座標の値はcolumnもrowも、奥に行くに従って大きくなっていくので
このステージも、一番奥が一番高くブロックが積まれています。

そして、heightの値が『8か9』の場合はBlue
10、11、12』の場合はHopperが置かれます。
(このステージの座標は『6,6』が最大なので、足して『12』が最大値になりますね)

そして、次に

let characters = world.existingCharacters(at: allCoordinates)

 

とすることによって、上記に配置されているキャラクターたちの全ての配列を『characters』に入れます。
そうすると、charactersに入っているすべてのキャラクターに指示できるようになります。
(existは、存在する、という意味ですね)
『コードを学ぼう1』の最初の頃やったように、コードは上から順番に実行されます。
最初にキャラクターを配置して、それを『存在するキャラクター』として使うわけですね。

あとは、for-inループでキャラクターたちに好きなメソッドで動作をさせます。
私は、turnUp()がお気に入りです。
Hopperが、昔のアイドルのようなダンスをするのでかわいくて。
みなさんは、どの動作が一番好きですか?(⌒▽⌒)
『』に英語の意味、そしてそれぞれの挙動をまとめておきます。

danceLikeNoOneIsWatching() 『誰にも見られてない感じでダンス』
Blu:片手ずつ上げる Hopper:片手ずつ上げて一回転
turnUp() 『めちゃいい感じ、ひょっこり現れる』
Blu:前転 Hopper:聖子風ダンス
breakItDown() 『ぶっ壊せ、ふざけるな』
Blu:3回ジャンプ Hopper:盆踊り?と1回転
grumbleGrumble() 『愚痴を言う』
Blu:大きなため息 Hopper:上を向いて顔をさわる
argh() 『嫌悪、苛立ち、げー!あー!(読み方はあー!)』
Blu:片足ふんでくやしそう Hopper:残念な顔
要点まとめ

・すでに存在するキャラクターの配列を初期化して使うことができる