如何为这一组for循环指定通用公式以减少代码?

时间:2015-05-24 02:05:54

标签: java for-loop

有一个11x11的国际象棋网格。每个网格都有一个带坐标的按钮。最左上侧的坐标为(0,0),右下侧的坐标为(11,11)。这些for循环尝试在Cardinal方向(南方,东方等)中映射Rook片段的有效路径集合。正如您可能猜到的,这些for循环通常的功能如下:

  1. 获取网格中当前按钮的坐标。
  2. 将这些坐标添加到validCoordinates。
  3. 如果下一个网格上有敌人,也要添加敌人的坐标。
  4. 如果你注意到,所有这些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,它似乎没有。

1 个答案:

答案 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类型也是合理的。