Java 如何使用所有可能的对组合(+;-1和+;-2)进行for循环

Java 如何使用所有可能的对组合(+;-1和+;-2)进行for循环,java,chess,Java,Chess,我正在画一个骑士在国际象棋中的可能路径,其中一个案例如下: if (boundsOK(x + 1, y + 2)) { temp = boardArray[x + 1][y + 2]; if (isLegalMove(x, y, x + 1, y + 2) != MoveType.NONE) { moves.add(x); moves.add(y); moves.add(x + 1); moves.add(y +

我正在画一个骑士在国际象棋中的可能路径,其中一个案例如下:

if (boundsOK(x + 1, y + 2)) {
    temp = boardArray[x + 1][y + 2];

    if (isLegalMove(x, y, x + 1, y + 2) != MoveType.NONE) {
        moves.add(x);
        moves.add(y);
        moves.add(x + 1);
        moves.add(y + 2);

        move(x + 1, y + 2, x, y);
    }
    boardArray[x + 1][y + 2] = temp;
}
现在,我想构造一个循环来尝试组合,而不是1和2:

 1  2

-1  2

 1 -2

-1 -2


 2  1

-2  1

 2 -1

-2 -1

但我不知道如何在没有不必要的if的情况下做到这一点。至少有一种聪明的方法可以做到这一点吗?

您可以创建一个Vector类或类似的类(或使用任何类似于Pair的类型),用您的值填充一个列表并对其进行迭代(无需考虑性能):

var moves=List.of(
新举措(1,2),
新举措(-1,2),
新动作(1,-2),
新动作(-1,-2),
新举措(2,1),
新举措(-2,1),
新举措(2,-1),
新举措(-2,-1));
for(变量移动:移动){
var x=move.getX();
var y=move.getY();
testMove(x,y)…//或重构您的方法以直接接收移动实例
}

如果您真的试图保存一些行(您是在玩代码高尔夫吗?),您可以创建带有循环的实例,但这并不能使代码变得更好(无论是从可读性角度,还是从性能角度,还是从要键入的字符数角度):

var moves=new ArrayList();
对于(int x:List.of(1,-1)){
对于(int y:List.of(2,-2)){
移动。添加(新移动(x,y));
}
}
对于(int x:List.of(2,-2)){
对于(int y:List.of(1,-1)){
移动。添加(新移动(x,y));
}
}

再仔细想想,如果我们注意到移动总是包含数字1和2,并且从来没有移动(±1,±1)或(±2,±2),它可能被压缩为2个循环和1个条件:

var moves=newarraylist(8);
var偏移=列表中的(-2,-1,1,2);
用于(整数x:偏移量){
用于(整数y:偏移){
如果(数学abs(x)!=数学abs(y)){
移动。添加(新移动(x,y));
}
}
}

但是,我仍然认为这是有利的吻(保持简单,愚蠢)的路线,并简单地写下所有可能的动作。意图很明确,行数大致相同(而且你不必想出聪明的方法来“计算”移动)。

你可以创建一个向量类或类似的类(或使用任何类似于对的类型),用你的值填充一个列表并在其上迭代(无需考虑性能):

var moves=List.of(
新举措(1,2),
新举措(-1,2),
新动作(1,-2),
新动作(-1,-2),
新举措(2,1),
新举措(-2,1),
新举措(2,-1),
新举措(-2,-1));
for(变量移动:移动){
var x=move.getX();
var y=move.getY();
testMove(x,y)…//或重构您的方法以直接接收移动实例
}

如果您真的试图保存一些行(您是在玩代码高尔夫吗?),您可以创建带有循环的实例,但这并不能使代码变得更好(无论是从可读性角度,还是从性能角度,还是从要键入的字符数角度):

var moves=new ArrayList();
对于(int x:List.of(1,-1)){
对于(int y:List.of(2,-2)){
移动。添加(新移动(x,y));
}
}
对于(int x:List.of(2,-2)){
对于(int y:List.of(1,-1)){
移动。添加(新移动(x,y));
}
}

再仔细想想,如果我们注意到移动总是包含数字1和2,并且从来没有移动(±1,±1)或(±2,±2),它可能被压缩为2个循环和1个条件:

var moves=newarraylist(8);
var偏移=列表中的(-2,-1,1,2);
用于(整数x:偏移量){
用于(整数y:偏移){
如果(数学abs(x)!=数学abs(y)){
移动。添加(新移动(x,y));
}
}
}

但是,我仍然认为这是有利的吻(保持简单,愚蠢)的路线,并简单地写下所有可能的动作。意图很明确,行数也差不多(而且你不必想出聪明的方法来“计算”移动)。

因此,没有任何方法比我只为每种情况编写40行代码更有效,对吗?为什么是40行?我数到8(每个动作一个)。使用循环生成所有可能的移动可能既不会提高可读性,也不会减少键入。是的,我指的是每种情况(单独)40行代码。编辑:最后,我有121行。我提出了第三种可能的解决方案。我还是建议写下所有可能的动作。不过,我已经用所有选项更新了我的答案。最后一个选项对我来说很有吸引力。谢谢你!!所以,没有比我为每种情况编写40行代码更有效的方法了,对吗?为什么是40行?我数到8(每个动作一个)。使用循环生成所有可能的移动可能既不会提高可读性,也不会减少键入。是的,我指的是每种情况(单独)40行代码。编辑:最后,我有121行。我提出了第三种可能的解决方案。我还是建议写下所有可能的动作。不过,我已经用所有选项更新了我的答案。最后一个选项对我来说很有吸引力。谢谢你!!