我的生命游戏一直在消失

时间:2013-05-30 21:13:02

标签: java swing conways-game-of-life cellular-automata

我正在尝试将这些代码写入康威的生活游戏,但它一直在消失。我不知道我应该写什么,所以不要随着代码的进行而进行所有计算,它应该只存储代码所说的内容,然后进行更改。并澄清我不希望我的代码做出关于一个单元格的一个决定并改变它然后继续下一个单元格但我希望它做出决定转移到下一个单元格并在我的代码结束时我希望它一次改变所有的细胞。

这是创造世界的按钮:

 private void btnSVActionPerformed(java.awt.event.ActionEvent evt) {                                      
    // TODO add your handling code here:

     for (rad = 0; rad < 15; rad++){
        for (kolumn = 0; kolumn < 15; kolumn++){
            int x = 10 + 20 * kolumn;
            int y = 10 + 20 * rad;
            int diameter = 20;
            int liv = (int) (Math.random()+0.5);
            Cirkel cirkel = new Cirkel(x, y, diameter, liv);
            cirklar.add(cirkel);
        }
    }

    repaint();
}                                     

这是制作下一代的按钮:

 private void btnNGActionPerformed(java.awt.event.ActionEvent evt) {                                      
    // TODO add your handling code here:

    for (i=0; i<=225; i++){
 rad=(i/15+1);
 kolumn=(i%15+1);


 if (rad==1 && kolumn==1) {

    int levandeGrannarH1=cirklar.get(i+1).kollaLevande()
                         +cirklar.get(i+15).kollaLevande()
                         +cirklar.get(i+16).kollaLevande();
    if ((levandeGrannarH1!=2 && levandeGrannarH1!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarH1==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad==1 && kolumn==15 ) {

    int levandeGrannarH2=cirklar.get(i-1).kollaLevande()+cirklar.get(i+14).kollaLevande()+cirklar.get(i+15).kollaLevande();
    if ((levandeGrannarH2!=2 && levandeGrannarH2!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarH2==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad==15 && kolumn==1 ) {

    int levandeGrannarH3=cirklar.get(i+1).kollaLevande()+cirklar.get(i-14).kollaLevande()+cirklar.get(i-15).kollaLevande();
    if ((levandeGrannarH3!=2 && levandeGrannarH3!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarH3==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad==15 && kolumn==15 ) {

    int levandeGrannarH4=cirklar.get(i-1).kollaLevande()+cirklar.get(i-15).kollaLevande()+cirklar.get(i-16).kollaLevande();
    if ((levandeGrannarH4!=2 && levandeGrannarH4!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarH4==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad==1 && kolumn>1  && kolumn<15) {

    int levandeGrannarR1=cirklar.get(i-1).kollaLevande()+cirklar.get(i+1).kollaLevande()+cirklar.get(i+14).kollaLevande()+cirklar.get(i+15).kollaLevande()+cirklar.get(i+16).kollaLevande();
    if ((levandeGrannarR1!=2 && levandeGrannarR1!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarR1==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad>1 && kolumn==15 && rad<15) {


    int levandeGrannarR2=cirklar.get(i-15).kollaLevande()+cirklar.get(i-16).kollaLevande()+cirklar.get(i-1).kollaLevande()+cirklar.get(i+14).kollaLevande()+cirklar.get(i+15).kollaLevande();
    if ((levandeGrannarR2!=2 && levandeGrannarR2!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarR2==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad==15 && kolumn>1 && kolumn<15) {

    int levandeGrannarR3=cirklar.get(i-1).kollaLevande()+cirklar.get(i+1).kollaLevande()+cirklar.get(i-14).kollaLevande()+cirklar.get(i-15).kollaLevande()+cirklar.get(i-16).kollaLevande();
    if ((levandeGrannarR3!=2 && levandeGrannarR3!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarR3==3) && cirklar.get(i).kollaLevande()==0 )
         cirklar.get(i).gorLevande();

 }


 if (rad>1 && kolumn==1 && rad<15 ) {

    int levandeGrannarR4=cirklar.get(i-15).kollaLevande()+cirklar.get(i-14).kollaLevande()+cirklar.get(i+1).kollaLevande()+cirklar.get(i+15).kollaLevande()+cirklar.get(i+16).kollaLevande();
    if ((levandeGrannarR4!=2 && levandeGrannarR4!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannarR4==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }


 if (rad>1 && kolumn>1 && rad<15 && kolumn<15) {

    int levandeGrannar = cirklar.get(i-16).kollaLevande()+cirklar.get(i-15).kollaLevande()+cirklar.get(i-14).kollaLevande()+cirklar.get(i-1).kollaLevande()+cirklar.get(i+1).kollaLevande()+cirklar.get(i+14).kollaLevande()+cirklar.get(i+15).kollaLevande()+cirklar.get(i+16).kollaLevande();
    if ((levandeGrannar!=2 && levandeGrannar!=4) && cirklar.get(i).kollaLevande()==1)
        cirklar.get(i).gorDod();
    else if ((levandeGrannar==3) && cirklar.get(i).kollaLevande()==0 )
        cirklar.get(i).gorLevande();

 }

      repaint();   

    }

} 

这是对细胞应该是什么样子以及它们是否活着的解释。

 public class Cirkel {
  private int x = 0;
  private int y = 0;
  private int diameter = 10;
  private int liv = 1;

public Cirkel(int x, int y, int diameter, int liv){
    this.x = x;
    this.y = y;
    this.diameter = diameter;
    this.liv = liv;

}

public void rita(Graphics g){
    if (this.liv==1) 
        g.setColor(Color.green);
    else
        g.setColor(Color.white);

        g.fillOval(this.x, this.y, this.diameter, this.diameter);
    }
public int kollaLevande(){
    return this.liv;
}

public void gorLevande(){
    this.liv=1;
}

public void gorDod(){
    this.liv=0;
}

}

我会感激任何帮助,如果我的问题有问题,请问我,我会尝试用另一种方式解释。

1 个答案:

答案 0 :(得分:5)

当您计算下一代时,您似乎正在尝试更新当前网格单元的状态,换句话说,您正在设置圆环ArrayList中单元格的状态,仍然使用cirklar来计算下一代细胞的状态。但是在检查整个网格之前执行此操作将影响下游网格单元邻居的计算。事实上,你已经知道这是一个问题,因为你说:

  

并澄清我不希望我的代码做出关于一个单元格的一个决定并对其进行更改然后转移到下一个单元格但是我希望它做出决定转移到下一个单元格并且最后我的代码我想让它一次更改所有单元格。

要解决此问题,您需要创建网格,然后在进行计算时,将新网格单元格的状态设置为无效或有效。然后,当您完成整个网格的迭代时,将新网格换成旧网格。

另请注意,您的代码中有许多不必要的冗余,我认为您这样做是为了处理网格的边缘。通过稍微考虑一下编码,可以大大简化并大大简化。做类似的事情:

// pseudo-code:
SomeArray newGrid = new SomeArray....

for (int currentRow = 0; currentRow <= NUMBER_OF_ROWS; currentRow++) {
  for (int currentCol = 0; currentCol <= NUMBER_OF_COLS; currentCol++) {  
    int minumumRow = Math.max(currentRow - 1, 0); // *** check for edge!!!
    int maximumRow = Math.min(currentRow + 1, NUMBER_OF_ROWS); // *** check for edge!!!
    int minumumCol = Math.max(currentCol - 1, 0); // *** check for edge!!!
    int maximumCol = Math.MIN(currentCol + 1, NUMBER_OF_COLS); // *** check for edge!!!

    int neighborCount = 0;
    for (row = minumumRow; row <= maximumRow; row++) {
      for (col = minumumCol; col <= maximumCol; col++) {
        if (row != currentRow || col != currentCol) {
          // check if neighbors alive and increment neighborCount
        }
      }
    }

    // use neighbor count to set the state of the grid cell in a **new** grid
    // silly pseudo-code:
    newGrid.getCell(currentRow, currentCol).setState(....)
  }
}

// now you've checked all the grid and set the new grid states. 
// Time to swap grids
currentGrid = newGrid;