質問: SIDE_CELLS-1){ //左右が自分の隣の列でなくればループをパス continue; } ```
回答: ※※※※※※※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※ ※※※※※※※ 上記のような5×5のセルがあって、 内部的に1次元の配列でセルが保持されている。 隣接するセルを調べる時に、 ※※※※※※※ ※ ✕ ※ ◎✕ ※ ✕ ※ ※ ※ ※ ※※※※※※※ ◎が現在調べているセル(`index`)の時、 ✕の位置の隣接セル(`cellIndex`)を調べようとすると、 フィールドをはみ出ているので、それをチェックして除外する必要がある。 ところで、セルは2次元の配列ではなくて1次元の配列なので、 ※※※※※※※ ※ 〇 ※ ◎△ ※ ✕ ※ ※ ※ ※ ※※※※※※※ は、 ※※※※※※※ ※ ※ ※〇 ◎※ ※△ ※ ※✕ ※ ※ ※ ※※※※※※※ の位置になる。 (◎のインデックスは9,上図右隣△は+1してインデックス10の位置、インデックス10の位置は下図△の位置になる) なので、 `cellIndex % SIDE_CELLS == 0` は 1次元のでセル位置を横幅で割った余りが0ということは`cellIndex`が一番左の列にあるということで `index < cellIndex` は、◎のセルに対して△と✕について該当するということになります。 つまり調べようとする右側(と右下)の隣接セルがはみ出ていないか?を調べている。 (〇に関してはおそらく続くコードで調べているか斜めの位置はそもそも無視している?バグかも) `index > cellIndex && cellIndex % SIDE_CELLS == SIDE_CELLS-1` の部分では左側のはみ出し つまり ※※※※※※※ ※ ※ ✕ ※ △◎ ※ 〇 ※ ※ ※ ※※※※※※※ を調べていてそれは1次元配列上以下の位置になっていて ※※※※※※※ ※ ✕※ ※ △※ ※◎ 〇※ ※ ※ ※ ※ ※※※※※※※ `index > cellIndex` : 現在位置が1次元配列のインデックスで調べようとするセル位置より大きい `&&` : かつ `cellIndex % SIDE_CELLS == SIDE_CELLS-1` : 右端のセルである。 ということで △と✕が該当します。 ところで、 なぜ剰余で列位置が調べられるかというと、 前回の質問の逆算をしていることになります。 2次元の配列の添字と1次元の配列の添字には **2次の配列[行の添字][列の添字] は 1次の配列[行の添字×列数+列の添字]** の関係があるのでした。 つまり一次元配列の添字を列数で割った余りは列の添字になります。 (行の添字×列数+列の添字)÷ 列数 = 行の添字...余り 列の添字 `SIDE_CELL-1` は**列数-1**ということで、配列が0始まりの時最後の列の添字(つまり5列の場合列の添字は0,1,2,3,4で4のこと)です。 つまりフィールド上の右端の列の添字を意味します。