卡在Java Swing项目上:Conway's Game of Life



我已经为此工作了大约四个小时。我已经掌握了所有逻辑,计时器工作,键盘和鼠标输入工作,但是没有调用paintComponent方法来绘制更新!我对这类实时应用程序没有经验,所以可能是导致它不起作用的原因。任何帮助将不胜感激!

游戏主.java

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Color;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
public class gamemain extends JPanel {
public static boolean paused = true;
public static JFrame gui;
public static JPanel panel;
static int[][] worldsize = new int[1000][1000];
static world playspace = new world(worldsize);
static Timer timer = new Timer(250, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("Debug: timer ticked");
        playspace.updateWorldState();
        panel.repaint();
    }
});
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    System.out.println("Hit painter");
    g.drawString("Test", 50, 50);
    for(int i = 0; i < 999; i++) {
        for(int j = 0; j < 999; i++) {
            if(playspace.getWorldStateAt(i, j) == 1) {
                g.drawRect(i, j, 1, 1);
            }
        }
    }
}
public static class listener implements KeyListener {
    @Override
    public void keyTyped(KeyEvent e) {
        if(e.getKeyChar() == ' ') {
            if(paused) {
                timer.start();
                paused = false;
                System.out.println("Unpaused");
            }
            else {
                timer.stop();
                paused = true;
                System.out.println("Paused");
            }
        }
    }
    @Override
    public void keyPressed(KeyEvent e) {
        // unused
    }
    @Override
    public void keyReleased(KeyEvent e) {
        // unused
    }
}
public static class mouselistener implements MouseListener {
    @Override
    public void mouseClicked(MouseEvent e) {
        int x, y;
        x = e.getX();
        y = e.getY();
        playspace.placeCell(x, y);
    }
    @Override
    public void mousePressed(MouseEvent e) {
        // unused
    }
    @Override
    public void mouseReleased(MouseEvent e) {
        // unused
    }
    @Override
    public void mouseEntered(MouseEvent e) {
        // unused
    }
    @Override
    public void mouseExited(MouseEvent e) {
        // unused
    }
}
public static void main(String[] args) throws InterruptedException {
    SwingUtilities.invokeLater(new Runnable() {
    public void run() {
    gui = new JFrame();
    gui.setTitle("Game of Life");
    gui.setSize(1000, 1000);
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    panel = new JPanel();
    panel.addKeyListener(new listener());
    panel.addMouseListener(new mouselistener());
    panel.setBackground(Color.WHITE);
    panel.setOpaque(true);
    Container pane = gui.getContentPane();
    pane.add(panel);
    gui.setVisible(true);
    panel.requestFocus();
        }
    });

}

}

世界.java

public class world {
int[][] worldstate = new int[1000][1000];
public world(int[][] world) {
    for(int i = 0; i < 1000; i++) { // make all cells dead
        for(int j = 0; j < 1000; j++) {
            world[i][j] = 0;
        }
    }
    this.worldstate = world;
}
public int getWorldStateAt(int i, int j) {
    return this.worldstate[i][j];
}
public void placeCell(int x, int y) {
    this.worldstate[x][y] = 1;
}
public void updateWorldState() {
    int n1,n2,n3,n4,n5,n6,n7,n8,total; // all possible buddies of a cell
    for(int i = 1; i < 999; i++) { // go to each cell
        for(int j = 1; j < 999; j++) {
            n1 = this.worldstate[i-1][j];
            n2 = this.worldstate[i][j-1];
            n3 = this.worldstate[i-1][j-1];
            n4 = this.worldstate[i+1][j];
            n5 = this.worldstate[i][j+1];
            n6 = this.worldstate[i+1][j+1];
            n7 = this.worldstate[i+1][j-1];
            n8 = this.worldstate[i-1][j+1];
            total = n1 + n2 + n3 + n4 + n5 + n6 + n7 + n8; // add them up
            if(total < 2 && (this.worldstate[i][j] == 1)) { // rule 1
                this.worldstate[i][j] = 0;
            }
            if(total > 3 && (this.worldstate[i][j] == 1)) { //rule 3
                this.worldstate[i][j] = 0;
            }
            if((total == 3) && (this.worldstate[i][j] == 0)) { //rule 4
                this.worldstate[i][j] = 1;
            }
        }
    }
}
}

paintComponent从未被调用过,因为gamemain实际上从未添加到任何能够显示的内容中。

您的第一个任务是消除对static的依赖

也许更像是...

public class gamemain extends JPanel {
    public boolean paused = true;
    int[][] worldsize = new int[1000][1000];
    world playspace = new world(worldsize);
    Timer timer = new Timer(250, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            System.out.println("Debug: timer ticked");
            playspace.updateWorldState();
            repaint();
        }
    });
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        System.out.println("Hit painter");
        g.drawString("Test", 50, 50);
        for(int i = 0; i < 999; i++) {
            for(int j = 0; j < 999; i++) {
                if(playspace.getWorldStateAt(i, j) == 1) {
                    g.drawRect(i, j, 1, 1);
                }
            }
        }
    }
    //...
    public static void main(String[] args) throws InterruptedException {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JFrame gui = new JFrame();
                gui.setTitle("Game of Life");
                gui.setSize(1000, 1000);
                gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                gamemain panel = new gamemain();
                panel.addKeyListener(new listener());
                panel.addMouseListener(new mouselistener());
                panel.setBackground(Color.WHITE);
                panel.setOpaque(true);
                Container pane = gui.getContentPane();
                pane.add(panel);
                gui.setVisible(true);
                panel.requestFocus();
            }
        });

    }
}

然后,我将专注于将更多信息传递给gamemain类的能力,例如worldszieworld属性。

我还考虑在KeyListener上使用键绑定 API,这将有助于解决与焦点相关的问题KeyListener

我还建议看看Java编程语言的代码约定 - 这将使其他人更容易阅读您的代码,并让您更容易阅读他们的代码

相关内容

  • 没有找到相关文章

最新更新