Java 八皇后-对角线运动

Java 八皇后-对角线运动,java,algorithm,n-queens,Java,Algorithm,N Queens,我有一个8乘8的棋盘,我正在尝试实现八皇后难题。在我的游戏中,我做了一个功能,检查皇后的移动,一旦我的棋盘上按下一个按钮,特定皇后可以移动的所有行和列都会被关闭,这样就不会有两个皇后互相攻击。然而,我一直在试图弄清楚如何在代码中关闭所有对角线按钮 private JButton[][] Squares = new JButton[8][8]; for (int i = 0; i < Squares.length; i++) { for (int j = 0;

我有一个8乘8的棋盘,我正在尝试实现八皇后难题。在我的游戏中,我做了一个功能,检查皇后的移动,一旦我的棋盘上按下一个按钮,特定皇后可以移动的所有行和列都会被关闭,这样就不会有两个皇后互相攻击。然而,我一直在试图弄清楚如何在代码中关闭所有对角线按钮

private JButton[][] Squares = new JButton[8][8];
for (int i = 0; i < Squares.length; i++) {
                for (int j = 0; j < Squares[i].length; j++) {
                    if(Squares[i][j].getModel().isPressed()){
                    for (int x=0; x<8; x++){
                        Squares[i][x].setEnabled(false); //turns off column buttons
                        Squares[x][j].setEnabled(false); //turns off row buttons
                        //Squares[i][j+1].setEnabled(false);
                        //Squares[i+1][j-1].setEnabled(false);


        }
private JButton[][]正方形=新JButton[8][8];
对于(int i=0;i对于(int x=0;x而言,您从
[i][j]
开始,并在两行和两列上并行前进(使用循环var
x
)。唯一棘手的部分是如何避免从板的边缘脱落。请注意,与行/列不同,对角线不一定有8个正方形

实现这一点的一种方法是,在
x
上使用相同的基本循环-

if (i+x < Squares.length && j+x < Squares[i].length)
    Squares[i+x][j+x].setEnabled(false);             
if (i-x >= 0 && j-x >= 0)
    Squares[i-x][j-x].setEnabled(false);             
if (i-x >= 0 && j+x < Squares[i].length)
    Squares[i-x][j+x].setEnabled(false);             
if (i+x < Squares.length && j-x >=0)
    Squares[i+x][j-x].setEnabled(false); 
if(i+x=0&&j-x>=0)
正方形[i-x][j-x].setEnabled(假);
如果(i-x>=0&&j+x=0)
正方形[i+x][j-x].setEnabled(假);

我不确定我是否收到了你的问题。如果你正在寻找一种方法来选择所有对角线单元格,当一个皇后出现时,这些单元格将出现在
|I-j
中(即绝对值)。下面是一个代码,其中每当
平方[indx1,indx2]
被按下,将对对角单元格执行某些操作…这有意义吗

public static void pressed(int indx1,int indx2){
    // Squares[indx1][indx2] is pressed
    // Assign 1 to diagonal cells 
    for(int i=0;i<Squares.length;i++)
    for(int j=0;j<Squares.length;j++)
        if(Math.abs(indx1-i)==Math.abs(indx2-j))
            Squares[i][j]=1;
}
按下公共静态无效(int-indx1,int-indx2){
//按下方块[indx1][indx2]
//将1指定给对角单元格

对于(int i=0;i你注意到主对角线上的正方形的坐标了吗?那上面对角线上的正方形的坐标呢?老实说,我不确定,无论我做什么尝试,我都会遇到错误,最终会陷入困境。我知道如果我尝试增加1,有时会得到一个对角线b但是,由于每次尝试硬编码时,我都会进行硬编码,如果我在最后一列/行,我经常会出错。