[英]How to specify a general formula for this bunch of for-loops to reduce code?
有一个11x11的象棋网格。 每个网格都有一个带有坐标的按钮。 最左上侧的坐标为(0,0),最右下侧的坐标为(11,11)。 这些for循环尝试在基本方向(南,东等)上映射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,它似乎没有。
可以通过以下方式概括算法:
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
类型可能是合理的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.