コウです、よろしくお願いします!
「ゼロからプログラミングを始める」人に役立つ情報を発信しています。
今回はDay84「配列に追加する」です。どうぞ!!
解答例
まずは解答例を確認しましょう。
コードは次のようになります。
解答例を動画で確認する
上記のコードを実行した結果がこちらになります。
ステージ攻略「配列に追加する」
ステージを攻略していきましょう!
クリア条件
今回のクリア条件は、
『5より大きい列、4より小さい行のそれぞれに6個ずつブロックを置く』ことです。
少しわかりづらいですが、座標を列と行に分けて考えます。
( , )の左側の数字が5より大きければブロックを置く。
( , )の右側の数字が4より小さければブロックを置く。
それぞれのもう1つの数字はなんでも大丈夫です。
例えば以下のようになります。
(6,5)なら列が条件を満たすのでブロックを置きます。
(0,2)なら行が条件を満たすのでブロックを置きます。
(4,6)は両方とも条件に当てはまらないので、ブロックを置きません。
(0,0)からひとつずつ確認していく方法もありますが、
今回は8×8マスの合計64マスです。
そのすべてを確認するのは大変なので、
コンピュータに任せようということですね。
確認作業は規則性があるのでループが使えます。
では、コードを詳しく見ていきましょう。
すべての座標を宣言
これは元から書かれていて、
編集もできませんが一応解説しておきます。
let allCoodinates = world.allPossibleCoordinates
ステージ内に存在するすべてのマスの座標がこれで宣言されます。
肝心なのはステージ内に存在することです。
8×8マスのみですね。
こうしないと、座標を無限に宣言することになってしまいます。
空の配列を宣言
ループを作る時に参照する座標を入れるための箱を作ってあげます。
var blockSet: [Coordinate] = [ ]
この段階では箱の中身は空っぽです。
後からここにどんどん座標を入れていきます。
メリットはappend()が使えることですね。
これもこの後に出てきますが、
append()は配列の一番最後に項目を追加していきます。
その都度項目の場所を指定しなくていいのは使いやすいです。
ステージ上のすべての座標を確認する
for coordinate in allCoordinates { }
初めに宣言したこのステージにあるすべての座標を
確認していくためのループです。
(0,0)から始まり、(0,1)(0,2)…(7,7)までの64個を確認していきます。
配列に項目を追加
先ほど作った箱の中に、項目(座標)をどんどん入れていきます。
if coordinate.column > 5 || coordinate.row < 4 {
blockSet.append(coordinate)
}
『もし列の値が5より小さかったらもしくは行の値が4より小さかったら』
という条件のもと、64個の座標をチェックし、
用意してあった空の配列『blockSet』に入れていきます。
もしくはなのでどちらかの条件に該当した場合に項目は追加されます。
もちろん両方とも該当した場合にも追加されます。
append()を使っているのでインデックスは気にすることなく、
配列の一番最後にどんどん追加されます。
配列を参照しながらループ
先ほどは配列に項目を追加するためのループでした。
次はその配列(blockSet)を使って、
ブロックを配置するためのループを作ります。
for coodinate2 in blockSet { }
ループ内での名前はさっきと似ていますが、
区別するために最後に2をつけました。
あくまでこのループ内で使用するだけなので、
同じ名前でも問題はありません。
参照する配列は『blockSet』です。
繰り返したい処理
ひとつのマスに6個のブロックを配置します。
for i in 1 … 6 {
world.place(Block(), at: coodinate2)
}
forループを使って6回繰り返せるようにしました。
ブロックを置く座標は、
1つ前のループで空の配列に追加していった座標です。
あとはコードを実行すれば条件に合う座標に
どんどんブロックが置かれていきステージクリアです!
まとめ:配列に追加する
『空の配列に項目(座標)を追加する』
『該当する座標にブロックを設置する』
の2段階で処理を行う必要がありました。
よって、配列を参照して行うループが2回ありましたね。
今回のポイントを振り返りましょう。
- すべての座標を配列にセットすることで、その中の条件に合う座標をチェックして取り出すことができる。
次回はDay85「島を作る」でお会いしましょう!それでは!!