我在很早很早就思考,生命是什么,生命怎样出现,生命是否是进化至现在?
世界总是熵增的,为什么会出现生命这样的事物来抵抗熵增呢?
到了大学,接触了计算机,使得我能够借助计算机去解决这样一些问题,尝试用计算机来做出一些合理的解释
我的想法是,设定游戏规则,在平面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,所以可能提示证书不可信,请放心使用
已经发布到本人服务器上,供大家免费下载,学习
本项目仅供学习,交流,参考使用,请勿做它用!
如感兴趣请私信交流
|