Java Игра жизни - рекурсия - пользователю предлагается ввести имя файла и количество поколений для запуска - PullRequest
0 голосов
/ 03 апреля 2020

Этот код предназначен для приложения игры из жизни. Мой код запрашивает у пользователя текстовый файл контейнера строк и столбцов. Файл читается и вводится в 2D массив. Затем массив передается моему методу nextGeneration, и это печатает поколение.

Мне нужно передать будущий массив обратно в nextGeneration столько раз, сколько требуется для ввода пользователя.

I ' Весь день мы боролись за то, чтобы передать следующему поколению массив "future" после того, как он прошел первое поколение.

Любая помощь будет принята с благодарностью. Спасибо.

static void nextGeneration(int grid[][], int M, int N, int NumberofGenerations) 
{ 
    int[][] future = new int[M][N]; 

    // Loop through every cell 


    for (int l = 1; l < M - 1; l++) 
    { 
        for (int m = 1; m < N - 1; m++) 
            { 
        // finding no Of Neighbours that are alive 
        int aliveNeighbours = 0; 
        for (int i = -1; i <= 1; i++) 
            for (int j = -1; j <= 1; j++) 
            aliveNeighbours += grid[l + i][m + j]; 


        // The cell needs to be subtracted from 
        // its neighbours as it was counted before 
        aliveNeighbours -= grid[l][m]; 

        // Implementing the Rules of Life 

        // Cell is lonely and dies 
        if ((grid[l][m] == 1) && (aliveNeighbours < 2)) 
            future[l][m] = 0; 

        // Cell dies due to over population 
        else if ((grid[l][m] == 1) && (aliveNeighbours > 3)) 
            future[l][m] = 0; 

        // A new cell is born 
        else if ((grid[l][m] == 0) && (aliveNeighbours == 3)) 
            future[l][m] = 1; 

        // Remains the same 
        else
            future[l][m] = grid[l][m]; 

        }

    }


    if (NumberofGenerations != 0)
             {
                return   NumberofGenerations -1 *  nextGeneration(future[l][m], 20, 20,NumberofGenerations -1); 
                // recursive call
            else
                return 1;
             }



    System.out.println("Next Generation"); 
    for (int i = 0; i < M; i++) 
    { 
            for (int j = 0; j < N; j++) 
            { 
                if (future[i][j] == 0) 
                    System.out.print(" "); 
                else
                    System.out.print("*"); 
            } 
            System.out.println(); 
    } 

} 

1 Ответ

0 голосов
/ 03 апреля 2020

Вообще говоря, рекурсия - хорошая идея, но не очень хорошая для реализации, обычно она может быть достигнута итеративно и занимает гораздо больше времени и памяти, чем итеративный способ. Поэтому я покажу вам, как реализовать ваш алгоритм итеративно.

Псевдокод:

1.    Call nextGeneration
2.    loop 1 to NumberofGenerations
2.1.    init future
2.2.    put next generation in future
2.3.    print future
2.4.    copy future to grid

Поскольку ваш код создает следующее поколение независимо от того, что в будущем массиве, он будет работать.

У вас уже есть шаги 1, 2.1, 2.2, 2.3, все, что вам нужно сделать, это удалить рекурсивный вызов, добавить al oop (этап 2.) и скопировать будущее в сетку (этап 2.4).

Скопировать код :

for (int i=0; i < grid.length; i++)
  for (int j=0; j < grid[i].length; j++)
    grid[i][j] = future[i][j];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...