我正在制作一个国际象棋游戏,现在我正在制作一个方法来检查国王,在一个方向上,如果发现威胁则返回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;
}
答案 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
现在,我把这种情况对我有利,因为只有一件,它随着件数而缩放。但我这样做的原因是:
一旦你有可能的动作列表,你也可以将它用于其他事情,例如确保移动有效,并评分哪个移动最好。 (您甚至可能已经为此目的使用了列表或数组)
我意识到这将意味着重新编码你所拥有的大部分内容。 (听起来它已经在工作了),但我想我会把它扔出去。