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.