2014-04-01 79 views
2

我試圖複製康威的生命遊戲,儘管我的代碼似乎是猶太潔食,但它似乎並不像它應該那樣行事。爲什麼我的康威的生命遊戲表現怪怪?

這是它的基本肉:

if (pressingSpace) { 
    running = true; 
    } else { 
    running = false; 
    }; 

    if (running) { 
    for (var i=0; i<tiles.length; i++) { 
     var tile = tiles[i]; 
     if (tile.alive && (tile.neighborsAlive() < 2 || tile.neighborsAlive() > 3)) { 
     tile.die(); 
     }; 
     if (!tile.alive && tile.neighborsAlive() == 3) { 
     tile.comeToLife(); 
     }; 
    }; 
    }; 

    for (var i=0; i<tiles.length; i++) { 
    var key = tiles[i]; 
    if (!key.alive && mouseDown && key.sprite.contains([cursorX,cursorY]) && cursorX != null) { 
     key.comeToLife(); 
    } 
    }; 

所有播放功能都經過全面測試,似乎按預期方式工作。但是當它運行時,「活着的」方塊似乎比他們應該更容易超出屏幕。特別是當一個柱子製成三個瓷磚高度時,它在下一個框架上消失,當它按照規則在同一時間在兩側產生兩個「活動」瓷磚時。

我懷疑這與操作順序有關。我是否需要爲狀態變化「標記」適當的瓦片,而不是現場更改它們?我知道Conway有很多實現,但我正在努力開發自己的產品。這就是說,任何在正確的方向推動將不勝感激。謝謝!

你可以看到它在這裏的行動:http://www.eggborne.com/tiles

回答

2

據我所看到的,這是因爲你改變tilemap的同時遍歷它。

E.g.我假設.comeToLife()方法更改.alive字段爲true,並且如果.neighborsAlive()返回非緩存值,但計算周圍的瓷磚,則實際上是在迭代時更改您的playfield,並且新更改的單元格毀壞整個圖片。

最簡單的解決方案將是創建「舊」和「新」瓷磚地圖,並重復「舊」瓷磚,同時僅對「新」進行更改。緩存'neighborsAlive'本質上是以不同的方式創建兩個數組 - 這樣你就可以創建一個瓦片地圖,每個瓦片都擁有這個時候有多少鄰居活着的值 - 而且你必須在所有事情之前確定這個值其他變化。如果你不這樣做,你將會遇到和現在一樣的問題。

對於你的問題的論證,使每瓦變你的操場上傳更新 - 你會看到你的問題的動畫:)

希望這有助於你的問題。

+0

非常感謝!製作緩存鄰居/生命狀態數據的功能是解決方案! – user2493615

+0

不客氣。順便說一句,使用單一陣列(沒有舊/新的狀態作弊)實施生命遊戲是完全有可能的,但要讓它正確有點更具挑戰性。如果你這樣做是爲了自我教育,你也可能會覺得這很有趣。 – toriningen