Нет обновлений между различными итерациями кода (игра жизни Конвея) - PullRequest
0 голосов
/ 22 апреля 2019

Эта программа пытается воссоздать игру жизни Конвея.

Правила, которые этот код пытается применить:

  • Оживают пустые ячейки с 3 соседями
  • Живые клетки с <2 или> 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;
    }

}

Фактические результаты: Клетки не становятся живыми или мертвыми после пяти итераций, которые у меня запущены.

1 Ответ

0 голосов
/ 22 апреля 2019

Мне кажется, что все ваши проверки должны соответствовать массиву "test", поэтому измените на:

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

Затем, после того, как все проверки выполнены и внесены изменения в "real", скопируйте все из "real" обратно в "test".

Итак, измените:

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

Кому:

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