Моя игра жизни просто продолжает умирать все время

Я пытаюсь написать код для игры Конвея в жизнь, но он продолжает вымирать. Я не знаю, что я должен написать, поэтому вместо того, чтобы выполнять все вычисления, поскольку код будет продвигаться вперед, он должен просто сохранить то, что говорит код, а затем внести изменения. И чтобы уточнить, я не хочу, чтобы мой код принимал одно решение об одной ячейке и изменял ее, а затем переходил к следующей ячейке, но я хочу, чтобы он принимал решение, переходило к следующей ячейке, и в конце моего кода я хотите, чтобы он сразу изменил всю ячейку.

Это кнопка для создания мира:

 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;
}

}

Я был бы признателен за любую помощь, и если есть какие-то проблемы с моим вопросом, пожалуйста, просто спросите, и я попытаюсь объяснить по-другому.


person Tim Nielsen    schedule 30.05.2013    source источник
comment
Что происходит, когда вы компилируете и запускаете свой код? Чем это отличается от того, что вы хотите? Пожалуйста, приведите конкретный пример.   -  person Code-Apprentice    schedule 31.05.2013
comment
[OT]: Название вопроса Моя игра жизни продолжает умирать очень забавное :).   -  person Luiggi Mendoza    schedule 31.05.2013


Ответы (1)


Когда вы вычисляете свое следующее поколение, вы, кажется, пытаетесь обновить состояние ваших текущих ячеек сетки, другими словами, вы устанавливаете состояние ячеек в своем cirklar 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;
person Hovercraft Full Of Eels    schedule 30.05.2013
comment
Большое спасибо, это действительно помогло мне. - person Tim Nielsen; 02.06.2013