JAVA学习-细胞自动机代码

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();
			}
		}

	}

}

猜你喜欢

转载自blog.csdn.net/IT_world_/article/details/89164244