java—如何将这4个循环函数简化为1个函数?

shstlldc  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(329)

我有个练习。一个int[8][8]象棋格。我得看看白人能不能打败黑人。输入为:(lowercaps=黑色,upper=白色)

tc.drf.t
ppp.pppp
...p...c
.....f..
..C..P..
..P.D.P.
PP.....P
T.F.RFCT

对于qeen/towers,我使用了一个循环来检查每个方向(top/bottom/left/right),现在有4个简单的循环函数,看起来差不多。我想只有一个功能,但无法找到如何。你知道吗?

static boolean attackRowRt(String[] board, int y, int fromX){
        for(int x=fromX+1; x<=7; x++){
            char attacked = board[y].charAt(x);
            if(attacked == '.') continue;
            return  Character.isLowerCase(attacked);
        }
        return false;
    }

    static boolean attackRowLt(String[] board, int y, int fromX){
        for(int x=fromX-1; x>=0; x--){
            char attacked = board[y].charAt(x);
            if(attacked == '.') continue;
            return  Character.isLowerCase(attacked);
        }
        return false;
    }

    static boolean attackColBtm(String[] board, int x, int fromY){
        for(int y=fromY+1; y<=7; y++){
            char attacked = board[y].charAt(x);
            if(attacked == '.') continue;
            return  Character.isLowerCase(attacked);
        }
        return false;
    }

    static boolean attackColTop(String[] board, int x, int fromY){
        for(int y=fromY-1; y>=0; y--){
            char attacked = board[y].charAt(x);
            if(attacked == '.') continue;
            return  Character.isLowerCase(attacked);
        }
        return false;
    }
ercv8c1e

ercv8c1e1#

您的四个方法都共享三行代码,这些代码可以提取到一个单独的方法中,您可以从当前方法中调用该方法(如果将比较与 attacked ). 因此,基本上有一个单独的方法来执行以下操作,并从您的方法中调用它:

char attacked = board[y].charAt(x);
if(attacked != '.') {
  return  Character.isLowerCase(attacked);
}

此外,您的方法成对相等: attackColTop() 以及 attackRowLt 是一样的,其他两种方法也是一样的。如果唯一的区别是传递给方法的参数的值不同,则不需要两个方法做相同的事情:可以将两个方法都包含到一个方法中,然后用适当的值调用它。

35g0bw71

35g0bw712#

每种方法的逻辑都是一样的,只是走的方向不同。因此,通过将其作为参数传递,您可以对所有方向重复使用相同的方法:

static boolean attackLine(String[] board, int fromY, int fromX, int deltaX, int deltaY) {
    int x = fromX + deltaX;
    int y = fromY + deltaY;
    while (true) {
        if (x <0 || x > 7 || y <0 || y > 7) {
            // outside board, this is the end
            return false;
        }
        System.out.println(String.format("checking (x,y):(%d,%d)", x, y));
        char attacked = board[y].charAt(x);
        if (attacked != '.')
        {
            System.out.println(String.format("piece found at (x,y):(%d,%d)", x, y));
            return Character.isLowerCase(attacked);
        }
        x += deltaX;
        y += deltaY;
    }
}

public static void main(String[] args) {
    String[] board = new String[] { //
            "tc.drf.t", //
            "ppp.pppp", //
            "...p...c", //
            ".....f..", //
            "..C..P..", //
            "..P.D.P.", //
            "PP.....P", //
            "T.F.RFCT" };
    // white queen left up
    System.out.println("" + attackLine(board, 7, 4, -1, -1));
    // white queen right up
    System.out.println("" + attackLine(board, 7, 4, 1, -1));
    // white queen left down
    System.out.println("" + attackLine(board, 7, 4, -1, 1));
    // white queen right down
    System.out.println("" + attackLine(board, 7, 4, 1, 1));
    // white tower up
    System.out.println("" + attackLine(board, 7, 0, 0, -1));

}

相关问题