From百度百科:
兰顿蚂蚁是由克里斯托夫·兰顿提出的细胞自动机的例子。
由来:
兰顿蚂蚁是由克里斯托夫·兰顿提出的细胞自动机的例子。
释义:
在平面上的正方形格被填上黑色或白色。在其中一格正方形有一只“蚂蚁”。它的头部朝向上下左右其中一方。
若蚂蚁在黑格,右转90度,将该格改为白格,向前移一步;
若蚂蚁在白格,左转90度,将该格改为黑格,向前移一步。
很多时,蚂蚁刚刚开始时留下的路线都会有接近对称、像是会重复。但不论起始状态如何,蚂蚁的路线必然是无限长的。
---------------------------------------
目前刚学多线程,还不知道如何将它改成多线程,以达到多只蚂蚁共同爬行,容后研究。
package king.lantonants;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Toolkit;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Ants extends JPanel {
private final int GRID = 5; //每个格子的宽度
private final long TIME_CELL = 1L;//时间间隔
//------------------------------可以改变上面两个值来调整游戏-------------------------//
private final double PER = 0.8; //占屏幕边长的比例
private final int WIDTH = (int)(Toolkit.getDefaultToolkit().getScreenSize().getWidth()*PER)/GRID*GRID;
private final int HEIGHT = (int)(Toolkit.getDefaultToolkit().getScreenSize().getHeight()*PER)/GRID*GRID;
private boolean[][] grid = new boolean[WIDTH/GRID][HEIGHT/GRID];//每个小格子的左上角是它的格子坐标,也即对应的数组索引
private Random rand = new Random();
private Ant ant = new Ant("蚂蚁1", rand.nextInt(5)+(WIDTH/GRID)/2-5, rand.nextInt(5)+(HEIGHT/GRID)/2-5, rand.nextInt(5));
// private Image[] img = new Image[4];
// {
// img[0] = Toolkit.getDefaultToolkit().getImage("./img/Ant0.png");
// img[1] = Toolkit.getDefaultToolkit().getImage("./img/Ant1.png");
// img[2]= Toolkit.getDefaultToolkit().getImage("./img/Ant2.png");
// img[3] = Toolkit.getDefaultToolkit().getImage("./img/Ant3.png");
// }
public Ants(){
JFrame f = new JFrame("兰顿蚂蚁");
setPreferredSize(new Dimension(WIDTH, HEIGHT));
f.add(this);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// repaint();
}
public static void main(String[] args){
new Ants().newGame();
}
// 开始游戏
public void newGame(){
while(true){
if(grid[(int)ant.getX()][(int)ant.getY()]){ //蚂蚁在黑格
ant.turnRight();
}else{
ant.turnLeft();
}
grid[(int)ant.getX()][(int)ant.getY()] = !grid[(int)ant.getX()][(int)ant.getY()];
ant.advance();
repaint();
try {
Thread.sleep(TIME_CELL);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//内部类蚂蚁
private class Ant extends Point{
private String name;
private int direction; //方向
public Ant(String name, int x, int y, int direction){
this.name = name;
this.x = x;
this.y = y;
this.direction = direction;
}
public void setDirection(int n){
this.direction = n;
}
public int getDirection(){
return this.direction;
}
public void turnLeft(){
direction = direction==0?3:(direction-1);
}
public void turnRight(){
direction = direction==3?0:(direction+1);
}
public void advance(){
switch (direction) {
case 0:
y--;
break;
case 1:
x++;
break;
case 2:
y++;
break;
case 3:
x--;
break;
}
}
}
//把格子坐标转换成实际坐标
private int getXY(int X){
return X*GRID;
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
// 填充格子
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[i].length; j++){
if (grid[i][j]){
g.setColor(Color.black);
}else{
g.setColor(Color.white);
}
g.fillRect(getXY(i), getXY(j), GRID, GRID);
}
}
//画格子线
g.setColor(Color.gray);
for(int i = 1; i*GRID < WIDTH;i++) g.drawLine(i*GRID, 0, i*GRID, HEIGHT);
for(int i = 1; i < HEIGHT; i++) g.drawLine(0, i*GRID, WIDTH, i*GRID);
//画蚂蚁
// g.drawImage(img[ant.getDirection()], getXY((int) ant.getX()), getXY((int) ant.getY()), GRID, GRID, this);
g.fillRect(getXY((int)ant.getX()), getXY((int)ant.getY()), GRID, GRID);
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。