2013-05-30 151 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循环很好地匹配)大小的添加是为了确保当你靠近边界时,你会低于零。

那么你不必担心杂乱的边界条件,一切都会重叠。无需检查每个边界。我希望这是有道理的。如果没有请请澄清。我更多地将它用于随机漫步程序,但这个想法是一样的。