【问题标题】:Why does this do-while loop not function?为什么这个 do-while 循环不起作用?
【发布时间】:2016-12-26 19:03:21
【问题描述】:

我已经使用 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();
}

【问题讨论】:

  • 好的。乍一看还不错。可以调试一下,看看catch子句中keepPlacing的值是多少?
  • 值得指出的是,changeMatrixValues 没有失败原子性:它不会在进行之前检查整个“更改”是否有效。这意味着它可以设置一个或多个单元然后失败,从而使事物处于损坏状态。
  • 另外:mMatrix[mRow][mCol] == 0 &amp;&amp; mMatrix[mRow][mCol] != 1 是多余的,因为0 != 1
  • 另外:这是使用异常来表示不是异常情况的情况。为什么不从该方法返回一个布尔值:true 表示成功、有效的移动;如果无效,则为 false。不需要返回成员变量。
  • 感谢安迪·特纳指出我的其他问题。循环工作正常,我刚刚将初始 keepPlacing 移到调试器显示为始终设置为 false 的方法之外,导致循环失败

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


【解决方案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;
}

感谢您的帮助!

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 虽然这可能是代码中的一个错误,但它似乎无法回答为什么在抛出IllegalArgumentException 时会退出keepPlacing 循环的问题。如果您对提出的问题没有答案,则应保留此声明以供评论。
    猜你喜欢
    • 2022-12-12
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    相关资源
    最近更新 更多