八皇后 - 对角线运动

时间:2014-11-14 20:21:12

标签: 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; 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);那么它会给我两个对角线中的一个,但这只给对角线一次,点击第二个按钮后一切都会断开。

2 个答案:

答案 0 :(得分:0)

您从[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); 

答案 1 :(得分:0)

我不确定我是否收到你的问题。如果您正在寻找一种方法来选择所有对角线单元格,那么就知道那些单元格会出现在|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;
}