2016-10-13 2 views
1

자바 스윙을 처음 사용하기 때문에 내 프로그램이 가장 혼란 스럽습니다. 목표는 8 개 퍼즐로 이미지를 찍어 9 개 섹터로 나눈 다음 8 개를 특정 순서대로 배치하는 것입니다 (이동을위한 드롭 1). 이 프로그램은 처음부터 잘 작동합니다. 문제가 해결되면 JButton 구성 요소를 무작위로 추출하고 다시 풀 수 있도록해야합니다. 버튼을 무작위로 선택하지만이를 이동하지 못하게하십시오. 어떤 도움이라도 대단히 감사합니다.8 개 퍼즐의 두 번째 반복이 작동하지 않습니다.

일반적으로 나는 문제가 있다고 생각하는 코드를 게시 하겠지만, 코드의 혼란스러운 특성으로 인해 전체 클래스를 게시하고 있습니다.

편집 : 코드 라인을 통과 한 후, 문제는 주문() 메소드 것 같다. 두 번째 "if"문을 모두 제거하면 프로그램이 제대로 작동하여 구성 요소가 임의로 무작위 화되지 않습니다. (내가 "다른"& "다른 경우"그 진술에 사용하는 경우 동일)

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

public class JEightPuzzleFrame extends JFrame implements ActionListener { 

    JButton[] buttons = new JButton[9]; 
    JButton[][] format = new JButton[3][3]; 
    JPanel puzzle = new JPanel(); 
    JPanel jp = new JPanel(); 
    String path = null; 
    int h; 
    int w; 

    public JEightPuzzleFrame(String Title, String Path) { 
     super(); 
     path = Path; 
     add(puzzle); 
     makeFrame(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
     setSize(w + 10, h + 10); 
     setTitle(Title); 
     setResizable(false); 
     jp.setVisible(true); 
    } 

    public void makeFrame() { 
     puzzle.setVisible(true); 
     puzzle.setBounds(100, 100, 612, 519); 
     makeBtnImg(); 
     puzzle.setLayout(new GridLayout(3, 3)); 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       puzzle.add(format[i][j]); 
       if (format[i][j] == buttons[8]) { 
        puzzle.remove(format[i][j]); 
        puzzle.add(jp); 
       } 
      } 
     } 
    } 

    public void makeBtnImg() { 
     try { 
      BufferedImage pic = ImageIO.read(new File(path)); 
      jp.setSize(h, w); 
      h = pic.getHeight(); 
      w = pic.getWidth(); 
      int count = 0; 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        BufferedImage bimg = pic.getSubimage(i * w/3, j * h/3, w/3, h/3); 
        if (count < 9) { 
         buttons[count] = new JButton(new ImageIcon(bimg)); 
         buttons[count].addActionListener(this); 
        } 
        count++; 
       } 
      } 
      order(true); 
     } catch (IOException e) { 
     } 
    } 

    public void order(boolean initial) { 

     if (initial == true) { 
      format[0][0] = buttons[8]; 
      format[1][0] = buttons[4]; 
      format[2][0] = buttons[1]; 

      format[0][1] = buttons[0]; 
      format[1][1] = buttons[7]; 
      format[2][1] = buttons[2]; 

      format[0][2] = buttons[3]; 
      format[1][2] = buttons[6]; 
      format[2][2] = buttons[5]; 
     } 
     if (initial == false) { 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        int rd = (int) Math.random() * (9 - 0); 
        JButton temp = buttons[rd]; 
        format[i][j] = temp; 
       } 
      } 
     } 
     refresh(); 
    } 

    public void refresh() { 

     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       puzzle.remove(format[i][j]); 
      } 
     } 
     puzzle.remove(jp); 
     for (int i = 0; i < 3; i++) { 
      for (int j = 0; j < 3; j++) { 
       puzzle.add(format[i][j]); 
       if (format[i][j] == buttons[8]) { 
        puzzle.remove(format[i][j]); 
        puzzle.add(jp); 
       } 
      } 
     } 
     getContentPane().validate(); 
     if (format[0][0] == buttons[0] && format[0][1] == buttons[3] && format[0][2] == buttons[6] 
       && format[1][0] == buttons[1] && format[1][1] == buttons[4] && format[1][2] == buttons[7] 
       && format[2][0] == buttons[2] && format[2][1] == buttons[5] && format[2][2] == buttons[8]) { 

      JOptionPane.showMessageDialog(null, "YOU WON!"); 
      order(false); 
     } 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton temp; 
     JButton button = (JButton) e.getSource(); 
     Dimension size = button.getSize(); 

     int buttonX = button.getX(); 
     int buttonY = button.getY(); 
     int buttonPosX = buttonX/size.width; 
     int buttonPosY = buttonY/size.height; 
     int leftNeighbor = buttonPosX - 1; 
     int rightNeighbor = buttonPosX + 1; 
     int topNeighbor = buttonPosY - 1; 
     int bottomNeighbor = buttonPosY + 1; 
     int c = 0; 

     if (leftNeighbor >= 0 && format[buttonPosY][leftNeighbor] == buttons[8]) { 
      c = 1; 
     } else if (rightNeighbor < 3 && format[buttonPosY][rightNeighbor] == buttons[8]) { 
      c = 2; 
     } else if (topNeighbor >= 0 && format[topNeighbor][buttonPosX] == buttons[8]) { 
      c = 3; 
     } else if (bottomNeighbor <= 2 && format[bottomNeighbor][buttonPosX] == buttons[8]) { 
      c = 4; 
     } else { 
      c = 0; 
     } 

     switch (c) { 

      case 0: 
       break; 

      case 1: 
       temp = format[buttonPosY][buttonPosX]; 
       format[buttonPosY][buttonPosX] = format[buttonPosY][leftNeighbor]; 
       format[buttonPosY][leftNeighbor] = temp; 
       refresh(); 
       break; 

      case 2: 
       temp = format[buttonPosY][buttonPosX]; 
       format[buttonPosY][buttonPosX] = format[buttonPosY][rightNeighbor]; 
       format[buttonPosY][rightNeighbor] = temp; 
       refresh(); 
       break; 

      case 3: 
       temp = format[buttonPosY][buttonPosX]; 
       format[buttonPosY][buttonPosX] = format[topNeighbor][buttonPosX]; 
       format[topNeighbor][buttonPosX] = temp; 
       refresh(); 
       break; 

      case 4: 
       temp = format[buttonPosY][buttonPosX]; 
       format[buttonPosY][buttonPosX] = format[bottomNeighbor][buttonPosX]; 
       format[bottomNeighbor][buttonPosX] = temp; 
       refresh(); 
       break; 
     } 
    } 
} 
+1

"혼돈의 특성으로 인해"나는 문제가 있지만 어디에 있는지 그것을 통해 일을하고 알아 내기 위해 시간이 걸릴하지 않으려는 알고있다 우리도 마찬가지입니다. 한 번보세요. 깨뜨릴 수있는 부분을 찾을 수 없는지 확인하십시오. 많은 로그 문을 작업 할 때 추가하십시오. 이것을 좋은 질문으로 바꾸는 데 도움을 받으려면 [여기] (http://stackoverflow.com/help/mcve)를보십시오. – 3ocene

+1

줄 단위로 작업 해 왔는데 문제는 구성 요소를 무작위로 처리하는 것 같습니다. else {...에서 코드를 제거하면} 문은 잘 작동하는 Order() 메서드에서 무작위 화하지 않습니다. – Heathen0042

+1

질문에 넣으십시오 – 3ocene

답변

1

먼저 모든 코드의 몇 가지 이유를 알아보기 힘들 :

  1. 변수 이름은 의미가 없습니다. "c"와 같은 이름은 당신에게 의미가있을 수 있지만 다른 사람들이 그것을 읽을 때 우리는 그것이 무엇을 나타낼 지 짐작할 수 있습니다.
  2. 자바에서 제공하는 프리미티브 및 클래스를 사용하고 있지만 코드를 단순화하여 자신 만의 디자인으로 맞춤 개체를 만들 수 있습니다.
  3. 코드 특정 질문이 의심으로 문제가 실제로 order 방법에 누워 않습니다에 관해서는

에 대한 의견이 없습니다. 그것은이 라인이다 :

int rd = (int) Math.random() * (9 - 0);

당신은 항상 여기에 0의 결과를 얻고 있도록 int에 캐스팅 곱셈 전에 발생합니다. 이로 인해 format 배열의 모든 단추가 동일하게됩니다.

그러나 더 큰 문제가 있습니다. 당신이 수행하여 위의 라인을 수정하더라도 :

int rd = (int) (Math.random() * (9 - 0));

을 당신이 한 번만 각 버튼을 사용하는지 확인하지 않기 때문에 당신은 여전히 ​​문제가있는 것입니다. 다시 말해, rd은 현재 루프에서 3이 될 수 있으며 다음 루프에서 다시 3이 될 수 있습니다. 왜냐하면 무작위이기 때문입니다. 이전에 사용 된 메모리가없고 사용되지 않았기 때문입니다. 필요한 것은 각 단추가 고유하도록 중복을 방지하는 메커니즘입니다.

그래서,이 같은 트릭을 수행해야합니다

if (initial == false) { 
      boolean[] isUsed = new boolean[buttons.length]; 
      for (int i = 0; i < 3; i++) { 
       for (int j = 0; j < 3; j++) { 
        int rd = -1; 
        do{ 
         rd = (int) (Math.random() * (9 - 0)); 
        }while(isUsed[rd]); 
        isUsed[rd] = true; 
        JButton temp = buttons[rd]; 
        format[i][j] = temp; 
       } 
      } 
     } 
+0

입력 해 주셔서 감사합니다! 앞으로의 프로그램을 위해 나는 당신이 제안한 팁을 사용하게 될 것입니다. 나는 실제로 이것을 게시 한 후에 중복을 막기위한 논리를 만들었습니다. 랜덤 화와 관련하여 제안한 방식대로 시도했지만 여전히 제대로 작동하지 않는 것 같습니다. 이제 타일에 움직임이 있지만 올바르지 않습니다. 그들은 무작위로 지금뿐만 아니라 교환하는 것 같습니다. – Heathen0042

+0

이상한데, 위의 코드로 실행하면 정상적으로 작동하는 것 같습니다. 내 최신 편집본을 보았 니? –

+0

마지막 편집을 보지 못했습니다! 이것은 내 문제를 해결했다. 정말 고맙습니다! – Heathen0042

관련 문제