Java GUI Swing 游戏项目 模拟进化

我在很早很早就思考,生命是什么,生命怎样出现,生命是否是进化至现在?

世界总是熵增的,为什么会出现生命这样的事物来抵抗熵增呢?

到了大学,接触了计算机,使得我能够借助计算机去解决这样一些问题,尝试用计算机来做出一些合理的解释

我的想法是,设定游戏规则,在平面100*100的范围内,有10000个空方块,每个方块都能够生存一个细胞

然后开始设置复杂的规则

1.给定细胞分裂次数限制,如果细胞分裂次数达到限制,将无法继续分裂

2.给定细胞年龄,自从该细胞诞生起,记年龄为0,此后每个时间段过后都会年龄加一,当达到成熟年龄的时候,如果身边8个方块如果有空位置,就可以分裂为两个,如果没有,那么不分裂,年龄仍然加一,

3.设置衰老年龄,如果一个细胞到了衰老阶段还没有分裂,那么他将无法分裂,直到死亡,不复存在

这三个条件设立之后,运行很多次实验,由于细胞分裂次数有限,所以所有细胞都在一段时间后死亡

细胞根据能够进行的分裂次数划分为20阶段,从紫色到红色依次分裂能力减弱

这样的情况远远不能够达到进化的目的

我们得想办法让细胞获得新生

于是我设置了一个突变系统

4.细胞的成熟年龄,衰老年龄,死亡年龄变为可以突变的属性,细胞在每次分裂时候都有极小概率突变,突变的细胞将会获得分裂能力的增加,除此之外,还将在上面三个属性中随机一个属性获得一个随机的变化,加一或者减一,并且能够遗传给下一代

我经过测试,感觉很完美,但是发现太单调了,细胞总是倾向于向长寿命,早熟,长衰老发展,导致后面的周期越来越长

5.后来,我又加入了突变概率属性,其概率本身大小也会随着突变而随机发生无法确定的突变,

又加入了突变分裂能力 增加量,每次突变也有可能在这个属性上获得一个增量或者减量,

我后来又测试,感觉越来越不错,但是细胞总是倾向于往好的方向发展,那些向负方向突变的细胞总是在极长的生存淘汰中被慢慢淘汰

于是我又加入了生命值系统

6.每个细胞都有一个伤害阀值,在其成熟前,该值会随年龄而增加,如果在其每个成长时间段中,其身边8个位置都有细胞存在,其将判定为营养不良,将受到伤害加一,如果受到伤害大于该阀值,这个细胞就会死亡,到达成熟阶段时,这个阀值将变为该细胞成熟年龄的3倍,同样,成年细胞也有营养不良系统

衰老细胞的阀值变为成熟年龄的大小,如果受到伤害大于这个值,将直接死亡

这次之后,我运行了很多次,终于满意了,我在一次实验中运行6个小时,细胞不再倾向于往低龄成熟方向发展,而是稳定在一个固定的值,其寿命也增长到某个阶段,然后极其缓慢增长,我也不明白这是为什么,或许这就是相互的选择吧,可能寿命太长不利于后代的发展吧

话不多说,一起来看看代码吧,

项目我会放在后面免费提供

package Research.Ev;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Random;

public class Evolution {
    public static void main(String []args) throws FileNotFoundException {
        EFrame f=new EFrame();
        f.setTitle("Evolution");
    }
}

class EFrame extends JFrame{
    MainPanel mp=new MainPanel();
    EFrame() throws FileNotFoundException {
        setSize(1220,1060);
        setResizable(false);
        setDefaultCloseOperation(EFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        add(mp);
        setVisible(true);
        if(EPanel.IsTest){setIconImage(Toolkit.getDefaultToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\0.jpg"));}
        else{setIconImage(Toolkit.getDefaultToolkit().getImage("0.jpg"));}
    }
}

class MainPanel extends JPanel{
    EPanel ep=new EPanel();
    CPanel cp=new CPanel(ep.getInterface());
    MainPanel() throws FileNotFoundException {
        setLayout(null);
        ep.setBounds(0,0,1020,1060);
        cp.setBounds(1030,0,199,1060);
        add(ep);
        add(cp);
    }
}

class CPanel extends JPanel implements ActionListener{
    JLabel l4=new JLabel("速率/ms:");
    JTextField t4=new JTextField("3");
    JLabel l5=new JLabel("帧率/fps:");
    JTextField t5=new JTextField("144");
    JLabel l1=new JLabel("寿命:");
    JTextField t1=new JTextField("20");
    JLabel l2=new JLabel("成熟:");
    JTextField t2=new JTextField("1");
    JLabel l3=new JLabel("衰老:");
    JTextField t3=new JTextField("15");
    JLabel l8=new JLabel("能力:");
    JTextField t8=new JTextField("199");
    JLabel l9=new JLabel("突变量/百万:");
    JTextField t9=new JTextField("500");
    JLabel l10=new JLabel("突变增量:");
    JTextField t10=new JTextField("20");
    JButton b1=new JButton("重开");
    JButton b2=new JButton("暂停");
    JButton b3=new JButton("设置");
    JButton b4=new JButton("高级");
    JLabel ls=new JLabel("");
    SendChanges sc;

    static JLabel D1=new JLabel();
    static JLabel D2=new JLabel();
    static JLabel D3=new JLabel();
    static JLabel D4=new JLabel();
    static JLabel D5=new JLabel();
    static JLabel D6=new JLabel();

    CPanel(SendChanges sc){
        this.sc=sc;
        setLayout(null);
        l1.setBounds(0,60,40,20);
        t1.setBounds(40,60,60,20);
        l2.setBounds(0,90,40,20);
        t2.setBounds(40,90,60,20);
        l3.setBounds(0,120,40,20);
        t3.setBounds(40,120,60,20);
        ls.setBounds(0,150,190,20);
        t4.setBounds(80,330,60,20);
        l4.setBounds(0,330,190,20);
        t5.setBounds(80,360,60,20);
        l5.setBounds(0,360,190,20);
        t8.setBounds(80,460,60,20);
        l8.setBounds(0,460,190,20);
        t9.setBounds(80,490,60,20);
        l9.setBounds(0,490,190,20);
        t10.setBounds(80,520,60,20);
        l10.setBounds(0,520,190,20);
        b1.setBounds(40,200,80,30);
        b2.setBounds(40,240,80,30);
        b3.setBounds(40,280,80,30);
        b4.setBounds(40,550,80,30);
        b1.addActionListener(this);
        b2.addActionListener(this);
        b3.addActionListener(this);
        b4.addActionListener(this);
        D1.setBounds(10,600,180,30);
        D2.setBounds(10,630,180,30);
        D3.setBounds(10,660,180,30);
        D4.setBounds(10,690,180,30);
        D5.setBounds(10,720,180,30);
        D6.setBounds(10,750,180,30);
        add(l1);
        add(t1);
        add(l2);
        add(t2);
        add(l3);
        add(t3);
        add(l8);
        add(t8);
        add(l9);
        add(t9);
        add(l10);
        add(t10);
        add(ls);
        add(b1);
        add(b2);
        add(b3);
        add(b4);
        add(t4);
        add(l4);
        add(t5);
        add(l5);
        add(D1);
        add(D2);
        add(D3);
        add(D4);
        add(D5);
        add(D6);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource()==b1){
            sc.Restart();
        }
        else if(e.getSource()==b2){
            sc.SetPause();
        }
        else if(e.getSource()==b3){
            int a,b,c,d,ee;
            try{
                a=Integer.parseInt(t1.getText());
                b=Integer.parseInt(t2.getText());
                c=Integer.parseInt(t3.getText());
                d=Integer.parseInt(t4.getText());
                ee=Integer.parseInt(t5.getText());
                if(a<=0){throw new NumberFormatException("寿命不能小于等于0");}
                if(b<0||b>a){throw new NumberFormatException("成熟不能小于0或者大于寿命");}
                if(c<1||c>a){throw new NumberFormatException("衰老不能小于1或者大于寿命");}
                if(d<3){throw new NumberFormatException("最小速率为3ms");}
                if(ee>144){throw new NumberFormatException("最大帧率为144fps");}
                sc.Setting(a,b,c,d,ee);
                ls.setText("设置成功");
            }
            catch (NumberFormatException ec){
                ls.setText(ec.getMessage());
            }
        }
        else if(e.getSource()==b4) {
            try {
                int z = Integer.parseInt(t8.getText());
                int p = Integer.parseInt(t9.getText());
                int num =Integer.parseInt(t10.getText());
                if(z<0||z>199){
                    throw new NumberFormatException("能力值应在0~199之间");
                }
                if(p<0||p>=1000000){
                    throw new NumberFormatException("概率不能小于0或者大于1");
                }
                if(num<0||num>199){
                    throw new NumberFormatException("增量应当在0~198之间");
                }
                sc.ReduceEntropy(z,p,num);
            }
            catch (NumberFormatException ex){
                ls.setText(ex.getMessage());
            }
        }
    }

    public static void DoChanges(int p,int add,int life,int mature,int aging,int ability) {
        D1.setText("突变概率:"+p);
        D2.setText("突变增量:"+add);
        D3.setText("寿命年龄:"+life);
        D4.setText("成熟年龄:"+mature);
        D5.setText("衰老年龄:"+aging);
        D6.setText("平均能力:"+ability);
    }
}

class EPanel extends JPanel implements Runnable, ActionListener,SendChanges, MouseListener,ThreadInterface{
    int RecordNum=0;
    String RecordTemp="";
    boolean State=true;
    int sizeX=100;
    int sizeY=100;
    int GSP=3;
    int FPS=144;
    int cp=1000/FPS;
    boolean Subtract=false;
    int Life=20;
    int Mature=1;
    int Aging=15;
    Random RD=new Random();


    int Probability=500;
    int AddNum=20;

    int X=0,Y=0,Z=199;
    static boolean IsTest=false;
    Cell [][] General=new Cell[sizeY][sizeX];
    Cell [][] Ready=new Cell[sizeY][sizeX];
    private Image IB;
    private  Graphics GB;
    Timer timer;
    PrintWriter pw;

    EPanel() throws FileNotFoundException {
        setLayout(null);

        Thread t =new Thread(this);
        t.start();
        timer =new Timer(GSP,this);
        timer.start();
        init();
        addMouseListener(this);
        RecordThread rt=new RecordThread(this);
        rt.start();
        File f;
        if(IsTest){
            f=new File("C:\\Users\\86158\\Desktop\\use\\NA\\record.txt");
        }
        else{
            f=new File("record.txt");
        }
        FileOutputStream fos=new FileOutputStream(f);
        pw=new PrintWriter(fos);
    }

    public void init(){
        General[50][50]=new Cell(Z,0,Probability,AddNum,Life,Mature,Aging);
    }

    @Override
    public void paint(Graphics gc) {
        if(IB ==null){
            IB =createImage(this.getSize().width,this.getSize().height);
            GB = IB.getGraphics();
        }
        GB.setColor(getBackground());
        GB.fillRect(0,0,this.getSize().width,this.getSize().height);
        Image s,t,u,v,w,xx,yy,z,a,b,c,d,e,f,g,h,i,j,k,l;
        if(IsTest){
            s =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-8.jpg");
            t =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-7.jpg");
            u =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-6.jpg");
            v =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-5.jpg");
            w =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-4.jpg");
            xx =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-3.jpg");
            yy =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-2.jpg");
            z =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\-1.jpg");
            a =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\0.jpg");
            b =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\1.jpg");
            c =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\2.jpg");
            d =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\3.jpg");
            e =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\4.jpg");
            f =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\5.jpg");
            g =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\6.jpg");
            h =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\7.jpg");
            i =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\8.jpg");
            j =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\9.jpg");
            k =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\10.jpg");
            l =getToolkit().getImage("C:\\Users\\86158\\Desktop\\use\\NA\\11.jpg");
        }
        else{
            s =getToolkit().getImage("-8.jpg");
            t =getToolkit().getImage("-7.jpg");
            u =getToolkit().getImage("-6.jpg");
            v =getToolkit().getImage("-5.jpg");
            w =getToolkit().getImage("-4.jpg");
            xx =getToolkit().getImage("-3.jpg");
            yy =getToolkit().getImage("-2.jpg");
            z =getToolkit().getImage("-1.jpg");
            a =getToolkit().getImage("0.jpg");
            b =getToolkit().getImage("1.jpg");
            c =getToolkit().getImage("2.jpg");
            d =getToolkit().getImage("3.jpg");
            e =getToolkit().getImage("4.jpg");
            f =getToolkit().getImage("5.jpg");
            g =getToolkit().getImage("6.jpg");
            h =getToolkit().getImage("7.jpg");
            i =getToolkit().getImage("8.jpg");
            j =getToolkit().getImage("9.jpg");
            k =getToolkit().getImage("10.jpg");
            l =getToolkit().getImage("11.jpg");
        }
        for(int y=0;y<=99;y++){
            for(int x=0;x<=99;x++){
                if(General[y][x]!=null){
                    if(General[y][x].Ability/10==0){GB.drawImage(l,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==1){GB.drawImage(k,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==2){GB.drawImage(j,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==3){GB.drawImage(i,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==4){GB.drawImage(h,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==5){GB.drawImage(g,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==6){GB.drawImage(f,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==7){GB.drawImage(e,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==8){GB.drawImage(d,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==9){GB.drawImage(c,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==10){GB.drawImage(b,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==11){GB.drawImage(a,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==12){GB.drawImage(z,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==13){GB.drawImage(yy,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==14){GB.drawImage(xx,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==15){GB.drawImage(w,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==16){GB.drawImage(v,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==17){GB.drawImage(u,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==18){GB.drawImage(t,x*10,y*10,this);}
                    else if(General[y][x].Ability/10==19){GB.drawImage(s,x*10,y*10,this);}
            }   }
        }
        GB.setColor(Color.black);
        GB.drawRect(0,0,1000,1000);

        gc.drawImage(IB,0,0,this);
    }

    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(cp);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(State){repaint();}
        }
    }

    public void Next(){
        for(int i=0;i<General.length;i++){
            for(int j=0;j<General[0].length;j++){
                if(General[i][j]!=null){
                    deal(i,j);
                }
            }
        }
        General=Ready;
        Ready=new Cell[sizeY][sizeX];
        if(Subtract){
            Subtract=false;
            General[Y][X]=new Cell(Z,0,Probability,AddNum,Life,Mature,Aging);
        }
    }

    public void deal(int i,int j){
        //随机1%死亡
        if(RD.nextInt(100)>0) {
            //如果目标年龄小于寿命,受到伤害小于3倍成熟年龄,将可能依旧存活
            if (General[i][j].Age < General[i][j].Life && General[i][j].Hurt < 3 * General[i][j].Mature) {
                //获取周围8位置空缺状态
                int t = check(i, j);
                //如果目标年龄大于成熟年龄,并且小于衰老年龄,并且有分裂能力,那么检查周围是否有空缺位置
                if (General[i][j].Age >= General[i][j].Mature && General[i][j].Age < General[i][j].Aging && General[i][j].Ability > 0) {
                    //如果周围有空缺位置,那么分裂
                    if (t != 0) {
                        Division(i, j, t);
                    }
                    //如果没有空缺位置,那么受到伤害,年龄加一
                    else {
                        Ready[i][j] = new Cell(General[i][j], true);
                    }
                } else {
                    //如果已经成熟没有衰老但是不能分裂,那么检查空缺位置
                    if (General[i][j].Ability <= 0) {
                        //如果无空缺,受到1伤害
                        if (t == 0) {
                            Ready[i][j] = new Cell(General[i][j], true);
                        } else {
                            Ready[i][j] = new Cell(General[i][j], false);
                        }
                    }
                    //如果未成熟或者已经衰老,那么检查空缺位置
                    else {
                        //已经衰老,那么检查空缺位置
                        if (General[i][j].Age >= General[i][j].Aging) {
                            if (General[i][j].Hurt < General[i][j].Mature) {
                                //如果无空缺,受到1伤害
                                if (t == 0) {
                                    Ready[i][j] = new Cell(General[i][j], true);
                                } else {
                                    Ready[i][j] = new Cell(General[i][j], false);
                                }
                            }
                        }
                        else {
                            //未成熟,那么检查空缺位置
                            if (General[i][j].Hurt <= General[i][j].Age) {
                                //如果无空缺,受到1伤害
                                if (t == 0) {
                                    Ready[i][j] = new Cell(General[i][j], true);
                                } else {
                                    Ready[i][j] = new Cell(General[i][j], false);
                                }
                            }
                        }
                    }
                }
            }
        }
    }

    public int check(int i,int j){
        if(j-1>=0&&General[i][j-1]==null){
            return 1;
        }
        if(j+1<sizeX&&General[i][j+1]==null){
            return 2;
        }
        if(i-1>=0&&General[i-1][j]==null){
            return 3;
        }
        if(i+1<sizeY&&General[i+1][j]==null){
            return 4;
        }
        if(j-1>=0&&i-1>=0&&General[i-1][j-1]==null){
            return 5;
        }
        if(j+1<sizeX&&i-1>=0&&General[i-1][j+1]==null){
            return 6;
        }
        if(j-1>=0&&i+1<sizeY&&General[i+1][j-1]==null){
            return 7;
        }
        if(j+1<sizeX&&i+1<sizeY&&General[i+1][j+1]==null){
            return 8;
        }
        return 0;
    }

    public void Division(int i,int j,int t){
        if(t==1){
            Ready[i][j-1]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==2){
            Ready[i][j+1]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==3){
            Ready[i-1][j]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==4){
            Ready[i+1][j]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==5){
            Ready[i-1][j-1]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==6){
            Ready[i-1][j+1]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==7){
            Ready[i+1][j-1]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
        else if(t==8){
            Ready[i+1][j+1]=new Cell(General[i][j]);
            Ready[i][j]=new Cell(General[i][j]);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(State) {
            Next();
        }
    }

    public SendChanges getInterface(){
        return this;
    }

    @Override
    public void Setting(int Life, int Mature, int Aging,int GSP,int FPS) {
        this.Life=Life;
        this.Mature=Mature;
        this.Aging=Aging;
        this.GSP=GSP;
        this.FPS=FPS;
        this.cp=1000/this.FPS;
        timer.stop();
        timer=new Timer(GSP,this);
        timer.start();
    }

    @Override
    public void Restart() {
        RecordNum=0;
        RecordTemp="";
        timer.stop();
        General=new Cell[sizeY][sizeX];
        General=new Cell[sizeY][sizeX];
        init();
        timer.restart();
    }

    @Override
    public void SetPause() {
        State=!State;
    }

    @Override
    public void ReduceEntropy(int z,int p,int n) {
        this.Z=z;
        this.Probability=p;
        this.AddNum=n;
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        if (e.getButton() == MouseEvent.BUTTON1) {
            int x=e.getX();
            int y=e.getY();
            X=x/10;
            Y=y/10;
            Subtract=true;
        }
    }

    @Override
    public void mousePressed(MouseEvent e) {

    }

    @Override
    public void mouseReleased(MouseEvent e) {

    }

    @Override
    public void mouseEntered(MouseEvent e) {

    }

    @Override
    public void mouseExited(MouseEvent e) {

    }

    @Override
    public void Do(){
        RecordNum++;
        int p=0,add=0,life=0,mature=0,aging=0,ability=0,s=0;
        Cell [][]t=General;
        for (Cell[] cells : t) {
            for (int j = 0; j < t[0].length; j++) {
                if (cells[j] != null) {
                    p = p + cells[j].Probability;
                    add = add + cells[j].AddNum;
                    life = life + cells[j].Life;
                    mature = mature + cells[j].Mature;
                    aging = aging + cells[j].Aging;
                    ability = ability + cells[j].Ability;
                    s++;
                }
            }
        }
        if(s!=0){
            CPanel.DoChanges(p/s,add/s,life/s,mature/s,aging/s,ability/s);
            RecordTemp=RecordTemp+p/s+"  "+add/s+"  "+life/s+"  "+mature/s+"  "+aging/s+"  "+ability/s+"\n";
        }
        if(RecordNum>=100){
            pw.append(RecordTemp);
            pw.flush();
            RecordTemp="";
            RecordNum=0;
        }
    }
}

class Cell{
    int Life;
    int Mature;
    int Aging;
    int AddNum;
    int Probability;
    int Age;
    int Ability;
    int Hurt;
    static Random rd=new Random();

    Cell(Cell Last){
        this.Age=0;
        int s=rd.nextInt(1000000);

        if(s>Last.Probability-1){
            this.Ability=Last.Ability-1;
            this.AddNum=Last.AddNum;
            this.Probability=Last.Probability;
            this.Life=Last.Life;
            this.Mature=Last.Mature;
            this.Aging=Last.Aging;
            this.Hurt=0;
        }
        else {
            this.AddNum=Last.AddNum;
            this.Probability=Last.Probability;
            this.Life=Last.Life;
            this.Mature=Last.Mature;
            this.Aging=Last.Aging;
            this.Hurt=0;
            switch(s%10){
                case 0:this.AddNum-=10;break;
                case 1:this.AddNum+=10;break;
                case 2:this.Probability-=1;break;
                case 3:this.Probability+=1;break;
                case 4:this.Life-=1;break;
                case 5:this.Life+=1;break;
                case 6:this.Mature-=1;break;
                case 7:this.Mature+=1;break;
                case 8:this.Aging-=1;break;
                default:this.Aging+=1;
            }
            this.Ability = Math.min(Last.Ability + Last.AddNum, 199);
        }
    }

    Cell(Cell last,boolean k){
        this.Age=last.Age+1;
        this.Ability=last.Ability;
        this.AddNum= last.AddNum;
        this.Probability= last.Probability;
        this.Life=last.Life;
        this.Mature=last.Mature;
        this.Aging=last.Aging;
        if(k){Hurt=last.Hurt+1;}
        else{Hurt= last.Hurt;}
    }

    Cell(int ability,int age,int p,int n,int Life,int Mature,int Aging){
        this.Ability=ability;
        this.Age=age;
        this.Probability=p;
        this.AddNum=n;
        this.Life=Life;
        this.Mature=Mature;
        this.Aging=Aging;
        this.Hurt=0;
    }
}

class RecordThread extends Thread{
    ThreadInterface ti;
    public RecordThread(ThreadInterface ti){
        this.ti=ti;
    }
    @Override
    public void run() {
        while(true){
            try {
                ti.Do();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
interface ThreadInterface{
    void Do() throws FileNotFoundException;
}

interface SendChanges{
    void Setting(int Life, int Mature, int Aging,int GSP,int FPS);
    void Restart();
    void SetPause();
    void ReduceEntropy(int z,int p,int n);
}

https://study.gengronglin.top/Source/Evolution.zip

由于网站采用自签名SSL证书开启https,所以可能提示证书不可信,请放心使用

已经发布到本人服务器上,供大家免费下载,学习

本项目仅供学习,交流,参考使用,请勿做它用!

如感兴趣请私信交流

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A3010367369

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值