-1

更新:指定するために、ルールをどのように変更するかに応じて、数世代以内にすべての細胞が永久に生きているか死んでいるかを設定できます。ステートメントをコンソールにエコーすることでこれを確認しました。ただし、これはすべてのセルを常に同じ色で表示する GUI には反映されません。

単純なセル オートマトンを実装して、人生のゲームを再現しようとしています。これは MASON ライブラリを使用します。私の3つのクラス:

Cell.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見てみましょう。それは言います:

FieldPortrayal2Dの と同様に、このクラスは基SimplePortrayal2Dになる を使用して、グリッド内の個別の要素をそれぞれ描画します。SimplePortrayal2D正方形を描画するデフォルトが提供されます。デフォルトでは、正方形の色は、ユーザー提供のカラーテーブルで正方形の値を検索するか、存在しない場合はユーザー提供の 2 つの色の間で補間することによって決定されます。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(...)) を提供して、長方形ではなく適切と思われる要素を描画することもできます。drawSimplePortrayal2Dメソッドに渡されるオブジェクトは、 型であると想定する必要がありますMutableDouble

したがって、メソッドをオーバーライドしてdraw()、渡されたオブジェクト (セルの値) を として扱う必要がありますMutableDouble(これは、 からのものを意味すると仮定します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);
        }

    });

の無名サブクラスを作成しましたOvalPortrayal2Dpaintフィールドとfilledを継承しscaleますAbstractShapePortrayal2D。そのため、特定の値に必要な色でjava.awt.Paintpaint ( 拡張) をオーバーライドし、楕円が塗りつぶされていることを確認します。java.awt.Color

于 2014-12-28T20:05:29.460 に答える