2016-10-13 9 views
1

これは私の初めてのJava Swingでの作業ですので、私のプログラムはあまり言い表せないほど混沌です。目標は、8つのパズルがイメージを取って9つのセクターに分け、そのうち8つを特定の順序(移動の場合はドロップ1)に配置することです。このプログラムは最初からうまく動作します。それが解決されたら、JButtonコンポーネントをランダム化して、もう一度解くことができます。ボタンはランダム化されていますが、移動させることはできません。どんな助けでも大歓迎です。8パズルの2回目の反復は機能していません

通常、問題があると思うコードを投稿しますが、コードが混乱しているため、クラス全体を投稿しています。

EDIT: 線でコードラインを通過した後、問題が発注()メソッド内にあるように見えます。 2番目の "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

私はそれを1行ずつ作業してきましたが、問題はコンポーネントをランダム化するところにあるようです。私がelse {...のコードを削除した場合}ステートメントは、正常に動作するOrder()メソッドではランダム化しません。 – Heathen0042

+1

あなたの質問にそれを入れてください – 3ocene

答えて

1

すべてこのコードの最初には、いくつかの理由のために読みにくいです:

  1. 変数名に意味はありません。 「c」のような名前はあなたに何かを意味するかもしれませんが、他の人がそれを読んだときには、それが表すものを推測することになります。
  2. Javaで提供されるプリミティブとクラスを使用していますが、コードを単純化して独自のデザインのカスタムオブジェクトを作成することもできます。
  3. は、コードあなたの特定の質問あなたが疑われるような問題が実際にorder方法に存在しないためとして

にはコメントはありません。それは、この行です:あなたはいつもここに0の結果を取得しているので、

int

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

鋳造は乗算の前に起こります。これにより、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

関連する問題