【发布时间】:2014-01-07 07:21:16
【问题描述】:
我正在做一个国际象棋游戏,现在我正在制作一种方法来检查国王的方向,如果发现威胁则返回 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 and continue,所以我在我看到的地方实现了它。但是,有人说我不应该循环返回。如果不做一个变量来保存返回值,这怎么可能?
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;
}
【问题讨论】:
-
所以,我不清楚。你只是想要一种方法来遍历这件作品的可能动作吗?
-
@GGrec - 代码确实可以编译,它是一个完全可用的国际象棋游戏,我只是改变了一些方法。你有什么建设性的要说吗?
-
当终止条件是
break或return时,省略循环条件或将其设置为true或任何其他内容绝对没有错。 (我们将把关于从循环内部返回的争论留到另一天。) -
@MatthewC 是的。避免硬编码字符串。学习使用
continue提高代码可读性,使用break提高性能。结合这些 IF 语句。你的代码很好。 -
我倾向于不使用
for,而是使用while(true)并在外部设置循环控制变量。事实上,它们很难在for中跟踪,并且会更清楚地划分为单独的行。
标签: java for-loop syntax conditional-statements chess