2015-09-25 61 views
0

我寫了一個快速的康威實現的JS。爲蜂窩自動機計數鄰居單元

爲了計算鄰近給定單元的「活」單元的數量,我手動檢查了8個單元中的每一個。

function getNeighbourCount(x, y){ 
    var intCount = 0; 
    intCount = (getCell(x-1, y-1)? intCount+1 : intCount); //x-1, y-1 
    intCount = (getCell(x, y-1)? intCount+1 : intCount);//x, y-1 
    intCount = (getCell(x + 1, y-1)? intCount+1 : intCount);//x + 1, y-1 
    intCount = (getCell(x-1, y)? intCount+1 : intCount);//x-1, y 
    intCount = (getCell(x+1, y)? intCount+1 : intCount);//x+1, y 
    intCount = (getCell(x-1, y+1)? intCount+1 : intCount);//x-1, y+1 
    intCount = (getCell(x, y+1)? intCount+1 : intCount);//x, y+1 
    intCount = (getCell(x+1, y+1)? intCount+1 : intCount);//x-1, y+1 

    return intCount; 
} 

它的作品,但似乎笨重。是否還有另一種更優雅的技術來實現同樣的目標?優選地適用於不同內核大小的技術。

下面是具有工作示例的小提琴: http://jsfiddle.net/3vpz14v7/

注:

  • 遊戲的狀態在2D布爾陣列被保持(50 * 50在此實例中)
  • getCell (x,y)返回包含coords的單元格的值。

回答

1

您可以在內核存儲更緊湊和視覺格式一樣,比方說,

var kernel = [ 
    "111", 
    "101", 
    "111"] 

你會再編寫一個函數來解碼成調用getCell,使您的內核易於讀取和修改(「1」意思是「如果該位置的單元格存活,則加1」)。

0

將其作爲一個循環,然後將循環打包成求和語句。使用上面的內核掩碼。將單元格狀態存儲爲True = alive,False = dead。然後你可以在內核掩碼和選定的單元上運行一個快速循環來生成鄰居計數。下面的代碼顯示了一個單元格矩陣4x4的例子(但只做中間單元格,以免跑出邊緣)。

cell = [[False, False, False, True], 
     [False, True, True, False], 
     [False, False, True, False], 
     [True, True, False, True]] 

count_mask = [[True, True, True], 
       [True, False, True], 
       [True, True, True]] 

cellx = len(cell) 
celly = len(cell[0]) 
kernelx = len(count_mask) 
kernely = len(count_mask[0]) 

for x in range(1, cellx-1): 
    for y in range(1, celly-1): 
     live_count = sum([1 if cell[x+row-1][y+col-1] and count_mask[row][col] \ 
      else 0 for row in range(kernelx) for col in range(kernely)]) 

     print live_count 

得到的輸出

2 
3 
5 
4 

當然,你可以在一個新的矩陣,如果你想抓住這一點。
您也可以通過將該求和迴路放入減少調用中來使Pythonic更加;我以這種方式離開了它,因爲它對大多數程序員來說更容易訪問。

這足以讓你前進嗎?