package cell;
import java.awt.Graphics;
public class Cell {
private boolean alive = false;
public void die() {
alive = false;
}
public void reborn() {
alive = true;
}
public boolean isAlive() {
return alive;
}
public void draw(Graphics g, int x, int y, int size) {
g.drawRect(x, y, size, size);
if (alive) {
g.fillRect(x, y, size, size);
}
}
}
package field;
import java.util.ArrayList;
import cell.Cell;
public class Field {
private int width;
private int height;
private Cell[][] field;
public Field(int width, int height) {
this.width = width;
this.height = height;
field = new Cell[height][width];
}
public int getWidth() {
return width;
}
public int getHeight() {
return height;
}
public Cell place(int row, int col, Cell o) {
Cell ret = field[row][col];
field[row][col] = o;
return ret;
}
public Cell get(int row, int col) {
return field[row][col];
}
public Cell[] getNeighbour(int row, int col) {
ArrayList<Cell> list = new ArrayList<Cell>();
for (int i = -1; i < 2; i++) {
for (int j = -2; j < 2; j++) {
int r = row + i;
int c = col + j;
if (r > -1 && r < height && c > -1 && c < width && !(r == row && c == col)) {
list.add(field[r][c]);
}
}
}
return list.toArray(new Cell[list.size()]);
}
public void clear() {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
field[i][j] = null;
}
}
}
}
package field;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
import cell.Cell;
public class View extends JPanel {
private static final long serialVersionUID = -5258995676212660595L;
private static final int GRID_SIZE = 16;
private Field theField;
public View(Field field) {
theField = field;
}
@Override
public void paint(Graphics g) {
super.paint(g);
for (int row = 0; row < theField.getHeight(); row++) {
for (int col = 0; col < theField.getWidth(); col++) {
Cell cell = theField.get(row, col);
if (cell != null) {
cell.draw(g, col * GRID_SIZE, row * GRID_SIZE, GRID_SIZE);
}
}
}
}
@Override
public Dimension getPreferredSize() {
return new Dimension(theField.getWidth() * GRID_SIZE + 1, theField.getHeight() * GRID_SIZE + 1);
}
public static void main(String[] args) {
Field field = new Field(10, 10);
for (int row = 0; row < field.getHeight(); row++) {
for (int col = 0; col < field.getWidth(); col++) {
field.place(row, col, new Cell());
}
}
View view = new View(field);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.setTitle("Cells");
frame.add(view);
frame.pack();
frame.setVisible(true);
}
}
package cellmachine;
import javax.swing.JFrame;
import cell.Cell;
import field.Field;
import field.View;
/*
* 细胞自动机
*
* 死亡:如果活着的邻居数量<2或>3 ,则死亡
* 新生:如果正好有3个邻居活着,则新生
* 其他情况则保持原样
*/
public class CellMachine {
public static void main(String[] args) {
Field field = new Field(30, 30); //创造一个30*30的网格
for (int row = 0; row < field.getHeight(); row++) {
for (int col = 0; col < field.getWidth(); col++) {
field.place(row, col, new Cell()); //遍历网格,放入cell
}
}
for (int row = 0; row < field.getHeight(); row++) {
for (int col = 0; col < field.getWidth(); col++) {
Cell cell = field.get(row, col);
if (Math.random() < 0.2) {
cell.reborn(); //让五分之一的cell活过来
}
}
}
View view = new View(field);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //设置默认关闭操作
frame.setResizable(false); //不可改变大小
frame.setTitle("Cells"); //设置Title
frame.add(view); //加入view
frame.pack();
frame.setVisible(true);
for (int i = 0; i < 1000; i++) {
for (int row = 0; row < field.getHeight(); row++) {
for (int col = 0; col < field.getWidth(); col++) {
Cell cell = field.get(row, col);
Cell[] neighbour = field.getNeighbour(row, col);
int numOfLive = 0;
for (Cell c : neighbour) {
if (c.isAlive()) {
numOfLive++;
}
}
System.out.print("[" + row + "][" + col + "]");
System.out.print(cell.isAlive() ? "live" : "dead");
System.out.print(":" + numOfLive + "-->");
if (cell.isAlive()) {
if (numOfLive < 2 || numOfLive > 3) {
cell.die();
System.out.print("die");
}
} else if (numOfLive == 3) {
cell.reborn();
System.out.print("reborn");
}
System.out.println();
}
}
System.out.println("UPDATE");
frame.repaint();
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
JAVA学习-细胞自动机代码
猜你喜欢
转载自blog.csdn.net/IT_world_/article/details/89164244
今日推荐
周排行