Lights Off是一款由n x n网格灯组成的益智游戏。在比赛开始时,一些灯开启。当按下灯时,此灯和四个相邻的灯都会切换,即。例如,如果它们关闭则打开,否则关闭。游戏的目的是关闭所有灯。
输入:
000 110 010输出应为
000 000 000
通过选择单元格00,10,11,21& 22。
我制作了以下程序,工作正常,我只是想知道是否有更好的方法来解决它。
import javax.swing.*;
import java.awt.*;
import javax.swing.JFrame;
import java.util.Scanner;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class lightOff extends JFrame implements ActionListener
{
public static final int W = 400;
public static final int H = 200;
JButton[][] lights = new JButton[3][3];
int COLS = 3, ROWS = 3;
public lightOff()
{
super("Light Off");
setSize(W,H);
setLayout(new GridLayout(3,3));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Scanner kb = new Scanner(System.in);
String[][] input = {{"0","0","0"},{"1","1","0"},{"0","1","0"}};
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
//input=kb.next();
lights[i][j] = new JButton();
lights[i][j].addActionListener(this);
lights[i][j].setText(input[i][j]);
add(lights[i][j]);
}
}
}
public static void main(String[] args)
{
lightOff obj1 = new lightOff();
obj1.setVisible(true);
}
public void actionPerformed(ActionEvent e)
{
JButton action = (JButton)e.getSource();
if(action==lights[0][0])
{
if("0".equals(lights[0][0].getText()))
lights[0][0].setText("1");
else
lights[0][0].setText("0");
// edgeToggle(0,0,action);
forward(0,0);
down(0,0);
}
else if(action==lights[0][1])
{
if(lights[0][2].getText()=="0")
lights[0][2].setText("1");
else
lights[0][2].setText("0");
backward(0,1);
forward(0,1);
down(0,1);
}
else if(action==lights[0][2])
{
if(lights[0][2].getText()=="0")
lights[0][2].setText("1");
else
lights[0][2].setText("0");
// edgeToggle(0,2,action);
backward(0,2);
down(0,2);
}
else if(action==lights[1][0])
{
if(lights[1][0].getText()=="0")
lights[1][0].setText("1");
else
lights[1][0].setText("0");
up(1,0);
down(1,0);
forward(1,0);
}
else if(action==lights[1][1])
{
if(lights[1][1].getText()=="0")
lights[1][1].setText("1");
else
lights[1][1].setText("0");
up(1,1);
down(1,1);
backward(1,1);
forward(1,1);
}
else if(action==lights[1][2])
{
if(lights[1][2].getText()=="0")
lights[1][2].setText("1");
else
lights[1][2].setText("0");
up(1,2);
down(1,2);
backward(1,2);
}
else if(action==lights[2][0])
{
if(lights[2][0].getText()=="0")
lights[2][0].setText("1");
else
lights[2][0].setText("0");
// edgeToggle(2,0,action);
up(2,0);
forward(2,0);
}
else if(action==lights[2][1])
{
if(lights[2][1].getText()=="0")
lights[2][1].setText("1");
else
lights[2][1].setText("0");
up(2,1);
backward(2,1);
forward(2,1);
}
else if(action==lights[2][2])
{
if(lights[2][2].getText()=="0")
lights[2][2].setText("1");
else
lights[2][2].setText("0");
// edgeToggle(2,2,action);
up(2,2);
backward(2,2);
}
}
public void forward(int a, int b)
{
if("0".equals(lights[a][b+1].getText()))
lights[a][b+1].setText("1");
else
lights[a][b+1].setText("0");
}
public void backward(int a, int b)
{
if("0".equals(lights[a][b-1].getText()))
lights[a][b-1].setText("1");
else
lights[a][b-1].setText("0");
}
public void up(int a, int b)
{
if("0".equals(lights[a-1][b].getText()))
lights[a-1][b].setText("1");
else
lights[a-1][b].setText("0");
}
public void down(int a, int b)
{
if("0".equals(lights[a+1][b].getText()))
lights[a+1][b].setText("1");
else
lights[a+1][b].setText("0");
}
}
伙计们,我需要您对此提出反馈意见,因为Java对我来说是新手,因此我需要了解解决此问题的更佳方法。
答案 0 :(得分:0)
我会从不使用数组开始,除非你必须这样做。我会为每个按钮或灯创建一个类,包括按钮本身,实际值(开/关)和可能在网格中的位置。然后我会使用HashMap或EnumMap作为灯光。
public class Light {
boolean value= false;
JButton button = new JButton();
int xloc = 0;
int yloc = 0;
}
... 代替“灯”:
HashMap<String, Light> lights = new ...; //Look it up
lights.put("A1",new Light());
这是为了让你入门。你会想要更多,但我想给你一些可以使用的东西。希望有所帮助。
答案 1 :(得分:0)
您可以通过从按钮索引(0..8)计算行和列索引并替换actionPerformed()
,forward()
,backward()
和{{来缩短up()
1}} down()
带有适当的参数(在函数中检查),将9个案例减少到1个。
toggle()