2014-11-24 148 views
3

我正在做一個生活的遊戲,我做了這個方法來查找附近的鄰居遊戲生活:找鄰居

private int getNeighbours(LifeBoard board, int row, int col){ 
    if(board.get(row+1, col)){ 
     neighbours++; 
    } 
    if(board.get(row-1, col)){ 
     neighbours++; 
    } 
    if(board.get(row, col+1)){ 
     neighbours++; 
    } 
    if(board.get(row, col-1)){ 
     neighbours++; 
    } 
    if(board.get(row+1, col+1)){ 
     neighbours++; 
    } 
    if(board.get(row-1, col-1)){ 
     neighbours++; 
    } 
    if(board.get(row+1, col-1)){ 
     neighbours++; 
    } 
    if(board.get(row-1, col+1)){ 
     neighbours++; 
    } 

    return neighbours; 
} 

我覺得,如果它是可怕的編碼和它畏縮,所以我的問題是..有沒有辦法讓這個更好?現在,它「排序」的作品,但我想我是否可以用循環來代替。

謝謝。

+3

更好適合codereview.stackexchange.com – 2014-11-24 16:15:55

+0

@Jon Skeet有正確的答案。但是,如果你開始有一個大的領域,你原來的方式將更快地執行,因爲你基本上展開了循環,循環展開總是比循環更快。 – markbernard 2014-11-24 16:44:23

回答

5

那麼,你可以使用循環,只是明確排除的位置本身(即當x和y偏移均爲0):

private int getNeighbours(LifeBoard board, int row, int col) { 
    int neighbours = 0; 
    for (int xOffset = -1; xOffset < 2; xOffset++) { 
     for (int yOffset = -1; yOffset < 2; yOffset++) { 
      if ((xOffset != 0 || yOffset != 0) 
        && board.get(row + yOffset, col + xOffset)) { 
       neighbours++; 
      } 
     } 
    } 
    return neighbours; 
} 

這裏假設你的board.get(...)方法是好的,其值關閉的邊緣董事會。

爲偏移替代策略:

  • 如上,for (int xOffset = -1; xOffset < 2; xOffset++)
  • 使用一個包容上限:for (int xOffset = -1; xOffset <= 1; xOffset++)
  • 使用陣列別處定義:

    private static final int[] OFFSETS = { -1, 0, 1 }; 
    ... 
    for (int xOffset : OFFSETS) 
    
+1

我會用'OFFSETS = new int [] {-1,0,1}'和'for(int xOffset:OFFSETS){...}' – njzk2 2014-11-24 16:19:52

+0

@ njzk2:這樣做也可以。 – 2014-11-24 16:21:08

+0

@ njzk2:我已將該選項編輯爲答案 – 2014-11-24 16:28:31