在循环中打破或返回的练习

Mat*_*t C 9 java loops return break conditional-statements

背景:我正在制作国际象棋比赛.它几乎完全正常工作,只是错过了对将军的检查,但是我正在改进一些代码以便于阅读等等.
现在,我正在重新编码一种方法,我必须检查从任何一块到另一个位置的路径.如果有一个块阻塞路径则返回true,如果没有阻塞路径则返回false.
注意:我不需要检查最后一个位置的位置,因为我的游戏会检查以确保您没有占据您想要移动的位置.

还要注意我已经研究过这个问题,我发现主要是在这里达成的共识是,破解是正确的解决方案.这比在循环外部初始化布尔变量并设置为true或false并打破该值的循环更受欢迎.但是,我的循环中有两个条件可能会使我的代码返回true或返回false,所以我不能完全这样做.

现行守则

public boolean isPathClear(Location l1, Location l2) {

    int atx = l1.getX(); 
    int aty = l1.getY(); 
    int xdiff = 0, ydiff = 0;
    int endx = l2.getX(), endy = l2.getY();

    if(l1.getX() > l2.getX()) {
        xdiff = 1;
    }
    if(l1.getX() < l2.getX()) {
        xdiff = -1;
    }
    if(l1.getY() > l2.getY()) {
        ydiff = 1;
    }
    if(l1.getY() < l2.getY()) {
        ydiff = -1;
    }

while(true) {
        atx += xdiff; 
        aty += ydiff;

        if(atx == endx && aty == endy) {
            return true 
        }

        if(board[atx][aty].getType() != ' ') {
            return false; 
        }
    } 
Run Code Online (Sandbox Code Playgroud)

问题:由于破坏是首选方法,这就是我打算做的.但是,我遇到了一个问题,如果我在其中一个if语句中使用break,看起来我必须返回另一个.喜欢:

while(true) {
        atx += xdiff; 
        aty += ydiff;

        if(atx == endx && aty == endy) {
            break;
        }

        if(board[atx][aty].getType() != ' ') {
            return false; 
        }
    }

    return true;
Run Code Online (Sandbox Code Playgroud)

问题: 这似乎是一种令人困惑的混合.所以根据我的情况,这仍然是这段代码的首选方法:

boolean clear;

    while(true) {
        atx += xdiff; 
        aty += ydiff;

        if(atx == endx && aty == endy) {
            clear = true;
            break;
        }

        if(board[atx][aty].getType() != ' ') {
            clear = false;
            break;
        }
    }

    return clear;
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 1

大多数情况下,我会说这是一个主观的事情。

最后一个代码示例的一个客观优势是,它为您提供了方法的单点退出点,这对于调试通常很有用。曾经和我一起工作的一个做军事软件的人曾说过,这是他们必须努力实现的要求:一个方法必须只有一个出口点。他声称这是一个稳健性/可靠性/可维护性的事情。我只是喜欢那种简单的“这就是它离开的地方”的感觉。