0

8パズルゲームをしました。スクランブル方法に問題があることがわかりましたが、修正方法がわかりません。私のコードを手伝ってくれる人はいますか? これがスクランブル メソッドのコードです。私のコードの問題は、スクランブル ボタンをクリックした後、数字が 2 つの数字の画像だけになり、もう一度スクランブルをクリックすると、9 つのボタンに 1 つの数字しか表示されないことです。

public void scramble()
{
     for(int i = 0; i <SHUFFLE_NUM; i++)
    {
        int x1 = rand.nextInt(BOARD_SIZE);
        int x2 = rand.nextInt(BOARD_SIZE);
        int y1 = rand.nextInt(BOARD_SIZE);
        int y2 = rand.nextInt(BOARD_SIZE);

        Piece temp = board[x1][y1];
        board [x1][y1] = board[x2][y2];
        board[x1][y2] = temp;
    }
}

アップデート

ここで別のバグを見つけました。リセットボタンをクリックした後、番号ボタンを移動しようとすると、移動ステップが間違っています。ここで、move メソッドと reset メソッドを添付します

public boolean move(int _x, int _y)
    {

    boolean valid = false;

    if(_x == currentCol-1 && _y == currentRow ) // on the left of empty one
        valid = true;

    else if(_x == currentCol+1&&_y == currentRow) //on the right of empty one
        valid = true;

    else if(_x == currentCol&&_y == currentRow-1) // on the top of empty one
        valid = true;

    else if(_x == currentCol &&_y == currentRow +1) // on the bottom of empty one
        valid = true; 

    if(valid)
    {
        Piece temp;
        temp = board[_x][_y];
        board[_x][_y] = board[currentCol][currentRow];
        board[currentCol][currentRow] = temp;

        currentCol = _x;
        currentRow = _y;
    }

    return valid;

}

リセット方法はこちら

public void reset()
    {

    for(int i =0; i<BOARD_SIZE; i++)
      for(int j =0; j<BOARD_SIZE; j++)
      {
          int value = i*BOARD_SIZE+j+1 ;
            String filePath;
            if(value!= BOARD_SIZE*BOARD_SIZE)
                filePath = "Piece" + value +".jpg"; //what is this mean?
            else
                filePath = "blank piece.jpg";
            board[i][j]= new Piece(new ImageIcon(filePath),i, j, value);

      }

}

リセットボタンをクリックしなかった場合、移動は正常に機能します..

4

3 に答える 3

5

答えは明らかだと思いますが、本当は言いたくないのです。

代わりに、デバッグ方法を学ぶことをお勧めします。

Eclipse のような最新の IDE を用意し、単体テストまたは小さなアプリケーションを用意し、デバッグ モードをオンにして、コードを実行します。

for ループ内にブレーク ポイントを追加し、それをステップ実行して、変数 および の変更を調べますboard。答えは簡単にわかります。

于 2012-10-26T03:22:40.023 に答える
3
 board[x1][y2] = temp;

これはいけませんか

 board[x2][y2] = temp;

アップデート

reset()メソッドを呼び出した後、変数currentColcurrentRow変数は間違っています。新しく空のピースを指すようにそれらを更新する必要があります。メソッドを終了する前にこれを追加します。

currentCol = BOARD_SIZE - 1;
currentRow = BOARD_SIZE - 1;
于 2012-10-26T03:21:31.150 に答える
2

あなたのスワップコードは少し間違っています...

Piece temp = board[x1][y1];
board [x1][y1] = board[x2][y2];
board[x1][y2] = temp; // You're mapping the wrong x position here

それは読むべきです

Piece temp = board[x1][y1];
board [x1][y1] = board[x2][y2];
board[x2][y2] = temp;
于 2012-10-26T03:22:34.877 に答える