簡體   English   中英

堅持Java Swing項目:Conway的生命游戲

[英]Stuck on Java Swing Project: Conway's Game of Life

我現在已經為此工作了大約四個小時。 我有所有邏輯下來pat,計時器工作,鍵盤和鼠標輸入工作,但不調用paintComponent方法來繪制更新! 我對這些實時應用程序沒有經驗,所以它可能是導致這種情況無法工作的任何因素。 任何幫助,將不勝感激!

gamemain.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();
        }
    });


}


}

world.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使用Key Bindings API ,它將有助於解決與KeyListener相關的焦點問題

我還建議您查看Java編程語言的代碼約定 - 這將使其他人更容易閱讀您的代碼並讓您閱讀他們的代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM