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