0

我做了一个 8 字谜游戏。我发现我的打乱方法有问题,但我不知道如何解决。有没有人可以帮助我的代码?这是打乱方法代码。我的代码问题是,点击打乱按钮后,数字只会显示两个数字图片,然后再次单击打乱,它只显示9个按钮中的一个数字。

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;
    }
}

更新

在这里我发现另一个错误,在我单击重置按钮后,当我尝试移动我的数字按钮时,移动步骤是错误的。在这里我附上我的移动方法和重置方法

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()方法后,你的currentColandcurrentRow变量会出错;您需要更新它们以指向新的空块。在退出方法之前添加:

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 回答