コウです、よろしくお願いします!
「ゼロからプログラミングを始める」人に役立つ情報を発信しています。
今回はDay89「ランダムな地形」です。どうぞ!!
解答例
まずは解答例を確認しましょう。
コードは次のようになります。
解答例を動画で確認する
上記のコードを実行した結果がこちらになります。
新しい関数:rundomInt関数
今回は新しく、『rundomInt関数』が登場しました!
これは、
『指定したInt(整数)の範囲の中から1つをランダムに選ぶ』
というものです。
randomInt(from: Int, to: Int)
『from: Int』には範囲の初めの数字を入力します。
『to: Int』には範囲の終わりの数字を入力します。
例えば、『randomInt(from: 3, to: 7)』なら
『3,4,5,6,7の中から1つ選ぶ』となります。
このステージでは、空の配列の中にランダムな数字を入れていくときに使います。
ステージ攻略「ランダムな地形」
ステージを攻略していきましょう!
クリア条件
今回のクリア条件は、
『配列を使ってステージにブロックを配置していく』ことです。
前回と似ていますが、今回は配列にランダムな数字を入れていきます。
順に確認していきましょう。
ステージ内のすべての座標を定数として宣言
後ですべての座標を参照することになるので、
ステージ内のすべての座標を宣言しておきます。
let allCoordinates = world.allPossibleCoordinates
高さの値を入れるための空の配列を宣言
前回とは違うところです。
var heights: [Int] = [ ]
この後のコードでこの配列に値を追加します。
空の配列にランダムな値を追加する
今回の肝の部分ですね。
for i in 1 … 20 {
heights.append(randomInt(from: 0, to: 12))
}
『heights配列』に0から12までのランダムな値を追加します。
forループになっているので、追加する処理が20回繰り返されます。
heights配列には20個の項目がある状態になります。
項目の数はわかりますが、それぞれの数字はランダムなので
どういったステージが完成するのかはコードを実行するまでわかりません。
また、同じコードを実行しても毎回違うステージが出来上がります。
項目の数を数える変数を宣言
範囲外エラーを防ぐため、
項目の数を数える変数を宣言します。
var index = 0
これは前回と同じですね。
すべての座標を参照するループ(①〜⑤)
はじめに宣言したすべての座標を参照しながら、
①〜⑤の処理を繰り返します。
①『index』変数の値を0にする
前回と同様です。
if index == heights.count {
index = 0
}
『もし、indexの値がheightsを数えた値と同じならindexを0にする』
『heights.count』はheights配列の項目の数を表します。
項目はランダムに追加された20個です。
そしてindexは変数ではじめは0ですが、
この後の⑤の処理をすると1ずつ増えていきます。
indexの数が20になったら、この①の処理で0に戻すというわけです。
そしてループは続きます。
②現在のheightsの値を示す変数を宣言
配列に追加されたランダムな数によって
処理を変えたいので、ループの中でどの数を使うのかがわかるように
変数を定義します。
var currentHeight = heights[index]
indexの値はこの後の⑤の処理で+1ずつ増えていきます。
それによってcurrentHeightも変化していくというわけです。
③currentHeightの値が0の時
③と④の処理は、currentHeightの値がいくつなのか
によって変わります。
ランダムな数字が入っているので、
コードを実行するまで何が起こるかはわかりません。
if currentHeight == 0 {
world.removeBlock(at:coordinate)
world.place(Water(), at: coordinate)
}
currentHeightが0のときには、
『その座標のブロックを取り除いて水にする』としました。
④currentHeightの値が0以外の時
0以外のときには3つの処理を行います。
しかしcurrentHeightの値や座標の値によって、
処理をするかどうかが変わります。
④-1:currentHeightの値の分だけブロックを積む
for i in 1…currentHeight {
world.place(Block(), at: coordinate)
}
currentHeightの値は0以外の時なので、この処理は必ず起こります。
今参照している項目の数字の分だけブロックを積み上げます。
④-2:currentHeightの値が10より大きい時、キャラクターを北向きに配置する
if currentHeight > 10 {
world.place(Character(), facing: north, at: coordinate)
}
ランダムな数字は『0から12まで』だったので、
この条件に合うのは『11,12』ですね。
11か12の時にキャラクターが北向きに配置されます。
④-3:列の値が3以上6未満の時、スイッチを配置する
} else if coordinate.column >= 3 && coordinate.column < 6 {
world.place(Switch(), at: coordinate)
}
座標の値を参照します。
⑤indexの値に+1をする
参照する配列の値を1つずつずらしていくために、
indexの値に+1をしていきます。
index += 1
前回と同じですね。
まとめ:ランダムな地形
ランダムな数字を取り扱いました。
じゃんけんとかくじ引きのアプリを作る際に
必要になりそうですね!
今回のポイントを振り返りましょう。
- randomInt(from: Int, to: Int)で指定した範囲内のランダムな数字を1つ取り出すことができる。
次回はDay90「違う方法で配列を作る」でお会いしましょう!それでは!!