有一个11x11的国际象棋网格。每个网格都有一个带坐标的按钮。最左上侧的坐标为(0,0),右下侧的坐标为(11,11)。这些for循环尝试在Cardinal方向(南方,东方等)中映射Rook片段的有效路径集合。正如您可能猜到的,这些for循环通常的功能如下:
如果你注意到,所有这些for循环基本上是相同的,只是for循环及其变量的语句略有不同但我想不出为这些循环指定一般for循环的方法for循环。
originalrow is the current row coordinate of the Rook piece
originalcol is the current column coordinate of the Rook piece
for(int r=originalrow+1;buttons[r][originalcol]!=null&&buttons[r][originalcol].getIcon()!=null;r++){
//check south
Integer coordinate[] = getButtonCoord(buttons[r][originalcol]);
validCoordinates.add(coordinate);
if(buttons[r+1][originalcol].getIcon()!=null){//add valid coordinate also to eat enemy
if(buttons[r+1][originalcol].getIcon().toString().charAt(0)==enemyColor){
//An enemy/friendly exists when .getIcon() returns true. In order to differentiate enemy/friendly,
//each Icon has a description "w" for white or "b" for black at .charAt(0)
coordinate[] = getButtonCoord(buttons[r+1][originalcol]);
validCoordinates.add(coordinate);
}
}
}
for(int r=originalrow-1;buttons[r][originalcol]!=null&&buttons[r][originalcol].getIcon()!=null;r--){
//check north
Integer coordinate[] = getButtonCoord(buttons[r][originalcol]);
validCoordinates.add(coordinate);
if(buttons[r-1][originalcol].getIcon()!=null){//add valid coordinate also to eat enemy
if(buttons[r-1][originalcol].getIcon().toString().charAt(0)==enemyColor){
coordinate[] = getButtonCoord(buttons[r-1][originalcol]);
validCoordinates.add(coordinate);
}
}
}
for(int c=originalcol-1;buttons[originalrow][c]!=null&&buttons[originalrow][c].getIcon()!=null;r--){
//check west
Integer coordinate[] = getButtonCoord(buttons[originalrow][c]);
validCoordinates.add(coordinate);
if(buttons[originalrow][c-1].getIcon()!=null){//add valid coordinate also to eat enemy
if(buttons[originalrow][c-1].getIcon().toString().charAt(0)==enemyColor){
coordinate[] = getButtonCoord(buttons[originalrow][c-1]);
validCoordinates.add(coordinate);
}
}
}
for(int c=originalcol+1;buttons[originalrow][c]!=null||buttons[originalrow][c].getIcon()!=null;r++){
//check east
Integer coordinate[] = getButtonCoord(buttons[originalrow][c]);
validCoordinates.add(coordinate);
if(buttons[originalrow][c+1].getIcon()!=null){//add valid coordinate also to eat enemy
if(buttons[originalrow][c+1].getIcon().toString().charAt(0)==enemyColor){
coordinate[] = getButtonCoord(buttons[originalrow][c+1]);
validCoordinates.add(coordinate);
}
}
}
在C中,我可以轻松地使用#define指令创建一个可以包含不同类型代码语句的变量,但是使用Java,它似乎没有。
答案 0 :(得分:2)
可以通过以下方式推广算法:
int[] dx = {-1,1,0,0};
int[] dy = {0,0,-1,1};
for (int direction = 0; direction < 4; direction++) {
int r = originalrow + dx[direction];
int c = originalcol + dy[direction];
while (buttons[r][c] != null && buttons[r][c].getIcon() != null) {
Integer coordinate[] = getButtonCoord(buttons[r][c]);
validCoordinates.add(coordinate);
r += dx[direction];
c += dy[direction];
if (buttons[r][c].getIcon() != null) {// add valid coordinate
// also to eat enemy
if (buttons[r][c].getIcon().toString().charAt(0) == enemyColor) {
validCoordinates.add(coordinate);
}
}
}
}
当然我没有执行此代码,因为我没有定义所有必需的类/方法。因此,我不能保证它有效,但你可以得到一个想法。在这里,我们在dx
/ dy
数组中编码了可能的方向。顺便说一句,您现在只需在dx
/ dy
中添加更多条目即可轻松支持对角线:
int[] dx = {-1,1,0,0,1,1,-1,-1};
int[] dy = {0,0,-1,1,1,-1,1,-1};
引入Point
类型也是合理的。