新登場要素は、毎回ランダムな数字(乱数)を返すrandomInt関数です。
1 |
var randomNumber = randomInt(from: 0, to: 12) |
などとすると、randomNumber変数に、0から12までのうちのどれかの整数が入ります。プログラムを実行する度に毎回違った数字になるので、サイコロを振るなどゲーム的なアプリには欠かせない関数です。
このステージでは、7行目で.appendメソッドのパラメータとして使っています。前後のfor文で20回繰り返されるので、9行目の時点でheights配列には0〜12の中のどれかの数字が20個入っていることになります。続くループの中で、これを先頭から取り出し、積み上げるブロックの高さとして利用しているのです。前ステージ同様、コマが20個目以降になるとindexがheights配列がもっている要素数を超えて範囲外エラーになってしまうので、12-14行目のif文で0に戻しています。
ステージとしては、何か所かあるコメント文の下に、その条件に当てはまるコマの時になにかしらの処理(world.place()的なこと)をしろとあります。自分のセンスで好きな処理を書きましょう。また40行目のところには、if文の条件そのものを自分で決めてなにか処理を追加しましょう(以下のコードでは書いてありません)。
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
let allCoordinates = world.allPossibleCoordinates var heights: [Int] = [] // Append random numbers to heights. // (heights配列にランダムな数字を追加しなさい) for i in 1 ... 20 { heights.append(randomInt(from: 0, to: 12)) } var index = 0 for coordinate in allCoordinates { if index == heights.count { index = 0 } // currentHeight stores the height at the current index. // (currentHeightにはheight配列のindex番目の数字を保持) var currentHeight = heights[index] if currentHeight == 0 { // Do something interesting if currentHeight is equal to 0. // (currentHeightが0の時、なにか面白いことをしなさい) world.removeItems(at: coordinate) //陸地を削除 world.place(Water(), at: coordinate) //水を配置 } else { for i in 1...currentHeight { world.place(Block(), at: coordinate) //ブロックを配置 } if currentHeight > 10 { //高さが10以上の時 // Do something different, such as placing a character. // (キャラクターを置くなど、なにか別のことをしなさい) world.place(Character(), at: coordinate) //キャラクターを配置 } else if coordinate.column >= 3 && coordinate.column < 6 { //3列目から5列目の時 // Do something different, such as placing water. // (水を配置するなど、なにか違うことをしなさい) world.place(Gem(), at: coordinate) //宝石を配置 } // Add more rules to customize your world. // (あなたの世界をカスタマイズするルールをもっと追加しなさい) } index += 1 } |
上記のコードの実行結果はこんな感じになります。ただし乱数を使っているので、実行する度に各コマの高さが変わり、毎回違った風景になるでしょう。