Java 爪哇的生活游戏,人口过剩但可以';我不明白为什么

Java 爪哇的生活游戏,人口过剩但可以';我不明白为什么,java,conways-game-of-life,Java,Conways Game Of Life,这是家庭作业。我在底部包含了相关代码 问题: 在试图允许用户调整网格大小的过程中,现在绘制的网格人口严重过剩 屏幕截图: “人口过剩”—— “理想人口”— 背景: 这是康威人生游戏的一个版本。在课堂上,我们完成了3个类:处理游戏逻辑的LifeState、包含游戏的JPanel LifePanel和创建JFrame并添加LifePanel的驱动程序。任务是将其开发成具有各种需求的完整GUI应用程序。我的解决方案是扩展JFrame并在该类中完成大部分工作 在actionlistener外部初始化L

这是家庭作业。我在底部包含了相关代码

问题: 在试图允许用户调整网格大小的过程中,现在绘制的网格人口严重过剩

屏幕截图: “人口过剩”—— “理想人口”—

背景: 这是康威人生游戏的一个版本。在课堂上,我们完成了3个类:处理游戏逻辑的LifeState、包含游戏的JPanel LifePanel和创建JFrame并添加LifePanel的驱动程序。任务是将其开发成具有各种需求的完整GUI应用程序。我的解决方案是扩展JFrame并在该类中完成大部分工作

在actionlistener外部初始化LifePanel会产生正常的填充,但在actionlistener中初始化LifePanel会“过度填充”网格

问题:为什么人口过剩

救生衣班

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

public class LifePanel extends JPanel implements MouseListener
{
private int row;
private int col;
private int scale;
private LifeState life;
boolean state;
boolean wrap;
int delay;
Timer timer;

public LifePanel(int r, int c, int s, int d)
{
    row = r;
    col = c;
    scale = s;
    delay = d;
    life = new LifeState(row,col);
    Random rnd = new Random();
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
            life.setCell(i,j,rnd.nextBoolean());
    timer = new Timer(delay, new UpdateListener());
    setPreferredSize( new Dimension(scale*row, scale*col));
    addMouseListener(this);
    timer.start();
}

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    for(int i=0;i<row;i++)
        for(int j=0;j<col;j++)
            if(life.getCell(i,j))
                g.fillRect(scale*i,scale*j,scale,scale);
}

public int getRow() {
    return row;
}

public void setRow(int row) {
    this.row = row;
}

public int getCol() {
    return col;
}

public void setCol(int col) {
    this.col = col;
}

public int getScale() {
    return scale;
}

public void setScale(int scale) {
    this.scale = scale;
}

public int getDelay() {
    return delay;

}

public void setDelay(int delay) {
    this.delay = delay;
    timer.setDelay(delay);
}

public void pauseGame(){
    timer.stop();
}
public void playGame(){
    timer.restart();
}
public void setInitState(boolean set){
    state = set;
    if(state){
      timer.stop();
    }
}
public void setWrap(boolean set){
    wrap = set;
    if(wrap){
    //implement allow wrap
    }
}

@Override
public void mouseClicked(MouseEvent e) {
  if(state){
    int x=e.getX(); 
    int y=e.getY();
    boolean isFilled;
    isFilled = life.getCell(x,y);
    //Test pop-up
    JOptionPane.showMessageDialog(this, x+","+y+"\n"+life.getCell(x,y));
    if(isFilled){
      life.setCell(x,y,false);
    }else{
      life.setCell(x,y,true);
    }
    repaint();
  }
}


@Override
public void mousePressed(MouseEvent e) {}

@Override
public void mouseReleased(MouseEvent e) {}

@Override
public void mouseEntered(MouseEvent e) {}

@Override
public void mouseExited(MouseEvent e) {}

private class UpdateListener implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        life.iterate();
        repaint();
    }
}


}
感谢阅读本文,并提前向您提供任何帮助/建议


编辑:添加屏幕截图和优化的问题。

基于您如何初始化
LifePanel

Random rnd = new Random();
for(int i=0;i<row;i++)
    for(int j=0;j<col;j++)
        life.setCell(i,j,rnd.nextBoolean());
Random rnd=new Random();

对于(int i=0;对于StackOverflow问题来说,这是太多的代码了。你是否在IDE调试器中运行了它,并在调整网格大小时跟踪了代码?这里没有人会花几个小时阅读和理解你的代码来调试它。我建议你在发布到这里之前缩小问题的范围。如果没有其他问题,那么mines population是唯一的值代码,所有的Swing等都应该与实际发生的事情完全隔离。
LifePanel
constructor使用
Random.nextBoolean()
初始化每个单元格。因此,网格中大约一半的单元格将处于“活动”状态,这通常不是一个有用的起始状态。请澄清“人口过剩”的含义。我担心它太复杂了,在课堂上我们从来没有调试过,甚至没有看到任何调试过的东西。我试着阅读它,但我的尝试并没有真正帮助我。如果你碰巧有一个资源为新程序员提供一些调试教育,我将不胜感激。如果你使用Eclipse,你将需要设置一个初始断点然后在带有绿色bug的图标上使用“Debug as…”选项运行应用程序。我的解决方案是在重新绘制以匹配所需的总体之前迭代增长。我仍然无法确定在构造函数中初始化时为什么会出现“所需的增长”和“过度增长”(根据我填充网格的方式,不是过度填充)发生在actionlistener中。代码仍然是相同的,但在构造函数中初始化时,不知何故它会迭代大约150次。
Random rnd = new Random();
for(int i=0;i<row;i++)
    for(int j=0;j<col;j++)
        life.setCell(i,j,rnd.nextBoolean());