자바 스윙을 처음 사용하기 때문에 내 프로그램이 가장 혼란 스럽습니다. 목표는 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;
}
}
}
"혼돈의 특성으로 인해"나는 문제가 있지만 어디에 있는지 그것을 통해 일을하고 알아 내기 위해 시간이 걸릴하지 않으려는 알고있다 우리도 마찬가지입니다. 한 번보세요. 깨뜨릴 수있는 부분을 찾을 수 없는지 확인하십시오. 많은 로그 문을 작업 할 때 추가하십시오. 이것을 좋은 질문으로 바꾸는 데 도움을 받으려면 [여기] (http://stackoverflow.com/help/mcve)를보십시오. – 3ocene
줄 단위로 작업 해 왔는데 문제는 구성 요소를 무작위로 처리하는 것 같습니다. else {...에서 코드를 제거하면} 문은 잘 작동하는 Order() 메서드에서 무작위 화하지 않습니다. – Heathen0042
질문에 넣으십시오 – 3ocene