2015-06-06 2 views
0

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

Это будет случай для [Обзор кода] (http://codereview.stackexchange.com/), а не StackOverflow. Но вы должны правильно отформатировать свой код перед публикацией там. – Turing85

+0

Также идентифицируйте [алгоритм (ы)] (https://www.google.com/?q=lights%20off%20puzzle%20algorithm), который вы реализуете/проверяете. – trashgod

ответ

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()); 

Это, чтобы вы начали. Вам нужно больше, но я хотел оставить вас с чем-то, с чем можно было бы работать. Надеюсь, это поможет.

0

Вы можете сократить actionPerformed() путем вычисления строки и столбца индекса из индекса кнопки (0..8) и замена forward(), backward(), up() и down() путем toggle() с соответствующими аргументами (проверено в функции), уменьшая девять случаев к одному.

public void actionPerformed(ActionEvent e) 
    { 
     JButton action = (JButton)e.getSource(); 
     int buttin = action.getAccessibleContext().getAccessibleIndexInParent(); 
     int row = buttin/COLS; 
     int col = buttin%COLS; 
     toggle(row, col ); 
     toggle(row-1, col ); // up 
     toggle(row+1, col ); // down 
     toggle(row, col-1); // backward 
     toggle(row, col+1); // forward 
    } 

     void toggle(int row, int col) 
     { 
     if (0 <= row && row < ROWS && 0 <= col && col < COLS) 
      if (lights[row][col].getText() == "0") 
       lights[row][col].setText("1"); 
      else 
       lights[row][col].setText("0"); 
     } 
Смежные вопросы