-1

更新:只是为了指定,根据我如何更改规则,我可以设置它,以便在几代之内,所有细胞要么永久存活,要么死亡。我通过将语句回显到控制台来检查这一点。但是,这并没有反映在将所有单元格显示为始终相同颜色的 GUI 中。

我正在尝试实现一个简单的元胞自动机来复制生活游戏。这使用 MASON 库。我的三门课:

单元格.java

package sim.app.gol;

import sim.engine.SimState;
import sim.engine.Steppable;
import sim.field.grid.IntGrid2D;
import sim.util.IntBag;

public class Cell implements Steppable {

    public IntGrid2D grid = new IntGrid2D(0,0);

    public void step(SimState state) {

        Matrix matrix = (Matrix) state;

        grid.setTo(matrix.matrix);

        for(int x = 0; x < grid.getWidth(); x++) {

            for(int y = 0; y < grid.getHeight(); y++) {

                IntBag nei = grid.getMooreNeighbors(x, y, 2, 0, false, new IntBag(), new IntBag(), new IntBag());

                int count = 0;

                for(int i = 0; i < nei.size(); i++) {

                    count += nei.get(i);

                }

                int currentState = grid.get(x, y);

                if(currentState == 0) {

                    if(count > 3)
                        matrix.matrix.set(x, y, 1);


                } else if(currentState == 1) {

                    matrix.matrix.set(x,y,0);


                }

            }


        }




    }

}

矩阵.java

package sim.app.gol;

import ec.util.MersenneTwisterFast;
import sim.engine.SimState;
import sim.field.grid.IntGrid2D;

public class Matrix extends SimState {

    public final int HEIGHT = 10;
    public final int WIDTH = 10;
    public IntGrid2D matrix = new IntGrid2D(HEIGHT, WIDTH);
    public final int NUM_CELLS = 80;

    public Matrix(long seed) {

        super(seed);

    }

    public void start() {

        super.start();

        // Utils for random number generator
        MersenneTwisterFast g = new MersenneTwisterFast();

        // We set everything to 0, no cells are active
        matrix.setTo(0);

        // Populating
        for(int i = 0; i < NUM_CELLS; i++) {

            int x = 0;
            int y = 0;

            // We don't want to mark as 'active' a cell that is already active
            do {
                x = g.nextInt(WIDTH);
                y = g.nextInt(HEIGHT);
            } while(matrix.get(x, y) == 1);

            matrix.set(x, y, 1);


        }

        schedule.scheduleRepeating(new Cell());


    }

    public static void main(String[] args) {


        doLoop(Matrix.class, args);
        System.exit(0);

    }



}

MatrixWithUI.java

package sim.app.gol;

import java.awt.Color;

import javax.swing.JFrame;

import sim.app.students.Students;
import sim.display.Console;
import sim.display.Controller;
import sim.display.Display2D;
import sim.display.GUIState;
import sim.engine.SimState;
import sim.portrayal.continuous.ContinuousPortrayal2D;
import sim.portrayal.grid.ObjectGridPortrayal2D;
import sim.portrayal.grid.ValueGridPortrayal2D;
import sim.portrayal.simple.OvalPortrayal2D;

public class MatrixWithUI extends GUIState {

    public Display2D display;
    public JFrame displayFrame;
    public ValueGridPortrayal2D matrixPortrayal = new ValueGridPortrayal2D();

    public static void main(String[] args) {

        MatrixWithUI mwu = new MatrixWithUI();
        Console c = new Console(mwu);
        c.setVisible(true);

    }

    public void start() {

        super.start();
        setupPortrayals();

    }

    public void load(SimState state) {

        super.load(state);
        setupPortrayals();

    }

    public void setupPortrayals() {

        Matrix matrix = (Matrix) state;
        matrixPortrayal.setField(matrix.matrix);
        matrixPortrayal.setPortrayalForAll(new OvalPortrayal2D());

        display.reset();
        display.setBackdrop(Color.white);

        display.repaint();

    }

    public void init(Controller c) {

        super.init(c);
        display = new Display2D(600,600,this);
        display.setClipping(true);

        displayFrame = display.createFrame();
        displayFrame.setTitle("Schoolyard Display");
        c.registerFrame(displayFrame);
        displayFrame.setVisible(true);
        display.attach(matrixPortrayal, "Yard");

    }

    public void quit() {

        super.quit();
        if (displayFrame != null) displayFrame.dispose();
        displayFrame = null;
        display = null;

    }

    public MatrixWithUI() { 

        super(new Matrix (System.currentTimeMillis())); 

    }

    public MatrixWithUI(SimState state) {

        super(state);

    }

    public static String getName() {

        return "Student Schoolyard Cliques";

    }

}

但是,由于某种原因,所有单元格都连续设置为 0(或关闭)。有什么想法吗?

4

1 回答 1

1

注意:这是一个暂定的答案,因为我目前无法验证它。

首先,让我们看一下. ValueGridPortrayal2D它说:

与其他FieldPortrayal2Ds 一样,此类使用底层SimplePortrayal2D来绘制网格中的每个单独元素。SimplePortrayal2D提供了绘制正方形的默认值。默认情况下,正方形的颜色是通过在用户提供的颜色表中查找正方形的值来确定的,或者如果没有,则通过在两种用户提供的颜色之间进行插值来确定。请参阅setColorTable()setLevels()方法。

所以,如果你满足于正方形而不是椭圆形,你可以放弃这条线:

    matrixPortrayal.setPortrayalForAll(new OvalPortrayal2D());

相反,添加:

    java.awt.Color[] colorTable = new java.awt.Color[2];
    colorTable[0] = new java.awt.Color(1.0F,0.0F,0.0F,0.0F);
    colorTable[1] = new java.awt.Color(1.0F,0.0F,0.0F,1.0F);
    matrixPortrayal.setMap( new SimpleColorMap(colorTable) );

这应该为您提供白色方块(在白色背景上透明)0和红色方块1

如果你想画椭圆,这个SimplePortrayal2D使用地图的默认实现是不可用的。文档进一步说:

您还可以提供自己的自定义SimplePortrayal2D(使用setPortrayalForAll(...))来绘制您认为合适的元素,而不是矩形。您SimplePortrayal2D应该期望传递给它的 draw 方法的对象是 type MutableDouble

所以我们需要重写该draw()方法并将传递的对象 - 单元格值 - 视为一个MutableDouble(我假设它们的意思是 from org.apache.commons.lang):

    matrixPortrayal.setPortrayalForAll(new OvalPortrayal2D() {
        public void draw(Object object, Graphics2D graphics, DrawInfo2D info) {
            MutableDouble valueObj = (MutableDouble)object;
            if ( valueObj.intValue() == 0 ) {
                paint = new java.awt.Color(1.0F,0.0F,0.0F,0.0F);
            } else {
                paint = new java.awt.Color(1.0F,0.0F,0.0F,1.0F);
            }
            filled = true;
            super.draw(object, graphics, info);
        }

    });

所以我们创建了一个匿名子类OvalPortrayal2D。它继承了字段paintfilledscaleAbstractShapePortrayal2D. 因此,我们用特定值所需的颜色覆盖paint(java.awt.Paintjava.awt.Color扩展),并确保填充椭圆形。

于 2014-12-28T20:05:29.460 回答