

下記のコードで上下左右のループをパスする部分のコードのイメージができません  
とくに左右の部分での、cellIndex % SIDE_CELLS == SIDE_CELLS-1 の剰余の使い方など  
がイメージできないです、SIDE_CELL-1というのはいったいどういうことですか、教えてくださいm(__)m

[code]

    function update(cellInfos, tempCellInfos){
      //sliceで先頭からおしりまで切り出してコピーすると結果的に全部コピーになる
      tempCellInfos = cellInfos.slice();
      for (var index = 0; index < tempCellInfos.length; index++){
        //今から各細胞の自分のまわりの生死をチェックするので、カウンターを用意
        var liveCellCount = 0;
        //このコードでは前の行、隣の行、前の列、隣の列を二つのループで表現します
        for(var rowPointer = -1; rowPointer < 2; rowPointer++){
          for(var colPointer = -1; colPointer < 2; colPointer++){
            //もし自分ならばカウントしないので飛ばします。
            if(rowPointer == 0 && colPointer == 0){
              //コンティニューでこの回の繰り返しをパスすることができます
              continue;
            }
            //チェックするセルの番号を算出します
            var cellIndex = index + rowPointer * SIDE_CELLS + colPointer;
            if(cellIndex < 0 ||  cellIndex >= tempCellInfos.length){
              //上下の領域からはみ出していたらループをパス
              continue;
            }
            if(index < cellIndex && cellIndex % SIDE_CELLS == 0 || index > cellIndex && cellIndex % SIDE_CELLS == SIDE_CELLS-1){
              //左右が自分の隣の列でなくればループをパス
              continue;
    }
    
[/code]


CC BY-SA 3.0
2016-09-19T19:10:22.983
28987
2016-09-20T00:55:28.637
2016-09-19T19:12:38.470
5044
18815
question
javascript
配列からはみだしていないかの確認方法がわからないです


※※※※※※※  
※ ※  
※ ※  
※ ※  
※ ※  
※ ※  
※※※※※※※  
上記のような５×５のセルがあって、  
内部的に１次元の配列でセルが保持されている。  
隣接するセルを調べる時に、  
※※※※※※※  
※ ✕  
※ ◎✕  
※ ✕  
※ ※  
※ ※  
※※※※※※※  
◎が現在調べているセル(`index`)の時、  
✕の位置の隣接セル(`cellIndex`)を調べようとすると、  
フィールドをはみ出ているので、それをチェックして除外する必要がある。  
ところで、セルは２次元の配列ではなくて１次元の配列なので、  
※※※※※※※  
※ 〇  
※ ◎△  
※ ✕  
※ ※  
※ ※  
※※※※※※※  
は、  
※※※※※※※  
※ ※  
※〇 ◎※  
※△ ※  
※✕ ※  
※ ※  
※※※※※※※  
の位置になる。  
（◎のインデックスは９，上図右隣△は＋１してインデックス１０の位置、インデックス１０の位置は下図△の位置になる）  
なので、  
`cellIndex % SIDE_CELLS == 0`  
は  
１次元のでセル位置を横幅で割った余りが０ということは`cellIndex`が一番左の列にあるということで  
`index < cellIndex`  
は、◎のセルに対して△と✕について該当するということになります。  
つまり調べようとする右側（と右下）の隣接セルがはみ出ていないか？を調べている。  
（〇に関してはおそらく続くコードで調べているか斜めの位置はそもそも無視している？バグかも）

`index > cellIndex && cellIndex % SIDE_CELLS == SIDE_CELLS-1`  
の部分では左側のはみ出し  
つまり  
※※※※※※※  
※ ※  
✕ ※  
△◎ ※  
〇 ※  
※ ※  
※※※※※※※  
を調べていてそれは１次元配列上以下の位置になっていて  
※※※※※※※  
※ ✕※  
※ △※  
※◎ 〇※  
※ ※  
※ ※  
※※※※※※※  
`index > cellIndex` : 現在位置が１次元配列のインデックスで調べようとするセル位置より大きい  
`&&` : かつ  
`cellIndex % SIDE_CELLS == SIDE_CELLS-1` : 右端のセルである。  
ということで  
△と✕が該当します。

ところで、  
なぜ剰余で列位置が調べられるかというと、  
前回の[質問](https://ja.stackoverflow.com/questions/28935/%E4%BA%8C%E6%AC%A1%E5%85%83%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E4%B8%80%E6%AC%A1%E5%85%83%E9%85%8D%E5%88%97%E3%81%A7%E6%89%B1%E3%81%86%E9%9A%9B%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%87%E3%83%83%E3%82%AF%E3%82%B9%E3%81%AE%E8%A8%88%E7%AE%97%E6%96%B9%E6%B3%95)の逆算をしていることになります。  
２次元の配列の添字と１次元の配列の添字には  
**２次の配列[行の添字][列の添字] は １次の配列[行の添字×列数+列の添字]**  
の関係があるのでした。  
つまり一次元配列の添字を列数で割った余りは列の添字になります。  
（行の添字×列数+列の添字）÷ 列数 ＝ 行の添字…余り 列の添字

`SIDE_CELL-1` は **列数－１**
ということで、配列が０始まりの時最後の列の添字（つまり５列の場合列の添字は０，１，２，３，４で４のこと）です。  
つまりフィールド上の右端の列の添字を意味します。


CC BY-SA 3.0
2016-09-19T22:08:08.767
28988
2016-09-20T00:55:28.637
2017-04-13T12:52:38.920
-1
5044
28987
answer