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;
      }
4

2 回答 2

3

如果ij在界限内,那么你肯定知道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++;
于 2013-05-30T14:45:05.550 回答
2

这是我能想到的检查它是否越界的最好方法,但一般来说,另一种方法,我认为给像生命游戏这样的程序更多令人兴奋的结果的方法是添加周期性边界。基本上这意味着如果你离开一个边缘,你最终会在另一边(就像在吃豆人中一样)。这听起来很复杂,但实际上只需要 % 函数,它返回给定两个数字之间除法的余数。

所以:

27 % 5 = 2;

因此,要添加周期性边界,您将更新 x 和 y 位置,如下所示:

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

其中 xStep 和 yStep 是 +1 或 -1,具体取决于您要走的方向。(这适用于 for 循环)大小的添加是为了确保在接近边界时低于零。

然后你就不必担心混乱的边界条件,一切都只是重叠。无需检查每个边界。我希望这是有道理的。如果不是,请要求澄清。我已经将它更多地用于随机游走程序,但想法是一样的。

于 2013-05-30T14:56:56.340 回答