不好的做法?退出循环条件

时间:2013-12-18 22:15:39

标签: java for-loop syntax conditional-statements chess

我正在制作一个国际象棋游戏,现在我正在制作一个方法来检查国王,在一个方向上,如果发现威胁则返回true,如果没有找到威胁则返回false。 此方法需要两个整数来增加x和y。并且该方法将从起始位置,在给定的方向上((1,0)用于向上,(1,1)用于向上和向右,(0,1)用于向下)。

我的问题是,这个方法用for循环检查路径,它最终会到达国际象棋游戏的边界,找到一个障碍,或者它会找到一块。无论哪种方式,这就是for循环应该如何结束。但那么for循环会出现什么情况呢? 我觉得把它留下来可能是不好的做法,但是唯一合乎逻辑的条件是确保x和y都在1-8的范围内。但这会使代码看起来像: for(int i = begx + xdiff, j = begy + ydiff; (i < 8 && i > 1) && (j < 8 && j > 1); i += xdiff, j += ydiff) { .. }

这将是我看到的唯一其他选项,这本身对我来说似乎也是不好的做法。因为,它看起来过于复杂和挤在一起。这种情况永远不应该被打破,那么为什么我会在那里拥有它,如果它永远不会是循环破裂的原因?我不希望其他程序员阅读我的代码,并认为这可能是他们必须注意的事情,当真的,我只是不需要那里的条件并把它用于双重检查。

这是整个方法,供参考:

public boolean incheckPath(Location l1, int xdiff, int ydiff) {
    int begx = l1.getX();
    int begy = l1.getY();

    String team = board[begx][begy].getTeam();

    for(int i = begx + xdiff, j = begy + ydiff; ; i += xdiff, j += ydiff) {
        if(board[i][j].getType() != ' ') {

            if(board[i][j].getType() == '#') {
                return false;
            }
            if(board[i][j].getTeam().equals(team)) {
                return false;
            }
            if(board[i][j].getType() == 'Q' || board[i][j].getType() == 'R') {
                return true;
            }

        }
    }

}

修改 它已被改进以实现while循环,但现在如何改进呢?有人建议使用break并继续,所以我实现了我所看到的可能。但是,有人说我不应该循环回来。如果没有变量来保存返回值,这怎么可能呢?

public boolean incheckPath(Location l1, int xdiff, int ydiff) {
    int x = l1.getX();
    int y = l1.getY();

    String team = board[x][y].getTeam();

    while(true) {
        x += xdiff;
        y += ydiff;

        if(board[x][y].getType() == '#' || board[x][y].getTeam().equals(team)) {
            break;
        }

        if(board[x][y].getType() == 'Q' || board[x][y].getType() == 'R') {
            return true;
        }

    }

    return false;

}

4 个答案:

答案 0 :(得分:2)

如果您自己决定,基于您编写的其他代码,当for循环结束时,您应该声明一个布尔值

boolean keepLooping = true

并在希望循环停止时将其设置为false。请注意,您必须在for循环中执行此操作。

现在让循环的条件成为刚刚创建的变量。换句话说,它会说...; keepLooping ; ...

另外,我不确定你的getType实现,它可能会返回一个字符。如果它返回一个字符串,您可能并不是要使用==来比较字符串。您想使用oneString.equals(anotherString)来检查它们是否等效。使用==实际检查它们是否在内存中确实是相同的变量。可能这不是你想要的。

因此,在这种情况下,您的代码看起来像

if(board[i][j].getType().equals("Q")   ......

但是如果getType返回一个字符,则该段落不适用。

答案 1 :(得分:1)

您想要做的事情是while循环更具可读性:

    int i = begx + xdiff;
    int j = begy + ydiff;
    while (true) {
        if(board[i][j].getType() != ' ') {
            if(board[i][j].getType() == '#') {
                return false;
            }
            if(board[i][j].getTeam().equals(team)) {
                return false;
            }
            if(board[i][j].getType() == 'Q' || board[i][j].getType() == 'R') {
                return true;
            }
        }
        i += xdiff; 
        j += ydiff;
    }

答案 2 :(得分:1)

对于这类问题,最好使用while循环

使用boolean loop = True;

while(loop){...};

然后您可以使用return语句退出循环

答案 3 :(得分:0)

我会比较从敌人棋子到国王阵地的可能动作,而不是每一件棋子从国王的位置移动。 要展示的小图片,因为我很难弄清楚如何说出来。

       C        C
       C     C   
   "P" C  C       //P is Pawn
 C  C "K" C  C  C //K is King
    C  C  C       //C is where you (potentially) had to check
 C     C     C   



   "P"            //P is Pawn
 C    "K"         //K is King
                  //C is where you (potentially) had to check

现在,我把这种情况对我有利,因为只有一件,它随着件数而缩放。但我这样做的原因是:

一旦你有可能的动作列表,你也可以将它用于其他事情,例如确保移动有效,并评分哪个移动最好。 (您甚至可能已经为此目的使用了列表或数组)

我意识到这将意味着重新编码你所拥有的大部分内容。 (听起来它已经在工作了),但我想我会把它扔出去。