八皇后 - 对角线运动



我有一个 8 x 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);

        }

一旦女王被放置在棋盘上,我需要做什么才能禁用所有对角线按钮?

编辑:我注意到,如果我这样做Squares[x][x].setEnabled(false);那么它会给我两个对角线之一,但是这只给了对角线一次,单击第二个按钮后一切都会中断。

我最近回答了一个关于 SO 的类似问题。

你可以在这里查看我的代码来回答类似的问题。

但基本上,如果你的女王的位置是[a][b].您想检查另一个位置的坐标[x][y]是否在对角线上。

  • y-x == b-a单元格是否位于同一对角线上。
  • x+y == a+b单元格是否位于同一左侧对角线上。

希望这有帮助。

你从 [i][j] 开始,并继续前进(使用你的循环变量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); 

我不确定我是否得到了你的问题。如果您正在寻找一种方法来选择女王放置时的所有对角线单元格,那么已知这些单元格将出现在|i-j|(即绝对值)。这是一个代码,每当按下Squares[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;
}

最新更新