Bitte Hilfe mit meiner grundlegenden Java-Implementierung von Conways Spiel des Lebens

StackOverflow https://stackoverflow.com/questions/4058292

  •  27-09-2019
  •  | 
  •  

Frage

Ich habe verbrachte eine ganze Weile versucht, ein Programm zu schreiben, Conways Spiel des Lebens zu implementieren - Verbindung mit weitere Informationen. . Ich bin nach ein paar Online-Ratgeber und wurde mit der Mehrheit der Funktionen gegeben. Ich schrieb die „nächste“ und „Nachbarn“ Methoden unten gezeigt. Könnte mir jemand sagen, ob diese gute Implementierungen sind, und wie sie gemacht werden könnten besser bitte?

Der Sinn der Übung war es, keine der anderen Methoden zu ändern oder ändern und nur die nächste Methode schreiben! :)

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

public class Life {

private boolean[][] cells;

public static void main( String[] args ) {
  Life generation = new Life( );
  for (int i = 0; i != 10; i++) {
    System.out.println( generation );
    generation.next( );
  }
}
// Constructors

public void next (){

  int SIZE;
  SIZE=cells.length;
  boolean[][] tempCells = new boolean [SIZE] [SIZE]; 

  for( int i=0; i<SIZE; i++ ) {
 for( int j=0; j<SIZE; j++ ) {
  tempCells[i][j] = cells[i][j];
 }
  } 
  for (int row = 0; row < cells.length ; row++)
  {
    for (int col = 0 ; col < cells[row].length ; col++)
    {
      if ( neighbours(row, col) > 3  ||  neighbours(row, col) < 2 )
      {
        tempCells[row][col] = false;
      }
      else if (neighbours(row, col) == 3 )
      {
        tempCells[row][col] = true;
      }      

    }

  }
  cells = tempCells;

}


public int neighbours (int row, int col) {
  int acc=0;
  for ( int i = row -1; i <= row + 1 ; i++)
    {
     for (int j = col -1 ; j <= col + 1 ; j++)
       {
       try {
         if (cells[i][j]==true && (i != row || j!=col))
         {
           acc++;
         }          
       } catch ( ArrayIndexOutOfBoundsException f)
       {continue;}
     }
  }
  return acc;
}


// Initialises 6 * 6 grid with Glider pattern.
public Life( ) {
final int SIZE = 8;
// Arguably, this should have been a class (static) array.
final int[][] pairs = {{2,4},{3,3},{1,2},{2,2},{3,2}};
cells = new boolean[ SIZE ][ ];
for (int row = 0; row < SIZE; row ++) {
cells[ row ] = new boolean[ SIZE ];
}
for (int pair = 0; pair < pairs.length; pair ++) {
final int row = pairs[ pair ][ 0 ];
final int col = pairs[ pair ][ 1 ];
cells[ row ][ col ] = true;
}
}
 // Initialise size * size grid with random cells.
//public Life( int size ) {
//final Random rand = new Random( );
//cells = new boolean[ size ][ ];
//for (int row = 0; row < size; row ++) {
//cells[ row ] = new boolean[ size ];
//for (int col = 0; col < size; col ++) {
//cells[ row ][ col ] = (rand.nextInt( 2 ) == 0);
//}
//}
//}
// Public methods and helper methods.

@Override
public String toString( ) {
String result = "";
for (int row = 0; row < cells.length; row ++) {
final boolean[] column = cells[ row ];
for (int col = 0; col < column.length; col ++) {
result = result + (column[ col ] ? "x" : ".");
}
result = result + "\n";
}
return result;
}
}
War es hilfreich?

Lösung

Sie brauchen nicht den Inhalt von cells zu tempCells (die ersten verschachtelten Schleife in next) zu kopieren. Stattdessen können Sie eine zusätzliche Klausel zum if-else in der nächsten Schleife hinzuzufügen. Auch kann das Ergebnis von neighbours Speichern sowohl eine gute Idee für seine Geschwindigkeit und Klarheit.

for (int row = 0; row < cells.length ; row++)
    for (int col = 0 ; col < cells[row].length ; col++) {
       int n = neighbours(row,col);

       if (n > 3  ||  n < 2)
           tempCells[row][col] = false;
       else if (n == 3)
           tempCells[row][col] = true;
       else
           tempCells[row][col] = cells[row][col];
    }

(Davon abgesehen, sieht gut aus, aber ich habe nicht ausgeführt und getestet Code).

Andere Tipps

Do not ArrayIndexOutOfBoundException verwenden zu berechnen out-of-Grenze (OOB) Bedingungen. Es tötet Leistung. Besser verwenden Sie den Wrap-around-Mechanismus Array wie eine Kugel zu behandeln, so dass Sie nicht OOBs überhaupt begegnen. Man könnte so etwas wie dies versucht:

public Cell[] getNeighbours(int i, int j) {
int i2 = i - 1, i3 = i + 1, j2 = j - 1, j3 = j + 1;
if (i2 == -1) i2 = board.length - 1;
if (i3 == (board.length)) i3 = 0;
if (j2 == -1) j2 = board[i].length - 1;
if (j3 == (board[i].length)) j3 = 0;
return new Cell[]{board[i2][j2], board[i2][j], board[i2][j3], board[i][j2], board[i][j3], board[i3][j2], board[i3][j], board[i3][j3]};

}

Dann können Sie Schleife durch das zurückgegebene Array und überprüfen, wie viele von denen noch am Leben sind und dass die Zählung zurück.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top