84 lines
2.0 KiB
Java
84 lines
2.0 KiB
Java
import java.util.Arrays;
|
|
|
|
/**
|
|
* Model a 1D elementary cellular automaton.
|
|
*
|
|
* @author David J. Barnes and Michael Kölling
|
|
* @version 2016.02.29 - version 1
|
|
*/
|
|
public class Automaton
|
|
{
|
|
// The number of cells.
|
|
private final int numberOfCells;
|
|
// The state of the cells.
|
|
private int[] state;
|
|
|
|
/**
|
|
* Create a 1D automaton consisting of the given number of cells.
|
|
* @param numberOfCells The number of cells in the automaton.
|
|
*/
|
|
public Automaton(int numberOfCells)
|
|
{
|
|
this.numberOfCells = numberOfCells;
|
|
state = new int[numberOfCells];
|
|
// Seed the automaton with a single 'on' cell in the middle.
|
|
state[numberOfCells / 2] = 1;
|
|
}
|
|
|
|
/**
|
|
* Print the current state of the automaton.
|
|
*/
|
|
public void print()
|
|
{
|
|
for(int cellValue : state) {
|
|
if(cellValue == 1) {
|
|
System.out.print("*");
|
|
}
|
|
else {
|
|
System.out.print(" ");
|
|
}
|
|
}
|
|
System.out.println();
|
|
}
|
|
|
|
/**
|
|
* Update the automaton to its next state.
|
|
*/
|
|
public void update()
|
|
{
|
|
// Build the new state in a separate array.
|
|
int[] nextState = new int[state.length];
|
|
// Naively update the state of each cell
|
|
// based on the state of its two neighbors.
|
|
for(int i = 0; i < state.length; i++) {
|
|
int left, center, right;
|
|
if(i == 0) {
|
|
left = 0;
|
|
}
|
|
else {
|
|
left = state[i - 1];
|
|
}
|
|
center = state[i];
|
|
if(i + 1 < state.length) {
|
|
right = state[i + 1];
|
|
}
|
|
else {
|
|
right = 0;
|
|
}
|
|
nextState[i] = (left + center + right) % 2;
|
|
}
|
|
state = nextState;
|
|
}
|
|
|
|
/**
|
|
* Reset the automaton.
|
|
*/
|
|
public void reset()
|
|
{
|
|
Arrays.fill(state, 0);
|
|
// Seed the automaton with a single 'on' cell.
|
|
state[numberOfCells / 2] = 1;
|
|
|
|
}
|
|
}
|