92 lines
1.9 KiB
Java
92 lines
1.9 KiB
Java
import static java.util.List.of;
|
|
|
|
class GameOfLife {
|
|
|
|
boolean[][] board = new boolean[3][3];
|
|
|
|
GameOfLife() {}
|
|
|
|
GameOfLife(String[] board) {
|
|
set((i, j, s) -> board[i].charAt(j * 2) == '■');
|
|
}
|
|
|
|
void set(Setter setter) {
|
|
for (int i = 0; i < board.length; i++) {
|
|
for (int j = 0; j < board[i].length; j++) {
|
|
board[i][j] = setter.set(i, j, board[i][j]);
|
|
}
|
|
}
|
|
}
|
|
|
|
void get(Getter getter) {
|
|
set((i, j, s) -> {
|
|
getter.get(i, j, s);
|
|
return s;
|
|
});
|
|
}
|
|
|
|
int countNeighbors(int i, int j) {
|
|
var counter = new Getter() {
|
|
int count;
|
|
|
|
@Override
|
|
public void get(int li, int lj, boolean state) {
|
|
if (distance(i, j, li, lj) == 1 && board[li][lj])
|
|
count++;
|
|
}
|
|
};
|
|
get(counter);
|
|
return counter.count;
|
|
}
|
|
|
|
int distance(int i, int j, int li, int lj) {
|
|
return Math.max(
|
|
Math.abs(i - li),
|
|
Math.abs(j - lj));
|
|
}
|
|
|
|
GameOfLife makeNextGeneration() {
|
|
var n = new GameOfLife();
|
|
n.set((i, j, s) -> {
|
|
var alive = board[i][j];
|
|
int c = countNeighbors(i, j);
|
|
if (alive) {
|
|
return c == 2 || c == 3;
|
|
} else {
|
|
return c == 3;
|
|
}
|
|
});
|
|
return n;
|
|
}
|
|
|
|
void print() {
|
|
get((i, j, s) -> {
|
|
if (j == 0)
|
|
System.out.println();
|
|
System.out.print(s ? "■ " : "□ ");
|
|
});
|
|
}
|
|
|
|
interface Setter {
|
|
boolean set(int i, int j, boolean state);
|
|
}
|
|
|
|
interface Getter {
|
|
void get(int i, int j, boolean state);
|
|
}
|
|
|
|
public static void main(String[] args) {
|
|
String[] board = {
|
|
"□ ■ □ ",
|
|
"□ ■ □ ",
|
|
"□ ■ □ ",
|
|
};
|
|
var gol = new GameOfLife(board);
|
|
for (var generation : of(0, 1, 2)) {
|
|
gol.print();
|
|
System.out.println("\n");
|
|
gol = gol.makeNextGeneration();
|
|
}
|
|
}
|
|
|
|
}
|