Files
G4G0-1/Semester 1/Programming 1/Java/examples/projects/chapter07/automaton-v3/Automaton.java
2024-01-15 20:14:10 +00:00

87 lines
2.4 KiB
Java

import java.util.*;
/**
* Model a 1D elementary cellular automaton.
*
* @author David J. Barnes and Michael Kölling
* @version 2016.02.29 - version 3
*/
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;
// Allow an extra element to avoid 'fencepost' errors.
state = new int[numberOfCells + 1];
// Seed the automaton with a single 'on' cell.
state[numberOfCells / 2] = 1;
}
/**
* Print the current state of the automaton.
*/
public void print()
{
for(int cellValue : state) {
System.out.print(cellValue == 1 ? "*" : " ");
}
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];
// Use 0 for the non-existent value to the left of
// the first cell.
int left = 0;
int center = state[0];
for(int i = 0; i < numberOfCells; i++) {
int right = state[i + 1];
nextState[i] = calculateNextState(left, center, right);
left = center;
center = right;
}
state = nextState;
}
/**
* Reset the automaton.
*/
public void reset()
{
Arrays.fill(state, 0);
// Seed the automaton with a single 'on' cell in the middle.
state[numberOfCells / 2] = 1;
}
/**
* Calculate the next state of the center cell
* given current left, center and right cell
* values.
* This implements Wolfram code 110.
* @see https://en.wikipedia.org/wiki/Wolfram_code
* @param left The state of the cell to the left of center.
* @param center The state of the center cell.
* @param right The state of the cell to the right of center.
* @return The new value of center (0 or 1).
*/
private int calculateNextState(int left, int center, int right)
{
return (center + right + center * right + left * center * right) % 2;
}
}