【问题标题】:There are no updates among different iterations of the code (Conway's Game of Life)代码的不同迭代之间没有更新(康威的生命游戏)
【发布时间】:2019-04-21 22:09:08
【问题描述】:

这个程序正在尝试重现康威的生命游戏。

此代码尝试应用的规则:

  • 有 3 个邻居的空牢房复活了
  • 具有 3 个邻居的活细胞死亡
  • 所有出生/死亡同时发生

问题是我的代码在不同的迭代中输出没有变化,即使显然应该有。

对于更新单元格部分中使用的某些逻辑的任何帮助或想法将不胜感激。

我尝试打印出不同的变量和填充的单元格,但一切(在这方面)似乎都正常工作。

为没有更深入而道歉,老实说,我不确定代码的错误是什么。提前感谢您的帮助。

import java.util.*;
import java.io.*;

public class Game_Of_Life {

    public static void main(String[] args) throws IOException {

        final int runs = 5;
        int organisms;
        String[][] real = new String[20][20];
        String[][] test = new String[20][20];
        Scanner reader = new Scanner(new File("life100.txt"));

        for(int i = 0; i < real.length; i++) {
            for(int g = 0; g < real.length; g++) {
                real[i][g] = test[i][g] = " ";
            }
        }

        while(reader.hasNext()) {
            real[reader.nextInt()-1][reader.nextInt()-1] = "*";
            test[reader.nextInt()-1][reader.nextInt()-1] = "*";
        }
        reader.close();

        for(int j=0; j<runs; j++) {

            for(int i = 0; i < real.length; i++) {
                for(int g = 0; g < real.length; g++) {

                    int neigh = neighbors(real, i, g);
                    if(test[i][g].equals("*")) {
                        if(neigh<2 || neigh>3) {
                            real[i][g] = " ";
                        }
                    }
                    else {
                        if(neigh == 3) {
                            real[i][g] = "*";
                        }
                    }
                }
            }

            for(int i = 0; i < real.length; i++) {
                for(int g = 0; g < real.length; g++) {
                    real[i][g] = test[i][g];
                }
            }

            System.out.println("     1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16 17 18 19 20\n");
            for(int i = 0; i < real.length; i++) {
                System.out.print((i+1) + "   ");
                for(int g = 0; g < real.length; g++) {
                    System.out.print(" " + test[i][g] + " ");
                }
                System.out.println();
            }

        }

    }

    public static boolean able(int row, int col, int N) {
        if (row >= 0 && col >= 0 && row < N && col < N) {
            return true;
        }
        else {
            return false;
        }
    }

    public static int neighbors(String[][] ray, int row, int col) {

        int neighbor=0;
        int[] rows = {row-1, row-1, row-1, row, row, row+1, row+1, row+1};
        int[] cols = {col-1, col, col+1, col-1, col+1, col-1, col, col+1};

        for(int i=0; i<8; i++) {
            if(able(rows[i], cols[i], 20) && ray[rows[i]][cols[i]].equals("*")) {
                neighbor++;
            }
        }

        return neighbor;
    }

}

实际结果:经过我运行的五次迭代后,细胞不会变得活跃或死亡。

【问题讨论】:

  • 欢迎来到 SO! life100.txt 中有什么内容?
  • 它们是游戏开始时活细胞的坐标。我本来会张贴板子的样子,但是当我把它复制过来时,板子的空间都消失了,所以一切都搞砸了。
  • 不幸的是,没有它,很难编写一个可验证的解决方案。由于它与您面临的问题无关,因此我建议在读取文件内容后在内存中编写一个等效的数组。这将启用minimal reproducible example 并通过消除猜测和干扰使您的问题易于回答,并使人们更容易运行您的代码。
  • 我将努力设置该数组,以便您可以运行代码。感谢您的反馈!

标签: java conways-game-of-life


【解决方案1】:

在我看来,您的所有检查都应该针对“测试”数组,因此更改为:

int neigh = neighbors(test, i, g);

然后,完成所有检查并完成对“真实”的更改后,将所有内容从“真实”复制回“测试”。

所以改变:

real[i][g] = test[i][g];

收件人:

test[i][g] = real[i][g];

【讨论】:

  • 这实际上是朝着正确方向迈出的一大步。非常感谢!
  • 剩下的唯一问题是,由于某种原因,细胞没有以正确的顺序存活和死亡。我将检查我的邻居和可行方法的逻辑,并修改一些更新二维数组的循环。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多