在Conways Life Of Life中以2D数组计算8个可能邻居

问题描述

我必须计算每个单元格有多少个“存活”(在这种情况下为char:'O')。每个小区有8个邻居。 (这是来自康威的《人生游戏》)

“您可能会注意到,每个像元有八个邻居。我们认为宇宙是周期性的:边界像元也有八个邻居。例如:Neighbours from a "normal" cell

如果单元格是右边界,则其右(东)邻居是同一行中最左边的单元格。 如果单元格是底部边框,则其底部(南部)邻居是同一列中的最顶部单元格。 角单元使用两种解决方案。“ When a cell is border and when a cell is a top corner

这些链接是在出现“异常”情况下如何检查单元格的可视化视图。

我在互联网上找到了这个

`for (int x = -1; x <= 1; x += 1) {
                    for (int y = -1; y <= 1; y += 1) {
                        int r = i + y;
                        int c = j + x;
                        if (r >= 0 && r < n && c >= 0 && c < n && !(y == 0 && x == 0) && currentUniverse[i][j] == 'O') {
                            neighbours++;
                        }`

但是那似乎没有用... 我无法整理整齐的代码,而大多数代码都是聪明/方便/简短的代码,无法检查某个位置(例如currentUniverse[i][j])上一个单元有多少个活着的邻居...

有人建议,技巧或其他帮助吗?

解决方法

试一试。我使用n作为数组的大小(假定为正方形)。

int n = 4;
    System.out.println();
    for (int i = 0; i<n; i++) {
        for (int j = 0; j<n; j++) {
            int neighbours = 0;
                for (int x = -1; x <= 1; x += 1) {
                    for (int y = -1; y <= 1; y += 1) {
                        if (!(y == 0 && x == 0)) {
                            int r = i + y;
                            int c = j + x;
                            //normalize
                            if (r<0) r = n - 1;
                            else if (r == n) r = 0;
                            
                            if (c<0) c = n - 1;
                            else if (c == n) c = 0;
                            if (currentUniverse[r][c] == 0)
                                neighbours++;
                        }
                    }
                }
          System.out.print("\t"+neighbours);
        }
     System.out.println();
    }