为什么这个do-while循环不起作用?

时间:2016-12-26 19:03:22

标签: java loops multidimensional-array do-while throws

我使用2D阵列制作了战舰游戏并且需要我的do-while循环才能工作,所以如果你把一艘船放在已有的船上,你会被要求再次放置这艘船。下面是将数组值从0更改为1以类似于船只放置的代码。如果您尝试将船舶放置在已经存在值1的位置,则会抛出IllegalArgumentException。

public int[][] changeMatrixValues(int i, int j, int k, int l) throws IllegalArgumentException {    // for a ship with dimensions k*l and starting grid[i][j]
    for (mRow = i; mRow < (i + k); mRow++) {
        for (mCol = j; mCol < (j + l); mCol++) {
                    if (mMatrix[mRow][mCol] == 0 && mMatrix[mRow][mCol] != 1)
                        mMatrix[mRow][mCol] = 1;
                    else
                        throw new IllegalArgumentException("Ship already in area");
        }
    }
    return mMatrix;
}

这是另一个类中的代码,用于提示用户他们想要放置某种类型的船的位置。它会获取IllegalArgumentException,但是,do-while循环不起作用,如果用户将船放在另一个上面,他们就不会再有机会放置那个特定的船并且游戏继续询问你想要的位置放置下一艘船。如果有人能够强调为什么这个do-while循环不起作用那就太棒了!

    private boolean keepPlacing;
    private void ship(String shipToPlace, Matrix matrix, int k, int l) {
    keepPlacing = true;
    do {
        try {
            System.out.println(shipToPlace);
            chooseGrid();            // enter co-ords of where you want to place ship
            matrix.changeMatrixValues(mRow, mCol, k, l);
            keepPlacing = false;
        } catch (IllegalArgumentException ie) {
            System.out.println(ie.getMessage());
        }
    } while (keepPlacing);

    matrix.printLabeledMatrix();
}

2 个答案:

答案 0 :(得分:1)

此更改解决了问题:

private void ship(String shipToPlace, Matrix matrix, int k, int l) {
    boolean keepPlacing = true;
    do {
        try {
            System.out.println(shipToPlace);
            chooseGrid();
            if(matrix.validate(mRow, mCol, k, l) == true) {
                matrix.changeMatrixValues(mRow, mCol, k, l);
                keepPlacing = false;
            }
        } catch (IllegalArgumentException ie) {
            System.out.println(ie.getMessage());
        }
    } while (keepPlacing);

    matrix.printLabeledMatrix();
}

其中validate(mRow,mCol,k,l)方法是:

public boolean validate(int i, int j, int k, int l) {
        for (mRow = i; mRow < (i + k); mRow++) {
            for (mCol = j; mCol < (j + l); mCol++) {
                if (mMatrix[mRow][mCol] == 1) {
                    System.out.println("Oops, try again");
                    return false;
                }
            }
        }
        return true;
}

感谢您的帮助!

答案 1 :(得分:0)

在方法changeMatrixValues中,您将数组值设置为1,如果抛出IllegalArgumentException,则不会回滚它们。