jpayne@68
|
1 package fun;
|
jpayne@68
|
2
|
jpayne@68
|
3 import java.util.LinkedList;
|
jpayne@68
|
4 import java.util.Random;
|
jpayne@68
|
5
|
jpayne@68
|
6 public class Life {
|
jpayne@68
|
7
|
jpayne@68
|
8 public static void main(String[] args){
|
jpayne@68
|
9 Life life=new Life(args);
|
jpayne@68
|
10 life.simulate();
|
jpayne@68
|
11 }
|
jpayne@68
|
12 public Life(String[] args){
|
jpayne@68
|
13 xdim=Integer.parseInt(args[0]);
|
jpayne@68
|
14 ydim=Integer.parseInt(args[1]);
|
jpayne@68
|
15 rounds=Integer.parseInt(args[2]);
|
jpayne@68
|
16 prob=Float.parseFloat(args[3]);
|
jpayne@68
|
17 }
|
jpayne@68
|
18
|
jpayne@68
|
19 void simulate(){
|
jpayne@68
|
20 grid=new int[xdim][ydim];
|
jpayne@68
|
21 int[][] nextGrid=new int[xdim][ydim];
|
jpayne@68
|
22 initialize();
|
jpayne@68
|
23
|
jpayne@68
|
24 LinkedList<int[][]> queue=new LinkedList<int[][]>();
|
jpayne@68
|
25
|
jpayne@68
|
26 for(int i=0; i<rounds; i++){
|
jpayne@68
|
27
|
jpayne@68
|
28 print(i);
|
jpayne@68
|
29 int count=fill(nextGrid);
|
jpayne@68
|
30 int[][] temp=grid;
|
jpayne@68
|
31 grid=nextGrid;
|
jpayne@68
|
32 nextGrid=temp;
|
jpayne@68
|
33 // if(count<1){break;}
|
jpayne@68
|
34 // if(equals(grid, nextGrid)){break;}
|
jpayne@68
|
35
|
jpayne@68
|
36 for(int[][] x : queue){
|
jpayne@68
|
37 if(equals(grid, x)){return;}
|
jpayne@68
|
38 }
|
jpayne@68
|
39 queue.add(copy(grid));
|
jpayne@68
|
40 if(queue.size()>10){queue.poll();}
|
jpayne@68
|
41
|
jpayne@68
|
42 // long time=System.nanoTime();
|
jpayne@68
|
43 // long next=time+50000000;
|
jpayne@68
|
44 // while(System.nanoTime()<next);
|
jpayne@68
|
45 }
|
jpayne@68
|
46 }
|
jpayne@68
|
47
|
jpayne@68
|
48 int[][] copy(int[][] a){
|
jpayne@68
|
49 int[][] b=new int[xdim][ydim];
|
jpayne@68
|
50 for(int x=0; x<xdim; x++){
|
jpayne@68
|
51 for(int y=0; y<ydim; y++){
|
jpayne@68
|
52 b[x][y]=a[x][y];
|
jpayne@68
|
53 }
|
jpayne@68
|
54 }
|
jpayne@68
|
55 return b;
|
jpayne@68
|
56 }
|
jpayne@68
|
57
|
jpayne@68
|
58 boolean equals(int[][] a, int[][] b){
|
jpayne@68
|
59 for(int x=0; x<xdim; x++){
|
jpayne@68
|
60 for(int y=0; y<ydim; y++){
|
jpayne@68
|
61 if(a[x][y]!=b[x][y]){return false;}
|
jpayne@68
|
62 }
|
jpayne@68
|
63 }
|
jpayne@68
|
64 return true;
|
jpayne@68
|
65 }
|
jpayne@68
|
66
|
jpayne@68
|
67 void initialize(){
|
jpayne@68
|
68 Random randy=new Random();
|
jpayne@68
|
69 for(int x=0; x<xdim; x++){
|
jpayne@68
|
70 for(int y=0; y<ydim; y++){
|
jpayne@68
|
71 grid[x][y]=(randy.nextFloat()<prob ? 1 : 0);
|
jpayne@68
|
72 }
|
jpayne@68
|
73 }
|
jpayne@68
|
74 }
|
jpayne@68
|
75
|
jpayne@68
|
76 int fill(int[][] nextGrid){
|
jpayne@68
|
77 int count=0;
|
jpayne@68
|
78 for(int x=0; x<xdim; x++){
|
jpayne@68
|
79 for(int y=0; y<ydim; y++){
|
jpayne@68
|
80 int z=next(x, y);
|
jpayne@68
|
81 nextGrid[x][y]=z;
|
jpayne@68
|
82 count+=z;
|
jpayne@68
|
83 }
|
jpayne@68
|
84 }
|
jpayne@68
|
85 return count;
|
jpayne@68
|
86 }
|
jpayne@68
|
87
|
jpayne@68
|
88 int next(int x, int y){
|
jpayne@68
|
89 int sum=neighbors(x, y);
|
jpayne@68
|
90 return (sum==3 || (sum==2 && grid[x][y]==1)) ? 1 : 0;
|
jpayne@68
|
91 }
|
jpayne@68
|
92
|
jpayne@68
|
93 int neighbors(int x, int y){
|
jpayne@68
|
94 // int minX=Tools.max(x-1, 0);
|
jpayne@68
|
95 // int minY=Tools.max(y-1, 0);
|
jpayne@68
|
96 // int maxX=Tools.min(x+1, xdim-1);
|
jpayne@68
|
97 // int maxY=Tools.min(y+1, ydim-1);
|
jpayne@68
|
98
|
jpayne@68
|
99 int sum=-grid[x][y];
|
jpayne@68
|
100 // for(int i=minX; i<=maxX; i++){
|
jpayne@68
|
101 // for(int j=minY; j<=maxY; j++){
|
jpayne@68
|
102 // sum+=grid[i][j];
|
jpayne@68
|
103 // }
|
jpayne@68
|
104 // }
|
jpayne@68
|
105 for(int i=-1; i<=1; i++){
|
jpayne@68
|
106 for(int j=-1; j<=1; j++){
|
jpayne@68
|
107 sum+=grid[(i+x+xdim)%xdim][(j+y+ydim)%ydim];
|
jpayne@68
|
108 }
|
jpayne@68
|
109 }
|
jpayne@68
|
110 return sum;
|
jpayne@68
|
111 }
|
jpayne@68
|
112
|
jpayne@68
|
113 void print(int round){
|
jpayne@68
|
114
|
jpayne@68
|
115 StringBuilder sb=new StringBuilder();
|
jpayne@68
|
116 System.out.print("\033[H\033[2J");
|
jpayne@68
|
117 sb.append("\nRound "+round+"\n");
|
jpayne@68
|
118 for(int x=0; x<xdim; x++){
|
jpayne@68
|
119 for(int y=0; y<ydim; y++){
|
jpayne@68
|
120 sb.append(grid[x][y]==0 ? ' ' : '@');
|
jpayne@68
|
121 }
|
jpayne@68
|
122 sb.append('\n');
|
jpayne@68
|
123 }
|
jpayne@68
|
124 // System.out.print("\033[H\033[2J");
|
jpayne@68
|
125 // System.out.flush();
|
jpayne@68
|
126 System.out.println(sb);
|
jpayne@68
|
127 System.out.flush();
|
jpayne@68
|
128 }
|
jpayne@68
|
129
|
jpayne@68
|
130 int[][] grid;
|
jpayne@68
|
131 int xdim, ydim, rounds;
|
jpayne@68
|
132 float prob;
|
jpayne@68
|
133
|
jpayne@68
|
134 }
|