0

我創建的算法(實施康威的人生遊戲規則)與康威的GoL不匹配。我已經嘗試過所有我能做的事情,但它只是不匹配。另外,如果有人知道如何將它變成一個無限的平面,或者可能包裝自己,我會有興趣看到它用我的代碼實現!康威的人生遊戲 - 不正確的算法?

運行的jsfiddle:http://jsfiddle.net/jGkKF/2/

相關代碼:

檢查活細胞周圍的細胞:(第28行)

var x2 = x+1, x3 = x-1, y2 = y+1, y3 = y-1;  // Math 
if(tC[x][y3] !== undefined && tC[x][y3]) ne++;   // T 
if(tC[x][y2] !== undefined && tC[x][y2]) ne++;   // TR 
if(tC[x2] !== undefined) { 
    if(tC[x2][y]) ne++;         // R 
    if(tC[x2][y3] !== undefined && tC[x2][y3]) ne++; // BR 
    if(tC[x2][y2] !== undefined && tC[x2][y2]) ne++; // B 
} 
if(tC[x3] !== undefined) { 
    if(tC[x3][y]) ne++;         // BL 
    if(tC[x3][y3] !== undefined && tC[x3][y3]) ne++; // L 
    if(tC[x3][y2] !== undefined && tC[x3][y2]) ne++; // TL 
} 

而且算法:(50號線)

if(cell && (ne < 2 || ne > 3)) cell = 0; // Over- or under- populated? 
else if(!cell && ne == 3) cell = 1;  // Give life? 

回答

0

聲明

tC = cells; 

不生成單元格數組的副本。它只是創建第二個引用到完全相同的數組。因此,稍後當您這樣做時:

cells[x][y] = cell; // Setting the cell 

它修改循環所查看的同一個數組。

此外,在你的循環檢查鄰居,你已經編碼了一個精確的比較undefined。但是,其餘代碼似乎用0來填充空單元格。

+0

我的意思是說引用。它檢查它們是否存在,由於它是一個有限的正方形,並且如果它仍然存在。如果兩者都是真的,那就算它。 – Alca

+0

那麼,如果您在進行世代傳遞時更新單元矩陣,它將無法工作,因爲您將修改單元格,以便檢查「世界」網格的下一行。您可能希望通過在兩個*網格之間來回切換來完成工作。 – Pointy

+0

啊。那麼這不是最佳的,但我會做到這一點。 – Alca

1

幾個項目:

  1. 遊戲規則說要檢查所有周圍的8個方塊。根據你的代碼,你似乎只檢查其中的6個。編輯:OP正在檢查所有8.我仍然建議第2點,它允許一致處理每個正在檢查的單元格。
  2. 最簡單的處理方法是設置一個需要檢查的單元格列表,然後在該列表上運行一個循環來進行計數。
  3. 要設置包裝列表,請在設置單元列表時設置邊界檢查代碼,例如
    • 如果cellIndex < 0,那麼cellIndex == maxIndex
    • 如果cellIndex> = maxIndex然後cellIndex = 0
  4. 你需要警惕的 「掃描線」 的效果,如果你更新時可能出現的在試圖計算「下一代」時代表「這一代」的值。這兩個需要獨立存儲。請注意,如果您使用的是整數數組,則這可能意味着將此「代」存儲爲0和1,並且可以通過添加8來指示「下一代」活動單元格。在處理當前代後,請更改所有內容> = 8到1,並且任何單元格< 8變爲0.
+0

它被設置爲檢查全部8個是否存在以及是否存在。如果它存在並且活着,那它就算它。 – Alca

+0

我看着你的小提琴 - 正如我在第四點中所說的那樣,@Pointy也指出,你不會將「這一代」從「下一代」中分離出來,所以結果是關閉的。見http://stackoverflow.com/questions/509579/how-does-variable-assignment-work-in-javascript和http://stackoverflow.com/questions/122102/most-efficient-way-to-clone-an對象/ 5344074#5344074。此外,如果您添加一個單步按鈕,您可以更好地查看邏輯。 –

+0

'tC = cells.slice(0);'似乎存儲過去的一代就好了。這仍然不允許我匹配任何康威的結果。當我不應該時,我正在獲得「爆炸性增長」。除了一些基本靜態形狀(如「塊」)外,沒有任何圖案可以工作 – Alca