简体   繁体   中英

Lights out game using 2d arrays

I'm trying to make a lights out game, I simplified it to only change one tile at a time but I'm still encountering one bug. I can click to change from yellow to black but I can't click and have the opposite happen. Here is the game if you are unfamiliar: http://www.logicgamesonline.com/lightsout/

My code:

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

public class LightsOutPanel extends JPanel implements MouseListener {
    private boolean[][] lights;

    public static void main(String[] args) throws Exception {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Lights Out!");
        frame.setResizable(false);
        frame.setVisible(true);

        LightsOutPanel panel = new LightsOutPanel();
        if (panel.lights == null) {
            System.out.println("You did not initialize your light array!" +
                               "It's still null...");
            System.exit(-1);
        }
        panel.addMouseListener(panel);
        panel.setPreferredSize(new Dimension(601, 501));
        panel.setMinimumSize(new Dimension(601, 501));

        Container c = frame.getContentPane();
        c.setLayout(new BorderLayout());
        c.add(panel, BorderLayout.CENTER);

        frame.pack();
    }

    public LightsOutPanel() {
        lights = new boolean[5][6];
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 6; j++) {
                lights[i][j] = true;
            }
        }

    }

    // unused methods
    public void mouseClicked(MouseEvent e) {}

    public void mouseReleased(MouseEvent e) {}

    public void mouseEntered(MouseEvent e) {}

    public void mouseExited(MouseEvent e) {}

    public void paint(Graphics g) {
        int boxWidth = 600 / 6;
        int boxHeight = 500 / 5;

        int y = 0;
        for (int row = 0; row < 5; row++) {
            int x = 0;
            for (int col = 0; col < 6; col++) {
                if (lights[row][col]==true) {
                    g.setColor(Color.YELLOW);
                } else {
                    g.setColor(Color.BLACK);
                }
                g.fillRect(x, y, boxWidth, boxHeight);

                g.setColor(Color.BLUE);
                g.drawRect(x, y, boxWidth, boxHeight);
                x += boxWidth;
            }
            y += boxHeight;
        }
    }

    // called when the mouse is pressed - determines what row/column the user
    // has clicked
    public void mousePressed(MouseEvent e) {
        int mouseX = e.getX();
        int mouseY = e.getY();

        int panelWidth = getWidth();
        int panelHeight = getHeight();

        int boxWidth = panelWidth / lights[0].length;
        int boxHeight = panelHeight / lights.length;

        int col = mouseX / boxWidth;
        int row = mouseY / boxHeight;

        toggle(row, col);
        repaint();
    }

    // called to "toggle" the selected row and column, as well as the four
    // adjacent lights
    public void toggle(int row, int col) {

        if (row >= 0 && col >= 0 && row < lights.length && 
            col < lights[0].length)
        {
            if (lights[row][col] = true) {
                lights[row][col] = false;
            } else {
                lights[row][col] = true;
            }
        }

    }
}

Your "core" problem is in your toggle method...

if (lights[row][col] = true) {

= is an assignment, so you saying assign true to lights[row][col] and if lights[row][col] == true then do the following...so it's always true.

A simpler method would be to do....

lights[row][col] = !lights[row][col];

no, if's or else's, nice a simple.

You should also have aa look at Painting in AWT and Swing and Performing Custom Painting . You've violate the paint method chain contract (by not calling super.paint )

Instead of overriding paint , you should be using paintComponent AND you should be calling super.paintComponent before you do any custom painting, this will ensure that the Graphics context is nicely prepared for you

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM