兰顿蚂蚁

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





版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2014-12-31 21:51  包清骏  阅读(682)  评论(0编辑  收藏  举报