2011-05-28 79 views
3

我的电路板能够正确检测出少于3个邻居的组并且杀死它们,但似乎没有检测到并生出3个邻居的细胞。生命分配游戏

有什么想法?

如果我没有提供足够的信息让我知道,我可以粘贴更多的代码,但我认为这是所有相关的部分。

非常感谢您提供的任何建议。

public boolean getCell(int row, int col) { 
    boolean state = board[row][col]; 
    int neighbors = 0; 
    for (int x = row-1; x <= row+1; x++) { 
     for (int y = col-1; y <= col+1; y++) { 
      // don't include this 
      if ((x != row || y != col) && x != -1 && y != -1 
      && x != NROWSCOLS && y != NROWSCOLS) { 
       if (board[x][y] == ALIVE){ 
        neighbors ++; 
       } 
      } 
     } 
    } 
    if (neighbors > 3 || neighbors < 2) 
     state = DEAD; 
    else if(neighbors == 3) 
     state = ALIVE; 
    return state; 
} 

这里是要求的lifeCycle方法。

/** Process one life cycle of the cellular automaton 
* 
*/ 
public void lifeCycle() { 
    for (int x = 0; x < NROWSCOLS ; x++) { 
     for (int y = 0; y < NROWSCOLS; y++) { 
      getCell(x,y); 
     } 
    } 

    generations ++; 
} 

我已经附上了LifeGUI作为参考,但是这个代码是提供的,而不是为了我而改变的。

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class LifeGUI extends JPanel { 
    // game instance variables 
    private Life board;  // game board 

    // GUI components 
    private JLabel generationsLived;   
    private JButton resetButton, cycleButton; // reset control and cycle control 
    private Cell[][] cells;   // board cells for display 

    /** Construct new Life game with a graphical user interface */ 
    public LifeGUI() { 
     // create and initialize game board and display representation 
     board = new Life(); 
     cells = new Cell[Life.NROWSCOLS][Life.NROWSCOLS]; 

     // set layout for game display 
     setLayout(new BorderLayout()); 

     // Create board cells and add to display 
     JPanel boardPanel = new JPanel(); 
     boardPanel.setLayout(new GridLayout(Life.NROWSCOLS, Life.NROWSCOLS)); 
     for (int row = 0; row < Life.NROWSCOLS; row++) { 
      for (int col = 0; col < Life.NROWSCOLS; col++) { 
       cells[row][col] = new Cell(Life.DEAD, row, col); 
       boardPanel.add(cells[row][col]); 
      } 
     } 
     add(boardPanel, BorderLayout.CENTER); 


     // Set up 2 buttons 
     // a reset button so it starts a new game when clicked 
     // a cycle button to tell the Life automaton to live one cycle 
     resetButton = new JButton("New Game"); 
     resetButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       board.newGame(); 
       updateDisplay(); 
      } 
     }); 

     cycleButton = new JButton("Live One Cycle"); 
     cycleButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
       board.lifeCycle(); 
       updateDisplay(); 
      } 
     }); 

     // Put the buttons and the generation count display on the screen 
     JPanel buttonPanel = new JPanel(); 
     buttonPanel.add(resetButton); 
     buttonPanel.add(cycleButton); 
     generationsLived = new JLabel("  Generations Lived: " , JLabel.RIGHT); 
     buttonPanel.add(generationsLived); 
     add(buttonPanel, BorderLayout.SOUTH); 

     // show initial display 
     updateDisplay(); 
    } 

    /** Update display to match game state. */ 
    public void updateDisplay() { 
     // update count display 
     generationsLived.setText("  Generations Lived: " + board.getGenerationCount()); 

     // update board display 
     for (int row = 0; row < Life.NROWSCOLS; row++) { 
      for (int col = 0; col < Life.NROWSCOLS; col++) { 
       cells[row][col].setState(board.getCell(row,col)); 
      } 
     } 
     repaint(); 
    } 

    /** Create new game and a window to display it */ 
    private static void test() { 
     JFrame f = new JFrame("The Game of Life");  // top-level window 
     LifeGUI l = new LifeGUI(); 
     f.getContentPane().add(l); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.setSize(600,600); 
     f.validate(); 
     f.setVisible(true); 
     f.toFront(); 
    } 

    public static void main(String[] args) { 
     // To support stand-alone application 
     //Schedule a job for the event-dispatching thread: 
     //creating and showing this application's GUI. 
     javax.swing.SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       LifeGUI.test(); 
      } 
     }); 
    } 
} 
+0

对于一个非常好的GoL的FPGA实现,请参阅: HTTP://golly.sourceforge。 net/ – Johan 2011-05-28 22:48:33

+0

顺便说一句,你的意思是说'用小于** 2 **的邻居来检测单元组并且杀死它们,2对吗? – Johan 2011-05-28 22:50:07

+0

我知道这是错误的,但贾斯汀是否有可能把你编写的所有代码放在游戏的实现中?我很想看看它!再次抱歉,我不知道如何/其他地方问这个问题。 – 2012-02-07 20:47:12

回答

2
public boolean getCell(int row, int col) { 
    boolean state = board[row][col]; 
    int neighbors = 0;//you are summing the alive neighbours 
     //keep var declaration outside the iteration over them 

    for (int x = Math.max(0,row-1); x < Math.min(row+2,NROWSCOLS); x++) { 
     for (int y = Math.max(0,col-1); y < Math.min(col+2,NROWSCOLS); y++) { 
      //using min and max to ensure x and y remain between 0 and NROWSCOLS 
      //so no IOBException 
       if (board[x][y] == ALIVE){ 
        neighbors ++; 

       } 
      } 
     } 
    } 
    if (neighbors > 3 || neighbors < 2)//only do the check when you are finished counting the alive neighbours 
     state = DEAD; 
    else if(neighbors == 3) 
     state = ALIVE; 
    return state; 
} 
+0

谢谢。我自己也刚刚得出一些非常相似的结论。现在,我的电路板能够正确检测到少于3个邻居的小区组,并将它们关闭,但似乎没有检测到并生出3个邻居的小区。 我会更新初始文章以反映更改。 – Justin 2011-05-28 20:47:17

+0

我们是否也可以看到Life.lifeCycle方法?我认为问题在那里 – 2011-05-28 20:51:06

+0

现在我将它添加到原来的,但是是的,目前肯定没有开发该方法。 – Justin 2011-05-28 20:53:57

1

检查你的循环是不正确的。

for (int x = row-1; x <= row; x++) 

它会一直走到board [row]索引处。这是出界的。其他循环同样的事情

+0

检查你的循环逻辑。这是错误的。检查你的计数。你是从 n-1开始到n + 1为什么? – 2011-05-28 20:08:41

1

请检查该

at Life.getCell(Life.java:63) 

的问题是在该行Life.java的63

我不知道这个问题是存在的,但检查了这行:

if (x != row || y != col && x != -1 && y != -1 
      && x != NROWSCOLS && y != NROWSCOLS) { 

因为没有在做你认为它是做的事情,因此请加上运算符优先级,请加上一些括号。

像这样

if ((x != row || y != col) && x != -1 && y != -1 
      && x != NROWSCOLS && y != NROWSCOLS) { 
1

的||没有添加perenthisis将不会按预期工作。

当前的代码将做到这一点:

if (x != row || (y != col && x != -1 && y != -1 && x != NROWSCOLS && y != NROWSCOLS)) 

您的概率希望这个

if ((x != row || y != col) && x != -1 && y != -1 && x != NROWSCOLS && y != NROWSCOLS

或本

if (x != row && y != col && x != -1 && y != -1 && x != NROWSCOLS && y != NROWSCOLS)