关灯解决最佳解决方案

时间:2015-06-06 20:45:57

标签: java swing optimization

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对我来说是新手,因此我需要了解解决此问题的更佳方法。

2 个答案:

答案 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()