2017-07-22 18 views
0

私はこの半分の週のように100%再現可能ではない奇妙なバグを得て、まだそれを理解することができません。うまくいけば、誰かが私に指示を与えることができます。JavaScriptのdouble forループで奇妙な2回実行

私はこのテトリスゲームを構築しています。実際に2次元アレイであるこの井戸のグリッドでは、テトロミノが一番下に落ちると(それは別のテロミノまたは井戸の境界に当たる)、井戸の格子に4つの正方形のブロックを含むグリッドを転送します。通常、それはうまく動作しますが、ゲームの後で、形状が正しく見えません。

そして、ここでコメントした関数である:ここでは

function transferTetroGridIntoWell({ grid, tetroGrid, tetroPosition, color }) { 
    let newGrid = [...grid] 
    let relativeX, relativeY 
    // the tetroGrid could be a 2d array like: 
    // [1,1,0] 
    // [1,1,0], in which 1 indicates a block, and 0 is none 

    for (let row = 0; row < tetroGrid.length; row++) { 
    for (let col = 0; col < tetroGrid[0].length; col++) { 
     if (!tetroGrid[row][col]) continue 
     // the index of the array relative to the well grid 
     relativeX = tetroPosition.x + col 
     relativeY = tetroPosition.y + row 

     // assign the color to the according square block in the well grid 
     newGrid[relativeY][relativeX] = color 
    } 
    } 
    return newGrid 
} 

は問題です:

テトロミノのそれぞれはわずか4正方形のブロックが含まれているため、newGrid[relativeY][relativeX] = colorはわずか4回実行する必要があり、そのデバッガでの表示から真です。しかし、時には、この割り当てが再び呼び出される前に2回実行されるように見えることもあります。実行前

enter image description here

実行後の1回目:ここで

がデバッグスクリーンショットである(そして奇妙なことが起こるところこれは、に挿入された2つの#f6d42bがあります井戸だけでなく、グリッド8でもグリッド7 enter image description here

実行後の2回目:(まだ二重の実行) enter image description here

実行後の3回目: enter image description here

実行後の4回目: enter image description here

4回実行の6つの正方形ブロックが挿入されました。どのように起こることができますか?

完全なソースコード:本当にこの長い記事を読み終え誰のために感謝https://github.com/thomasyimgit/Tetris

!!

答えて

0

データを突然変異させるという話が出てきます。

スプレッド演算子を使用して配列をコピーするのは、浅いコピーのみです。したがって、2つの行がグリッドの同じ行を参照している可能性があります。そして割り当てを行うと、2つの行が同時に更新されます。これは二重実行のようです。

私はこれにtransferTetroGridIntoWell関数の最初の行を変更し、それが問題が修正されています。

let newGrid = grid.map(r => r.map(c => c))

変異は悪です。

関連する問題