2013-05-30 503 views
2

我參加了一門編程課程,我正在重溫舊計劃,但我並不完全正確。這是一個生命遊戲程序,我有一個關於代碼清理的問題。檢查布爾數組中是否存在元素

我需要確保在檢查其鄰居的布爾值是true還是false之前,數組元素是在邊界內。我有一個聲明來檢查firstGen[0][0]的左上角(上一行,左一列)是否在界限內。有沒有更容易或更優雅的方法來檢查元素是否處於邊界內或將元素檢查限制爲給定數組的邊界,而不使用每個if語句的四個&&條件?

請注意,我只更改了迄今爲止的第一個if語句,因此其他地方可能會有錯誤。我也排除了其他鄰居的邊界檢查。

public static boolean[][] generation(boolean[][] firstGen) 
    { 
    int length = firstGen.length; 
    boolean[][] newGen = new boolean[length][length]; 

    for (int j = 0; j < firstGen[0].length; j++) 
     { for (int i = 1; i < firstGen.length; i++) 
      { 
       int count = 0; 
       if ((i-1 >= 0) && (i-1 < length) && (j-1 >= 0) && (j-1 < length)) //top-left element exists 
        { if (newGen[i-1][j-1] == true) count++; } //increment `count` if top-left element is true 

       if ((newGen[i][j] == false) && (count == 3)) newGen[i][j] = true; 
       else if ((newGen[i][j] == true) && (count == 1)) newGen[i][j] = false; 
       else if ((newGen[i][j] == true) && (count > 3)) newGen[i][j] = false; 
       else break; 
      } 
     } 
     return newGen; 
     } 

回答

3

如果ij在邊界,那麼你肯定知道i - 1 < lengthj - 1 < length都是真實的。

另外:

  • i - 1 >= 0可以寫i > 0
  • if (condition == true)可以改寫if (cond)

所以,你可以替換:

if ((i-1 >= 0) && (i-1 < length) && (j-1 >= 0) && (j-1 < length)) //top-left element exists 
    { if (newGen[i-1][j-1] == true) count++; } //increment `count` if top-left element is true 

由:

//increment `count` if top-left element is true 
if (i > 0 && j > 0 && newGen[i-1][j-1]) count++; 
+0

+1突然就這麼簡單了:-)另外我還會推薦他下一步需要的東西:一種優雅的方式來遍歷所有鄰居而不需要重複代碼。 –

+0

@assylias有時Java解決方案非常簡單。他們是那種讓你只想把你的頭撞到牆上,讓事情變得不必要的複雜。我還要感謝你提醒關於真布爾條件和真布爾條件。再一次,這樣的事情。 – rice2007

+0

@Marko我不確定我是否已經解決了這個問題,但我還有一個精神方面的解決方案來處理下一步。我想嵌套'for'循環。 – rice2007

1

這是我能想到的最好的辦法,以檢查其出界,但在一般的替代方法,並且一個,我認爲給喜歡的生活更精彩結局的遊戲節目,是增加週期性邊界。基本上這意味着,如果你走出一個邊緣,你最終會在另一邊(如pac-man)。這聽起來很複雜,但實際上它只需要%函數,它返回給定兩個數字之間的餘數。

所以:

27 % 5 = 2; 

所以添加週期性boundries你會更新x和y位置是這樣的:

x = (x + xStep + horizontalSize) % horizontalSize; 
y = (y + yStep + verticalSize) % verticalSize; 

凡特步和yStep是+1或-1取決於什麼方向你想去。 (這與for循環很好地匹配)大小的添加是爲了確保當你靠近邊界時,你會低於零。

那麼你不必擔心雜亂的邊界條件,一切都會重疊。無需檢查每個邊界。我希望這是有道理的。如果沒有請請澄清。我更多地將它用於隨機漫步程序,但這個想法是一樣的。