i = x-1; i<=1; i++ について
質問では
for分の条件式let j= y-1; j<=y+1; j++
がわからないとありますが、他の回答に対するコメントを読むとi = x-1; i<=1; i++
の方のようなのでこちらについて。
参考にされている本にこれが書かれているのであれば、誤植です。正しくは
js
1for (let i = x - 1; i <= x + 1; i++) {
です。
cell[j] && cell[j][i] について
3x3 のマインスイーパーを考えてみます。
cell[0][0], cell[1][0], cell[2][0]
cell[0][1], cell[1][1], cell[2][1]
cell[0][2], cell[1][2], cell[2][2]
そして cell[0][0]
(左上のセル)の周囲の爆弾を数えるためにcount
関数を呼び出してみます。
x=0
, y=0
ですから実際に走るコードとしては以下のようになります。
js
1let b = 0;
2for (let j = -1; j <= 1; j++) {
3 for (let i = -1; i <= 1; i++) {
4 if (cell[j] && cell[j][i]) {
5 if (cell[j][i].bomb) b++;
6 }
7 }
8}
9return b;
ここで if (cell[j] && cell[j][i])
がない場合を考えます。つまり
js
1let b = 0;
2for (let j = -1; j <= 1; j++) {
3 for (let i = -1; i <= 1; i++) {
4 if (cell[j][i].bomb) b++;
5 }
6}
7return b;
だったとして、これが実行される場合を考えてみます。このとき if (cell[j][i].bomb)
文の中身は実行順に
j = -1
, i = -1
=> cell[-1][-1].bomb
j = -1
, i = 0
=> cell[-1][0].bomb
j = -1
, i = 1
=> cell[-1][1].bomb
j = 0
, i = -1
=> cell[0][-1].bomb
j = 0
, i = 0
=> cell[0][0].bomb
j = 0
, i = 1
=> cell[0][1].bomb
j = 1
, i = -1
=> cell[1][-1].bomb
j = 1
, i = 0
=> cell[1][0].bomb
j = 1
, i = 1
=> cell[1][1].bomb
となります。一番上のcell[-1][-1].bomb
は、そもそもcell[-1]
がundefined
であるためにcell[-1][-1]
を参照することができず、
Cannot read property '-1' of undefined`
のようなエラーが発生します。上から4番目のcell[0][-1].bomb
については、cell[0]
自体はアクセス可能ですが、cell[0][-1]
はundefined
なため、cell[0][-1].bomb
について
Cannot read property 'bomb' of undefined
のようなエラーが発生します。
こうしたアクセスできないプロパティへの参照が起こらないようするために、undefined
となっていないかどうかを先に確かめているのがif (cell[j] && cell[j][i])
の条件式です。上記リストのうち、1,2,3についてはif
文の中の&&
の前の時点でfalse
だと判定されてif
文の中は実行されません(&&
についてはMDN等を参照ください)。つまり上記のエラーが発生する前にループの次の処理にうつります。また4,7についてはif
文の中の&&
の後ろでfalse
と判定され、やはりif
文の中は実行されません。最終的には5, 6, 8, 9、つまり↓で●のついているところの爆弾の数がカウントされ、エラーで止まることなく欲しい情報が得られるようになっています。
●cell[0][0], ●cell[1][0], cell[2][0]
●cell[0][1], ●cell[1][1], cell[2][1]
cell[0][2], cell[1][2], cell[2][2]
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/13 10:39