我有一个 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;
}