[英]Checking if Element Exists in Boolean Array
我參加了編程班,並且正在重新學習不太正確的舊程序。 這是一個“人生游戲”程序,我對代碼清理有疑問。
我需要先檢查數組元素的邊界,然后再檢查其鄰居的布爾值是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;
}
如果i
和j
在范圍之內,則可以確定i - 1 < length
和j - 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++;
這是我可以想到的最好的方法,即檢查它是否超出范圍,但通常來說,另一種方法(我認為賦予《人生游戲》等程序更激動人心的結果)是添加周期性邊界。 基本上,這意味着如果您走出一條邊緣,則最終會到達另一側(就像在pac-man中一樣)。 聽起來很復雜,但實際上只需要%函數,它返回給定兩個數字之間的余數。
所以:
27 % 5 = 2;
因此,要添加周期性邊界,您將像這樣更新x和y位置:
x = (x + xStep + horizontalSize) % horizontalSize;
y = (y + yStep + verticalSize) % verticalSize;
其中xStep和yStep為+1或-1,具體取決於您要走的方向。 (這在for循環中很好用)大小的增加是為了確保您在接近邊界時可以降至零以下。
這樣一來,您就不必擔心混亂的邊界狀況,一切都會重疊。 無需檢查每個邊界。 我希望這是有道理的。 如果沒有,請要求澄清。 我將其更多地用於隨機助步器程序,但想法是相同的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.