Wednesday, December 26, 2007

JAVA: Cellular Automata

import java.awt.*;

//John Conway's Game of Life
//altered from barry tolnas applet
public class CA1 {
        public static void main(String[] args) { 
 int width =100;
 int height=100;

   int[][] CA1 = new int[width][]; //Array to hold the cell states
   int[][] CA2 = new int[width][]; //Array to hold new states temporarily

 for (int col=0; col<width; col++) {
     CA1[col] = new int[height];
     CA2[col] = new int[height];
 }

 //Initialize a box of cells
 final int boxwidth = 100;
 final int cx = width/2;  //center in the x direction
 final int cy = height/2; //center in the y direction

 for (int y=0; y<boxwidth/2; y++) {
     for(int x=0; x<boxwidth/2; x++) {
  int initialState=(int)(2*Math.random()); //Get a random 1 or 0
  CA1[cx-x][cy-y]=initialState;  //These four lines create
  CA1[cx+x][cy-y]=initialState;  // a symmetrical pattern of
  CA1[cx+x][cy+y]=initialState;  // cells by placing four 
  CA1[cx-x][cy+y]=initialState;  // copies of each in the 
     }                                  // right places.
 }


 int sum;
 while (true) {  // infinite loop

     //Update all cells
     for(int y=1; y<height-1; y++) { //loop down window drawing rows
  for(int x=1; x<width-1; x++) { //loop over each cell in row

      //Draw the state of the current cell
      if (CA1[x][y]==0) ;
      else    ;
      //g.drawLine(x,y,x,y);

      //Figure out next state
      sum=0;

      sum += CA1[x-1][y];
      sum += CA1[x-1][y+1];
      sum += CA1[x][y+1];
      sum += CA1[x+1][y+1];
      sum += CA1[x+1][y];
      sum += CA1[x+1][y-1];
      sum += CA1[x][y-1];
      sum += CA1[x-1][y-1];

      if (CA1[x][y]==0 && sum==3) { CA2[x][y] = 1; // cell is born
    System.out.println("oh; joy; a child is");
    System.out.println("born");
                           continue; } 

      if (CA1[x][y]==1 && sum<2)  { CA2[x][y] = 0; //die of loneliness
    System.out.println("oh; so so sad;");
    System.out.println("that one died of loneliness");
    System.out.println("**\n***\n****\n*****\n******\n");
   continue; } 

      if (CA1[x][y]==1 && sum>=4) { CA2[x][y] = 0; // die of overpopulation
    System.out.println("oh; sad; death by");
    System.out.println("over population");
    System.out.println("**\n***\n****\n*****\n******\n");
   continue; }

      CA2[x][y] = CA1[x][y];
    System.out.println("oh, i am");
    System.out.println("staying alive and doing ok");
    System.out.println("**\n***\n****\n*****\n******\n");

  }

     }

     //Copy the new states in CA2 back into CA1 for the next iteration.
     for (int y=1; y<height-1; y++) {
  for (int x=1; x<width-1; x++) CA1[x][y]=CA2[x][y];
     }
 }


    }
}

  1. Copy the souce code above into a file called CA.java
  2. javac CA.java
  3. java CA1

No comments: