我正在努力解决N-Queens问题。在我的框架中,我有一个可点击的JButtons棋盘,如果你点击其中一个女王被放在那里,如果没有女王那里开始。如果那里已经有女王,它会移除女王。还有一个BoxList对象的ArrayList,用于跟踪Queens占用的Boxes。 我最初遇到的问题似乎是我的按钮动作监听器,告诉用户解决方案是否正确。
https://giphy.com/gifs/3oriOaGdBbOrr1xGwM?status=200
但我不确定这是不是确切的问题。当我运行程序并按下" safe" JButton,当电路板上没有任务时,它会显示正确的信息。但是,当我添加一个女王,然后把它带走,它没有显示消息。我已经调试了,我知道Box正在被正确删除,所以它可能是其他东西。这是全班。
import javax.swing.*;
import javax.swing.border.LineBorder;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.*;
public class ChessBoardGUI extends JFrame {
ImageIcon queenP = new ImageIcon(getClass().getResource("/images/queen.png"));
Image img = queenP.getImage();
Image newImg = img.getScaledInstance(40, 40, java.awt.Image.SCALE_SMOOTH);
ImageIcon queenPic = new ImageIcon(newImg);
private static JButton tip;
private static JButton safe;
private static JLabel ifNotSafe;
private JButton[][] chessBoxes = new JButton[8][8];
public static JPanel chessBoard;
public static ArrayList<Boxes> queensOnBoard = new ArrayList<Boxes>();
/*
* Makes the whole frame for the ChessBoard
*/
public ChessBoardGUI() {
createBoard();
createOtherThings();
setSize(500, 500);
}
/*
* Creates the Tip and Safe buttons And Label to display when the solution
* is incorrect
*/
public void createOtherThings() {
safe = new JButton("Safe?");
tip = new JButton("Tip");
ifNotSafe = new JLabel();
ButtonListen1 safeListener = new ButtonListen1();
ButtonListen2 tipListener = new ButtonListen2();
safe.addActionListener(safeListener);
tip.addActionListener(tipListener);
}
/*
* ActionListener for the safe button
*/
class ButtonListen1 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// Tells user which queens are not safe
if (checkSolution(queensOnBoard) == true) {
ifNotSafe.setText("This Solution is correct so far");
} else {
ifNotSafe.setText("This Solution is incorrect so far");
// *********Also highlight the queens that are not safe******
}
}
}
/*
* ActionListener for the tip button
*/
class ButtonListen2 implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
// ********Tells the user other places to put queens********
}
}
/*
* Creates the overall ChessBoard
*/
public void createBoard() {
GridLayout gridLayout = new GridLayout();
gridLayout.setRows(8);
gridLayout.setColumns(8);
chessBoard = new JPanel(gridLayout);
chessBoard.setSize(400, 400);
chessBoard.setBorder(new LineBorder(Color.BLACK));
chessBoard.setVisible(true);
/*
* Loops through to add each chessBox to the chessBoard
*/
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
chessBoxes[x][y] = new JButton();
chessBoxes[x][y].setBorderPainted(false);
/*
* Assigns a color to every other box
*/
if ((x + y) % 2 == 0) {
chessBoxes[x][y].setBackground(Color.BLACK);
} else {
chessBoxes[x][y].setBackground(Color.WHITE);
}
chessBoxes[x][y].setOpaque(true);
chessBoard.add(chessBoxes[x][y]);
// Adds the ActionListener to each chessBox
BoxListener boxListen = new BoxListener();
chessBoxes[x][y].addActionListener(boxListen);
}
}
}
/*
* Action Listener for if the individual boxes on the ChessBoard are clicked
*/
class BoxListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
JButton button = ((JButton) e.getSource());
// Runs through a loop to find the X and Y coordinate of the
// JButton(Box) that was clicked
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
if (chessBoxes[x][y] == button) {
/*
* If there is No Queen at that JButton
*/
if ((isOnBoard(queensOnBoard, x, y) == false)) {
// Makes sure the user can not place more than
// 8 Queens on the board
if (queensOnBoard.size() < 8) {
// Sets Picture of Queen on box
button.setIcon(queenPic);
// Adds box to the ArrayList of occupied boxes
queensOnBoard.add(new Boxes(x, y));
}
}
/*
* If there is a Queen at that JButton
*/
else {
removeQueen(queensOnBoard, x, y);
button.setIcon(null);
}
}
}
}
}
}
/*
* Checks if a certain Box has a Queen in it or not
*
* @param a Is the ArrayList of the Boxes currently occupied by Queens
*
* @param x Is the X coordinate of the Box that was clicked
*
* @param y Is the Y coordinate of the Box that was clicked
*/
public boolean isOnBoard(ArrayList<Boxes> a, int x, int y) {
for (int i = 0; i < a.size(); i++) {
if (((a.get(i)).getX() == x) && ((a.get(i)).getY() == y)) {
return true;
}
}
return false;
}
/*
* Removes a Queen from the GUI at the specified Box (JButton)
*
* @param a Is the ArrayList of the Boxes currently occupied by Queens
*
* @param x Is the X coordinate of the Box that was clicked
*
* @param y Is the Y coordinate of the Box that was clicked
*/
public void removeQueen(ArrayList<Boxes> a, int x, int y) {
/*
* Removes the box from the overall ArrayList of Boxes Occupied by
* queens according to the x and y location
*/
for (int i = 0; i < a.size(); i++) {
if (((a.get(i)).getX() == x) && ((a.get(i)).getY() == y)) {
queensOnBoard.remove(i);
}
}
}
/*
* Return to the user which queens need to be highlighted
*
* @param queensOnBoard Is the ArrayList of Boxes that are occupied by
* Queens currently on the ChessBoard
*/
public void conflictingQueens(ArrayList<Boxes> queensOnBoard) {
// *******Call the highlightBoxes method using the ArrayList
// Of Boxes you get from this method
}
/*
* Checks to see if solution is correct thusfar
*
* @param queensOnBoard Is the ArrayList of Boxes that are occupied by
* Queens currently on the ChessBoard
*/
public boolean checkSolution(ArrayList<Boxes> queensOnBoard) {
int size = queensOnBoard.size();
if (size < 1) {
return true;
}
if (size == 1) {
return true;
}
for (int x = 0; x < size - 1; x++) {
for (int y = 1; y < size; y++) {
// Checks if Queen is safe from horizontal attacks
if (queensOnBoard.get(x).getX() == queensOnBoard.get(y).getX()) {
return false;
// Checks if Queen is safe from vertical attacks
} else if (queensOnBoard.get(x).getY() == queensOnBoard.get(y).getY()) {
return false;
// Checks if Queen is safe from diagonal attacks
// Uses diagonalAttack(queensOnBoard) as a helper method
} // else if(){
// return false;
// }
}
}
return true;
}
/*
* Checks to see if the queen is safe from diagonal attacks
*
*
*/
// public boolean diagonalAttack(ArrayList<Boxes> queensOnBoard){
//********
// }
/*
* Highlights boxes that are conflicting with one another
*
* @param highlight Is the ArrayList of Boxes that are occupied by Queens
* currently on the ChessBoard
*/
public void highlightBoxes(ArrayList<Boxes> highlight) {
int size1 = highlight.size();
int size2 = queensOnBoard.size();
// When there aren't any queens at risk, this block
// changes the background colors of the boxes back to
// Their respective color
if ((size1 == 0) && size1 == 1) {
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
chessBoxes[x][y] = new JButton();
chessBoxes[x][y].setBorderPainted(false);
/*
* Assigns a color to every other box
*/
if ((x + y) % 2 == 0) {
chessBoxes[x][y].setBackground(Color.BLACK);
} else {
chessBoxes[x][y].setBackground(Color.WHITE);
}
}
}
}
// Runs through both the highlight and queensOnBoard ArrayLists and
// changes the background for the Queens at risk
for (int b = 0; b < size2; b++) {
for (int a = 0; a < size1; a++) {
if ((highlight.get(a).getX() == queensOnBoard.get(b).getX())
&& (highlight.get(a).getY() == queensOnBoard.get(b).getY())) {
int x = queensOnBoard.get(b).getX();
int y = queensOnBoard.get(b).getY();
chessBoxes[x][y].setBackground(Color.RED);
}
}
}
}
/*
* Main method to run the program
*
* @param args Is the String of args given to the console to run the
* operations of the program
*/
public static void main(String[] args) {
JFrame frame = new ChessBoardGUI();
frame.add(chessBoard);
chessBoard.setLocation(50, 50);
JPanel panel1 = new JPanel();
panel1.add(safe);
panel1.add(tip);
panel1.add(ifNotSafe);
frame.add(panel1);
frame.setTitle("ChessBoard");
frame.setVisible(true);
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
请原谅我没有完成一些零件。我已经评论出哪些空白部分最终会做什么。我遇到了这个问题,我遇到了障碍。如果我遗漏任何有用的东西,请告诉我。