Как я могу подсчитать количество живых клеток в игре Жизни Джона Конвея, используя логический многомерный массив, операторы If и глобальный int? - PullRequest
0 голосов
/ 29 мая 2018

Я делаю «Игру жизни» Джона Конвея и использую 2 булевых 2D-массива в своей игре вместе с операторами «If», чтобы определить, какой следующий ход должен воспроизводиться для ячеек в моей игре, исходя из текущего хода и количествасоседи по каждой клетке.Первый логический 2D-массив называется текущим движением, и он отслеживает количество ячеек в сетке и их конкретное местоположение, отображая их как истинные, если в сетке, и ложь, если в этой конкретной лактации в сетке нет ячеек во втором логическом 2Dмассив с именем next move и операторы if определяют, каким должен быть следующий текущий ход, с помощью операторов if, определяющих, достаточно ли их соседей для формирования новой ячейки или останутся ли ячейки в том же месте и можно ли сформировать новую ячейку илиячейки остаются в том же месте, следующее движение становится истинным, делая текущее движение истинным для следующего поколения, и тот же процесс повторяется снова и снова.Мой вопрос заключается в том, как я могу манипулировать своим кодом для подсчета количества живых ячеек в моей игре, я добавил переменную intpopulation для подсчета количества ячеек в указанных точках, увеличивая значение при рождении ячейки и уменьшая при смерти ячейки, ноЯ знаю, что сделал это неправильно, потому что он не отображает правильное количество ячеек, и я не могу понять мою проблему.Также текущее движение становится истинным в этом конкретном месте, если щелкнуть мышью по квадрату сетки на сетке, чтобы текущее движение стало истинным в этом конкретном месте.Я отображаю значение intpopulation в поле jtext, и есть jbutton, который сбрасывает значение intpopulation и избавляется от всех ячеек в сетке, создавая новый текущий 2d массив.Может кто-нибудь, пожалуйста, помогите мне решить эту проблему.

public class GameOfLife extends javax.swing.JFrame {
    int timelength = 100;
    int wid = 500, hei = 250;
    boolean[][] currentMove = new boolean[hei][wid], nextMove = new boolean[hei][wid];
    boolean play;
    public static int intpopulation = 0;
   Image offScrImg;
   Graphics offScrGraph;
  public static int intGeneration = 0;
public GameOfLife() {
        initComponents();
        offScrImg = createImage(jPanel2.getWidth(), jPanel2.getHeight());
        offScrGraph = offScrImg.getGraphics();
        Timer time = new Timer();
        TimerTask task = new TimerTask(){
          public void run() {
              if(play == true){
                  intGeneration++;
              for(int i = 0; i < hei; i++){
                  for(int j = 0; j < wid; j++){
                      nextMove[i][j] = decide(i,j);
                  }   
                  }
               for(int i = 0; i < hei; i++){
                  for (int j = 0; j < wid; j++){
                  currentMove[i][j] = nextMove[i][j];
                  }   
                  }
               repain();
                  }
          }
            };
        time.scheduleAtFixedRate(task, 0,timelength);
        repain();
    }
private boolean decide(int i, int j){
    int neighbors = 0; 
    if(j > 0){
        if(currentMove[i][j-1]) neighbors++;
        if(i>0) if(currentMove[i-1][j-1]) neighbors++;
        if(i<hei-1) if(currentMove[i+1][j-1]) neighbors++;
    }
    if(j < wid - 1){
        if(currentMove[i][j+1]) neighbors++;
        if(i>0) if(currentMove[i-1][j+1]) neighbors++;
        if(i<hei-1) if(currentMove[i+1][j+1]) neighbors++;
    }
     if(i>0) if(currentMove[i-1][j]) neighbors++;
     if(i<hei-1) if(currentMove[i+1][j]) neighbors++;
     if(currentMove[i][j] && neighbors < 2) intpopulation--;
     if(neighbors > 3) intpopulation--;
     if(neighbors == 3) return true; intpopulation++;
     if(currentMove[i][j] && neighbors == 2) return true;intpopulation++;
     return false;
     }
private void repain(){
    offScrGraph.setColor(Color.BLACK);
    offScrGraph.fillRect(0, 0, jPanel2.getWidth(), jPanel2.getHeight());
    for (int i = 0; i < hei; i++){
        for (int j = 0; j < wid; j++){
            if(currentMove[i][j])
            {
                offScrGraph.setColor(Color.getHSBColor((float) Math.random(), .8f, .8f));
            int x  = j * jPanel2.getWidth()/wid;
            int y = i * jPanel2.getHeight()/hei;
         offScrGraph.fillRect(x, y, jPanel2.getWidth()/wid, jPanel2.getHeight()/hei);
             }
    }
    }
    offScrGraph.setColor(Color.BLACK);
    for (int i = 1; i < hei; i++){
        int y = i * jPanel2.getHeight()/hei;
        offScrGraph.drawLine(0, y, jPanel2.getWidth(), y);
    }
    for (int j = 1; j < wid; j++){
        int x  = j * jPanel2.getWidth()/wid;
        offScrGraph.drawLine(x, 0, x, jPanel2.getHeight());
    }
     jPanel2.getGraphics().drawImage(offScrImg, 0, 0, jPanel2);
}
private void jPanel2MouseClicked(java.awt.event.MouseEvent evt) {                                     
        int j = wid * evt.getX() / jPanel2.getWidth();
        int i = hei * evt.getY() / jPanel2.getHeight();
        currentMove[i][j] = !currentMove[i][j];
        intpopulation++;
        repain();
    }                                    
  private void jPanel2MouseDragged(java.awt.event.MouseEvent evt) {                                     
        int j = wid * evt.getX() / jPanel2.getWidth();
        int i = hei * evt.getY() / jPanel2.getHeight();
        if(SwingUtilities.isLeftMouseButton(evt)){
        currentMove[i][j] = true;
        intpopulation++;
        }else currentMove[i][j] = false;
    }       
private void jFormattedTextField2ActionPerformed(java.awt.event.ActionEvent evt) {                                                     
        if(play)
        {
        String myString = Integer.toString(intpopulation);
        jFormattedTextField2.setText( "population: " + myString);
        }
    }               
private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        currentMove = new boolean[hei][wid];
        intGeneration = 0;
        intpopulation = 0;
         jFormattedTextField1.setText( "Generation: " + intGeneration );
         jFormattedTextField2.setText( "population: " + intpopulation );
        repain();
    }         

1 Ответ

0 голосов
/ 30 мая 2018

Нашел решение моего вопроса

private boolean decide(int i, int j){
    int neighbors = 0; 
    if(j > 0){
        if(currentMove[i][j-1]) neighbors++;
        if(i>0) if(currentMove[i-1][j-1]) neighbors++;
        if(i<hei-1) if(currentMove[i+1][j-1]) neighbors++;
    }
    if(j < wid - 1){
        if(currentMove[i][j+1]) neighbors++;
        if(i>0) if(currentMove[i-1][j+1]) neighbors++;
        if(i<hei-1) if(currentMove[i+1][j+1]) neighbors++;
    }
     if(i>0) if(currentMove[i-1][j]) neighbors++;
     if(i<hei-1) if(currentMove[i+1][j]) neighbors++;
     if(currentMove[i][j]&& neighbors < 2)intpopulation--;
     if(currentMove[i][j]&& neighbors > 3)intpopulation--;
     if(currentMove[i][j] && neighbors == 3)intpopulation--;
     if(neighbors == 3) intpopulation++;
  jLabel5.setText("Population: " + Integer.toString(intpopulation));
     if(neighbors == 3) return true;
     if(currentMove[i][j] && neighbors == 2)return true;
     return false;
     }
...