繁体   English   中英

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

[英]How to specify a general formula for this bunch of for-loops to reduce code?

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

  1. 获取网格中当前按钮的坐标。
  2. 将这些坐标添加到有效坐标。
  3. 如果下一个网格上有一个敌人,则也添加该敌人的坐标。

如果您注意到,所有这些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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM