Preferably in JavaFX Thanks Write a program to display all p
Preferably in JavaFX. Thanks
Write a program to display all possible solution for the Eight Queens puzzle in a scroll pane, as shown in the book in Figure 22.16. For each solution, put a label to denote the solution number.Solution
MainGUI.java
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.Tab;
import javafx.scene.control.TabPane;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.control.Button;
import javafx.scene.effect.InnerShadow;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
public class MainGUI extends Application implements EventHandler<ActionEvent> {
// ....................All possible solutions for 8 queen (8*8) chess
// board...............
private String solStringArr[] = {
\"Q...........Q..........Q.....Q....Q...........Q..Q.........Q....\",
\"Q............Q.........Q..Q...........Q....Q.....Q..........Q...\",
\"Q.............Q....Q.........Q.........Q.Q..........Q.....Q.....\",
\"Q.............Q.....Q..........Q.Q.........Q.........Q....Q.....\",
\".Q.........Q.........Q.........Q..Q.....Q.............Q.....Q...\",
\".Q..........Q.........Q.Q.........Q............Q.....Q.....Q....\",
\".Q..........Q.........Q....Q....Q..............Q.....Q....Q.....\",
\".Q...........Q..Q.............Q....Q...........Q..Q.........Q...\",
\".Q...........Q.........Q..Q.....Q..........Q..........Q.....Q...\",
\".Q............Q...Q..........Q.........Q....Q...Q..........Q....\",
\".Q............Q.....Q..........QQ..........Q.........Q....Q.....\",
\".Q.............Q.....Q..Q.........Q.........Q.........Q....Q....\",
\"..Q.....Q.............Q.....Q..........Q.Q.........Q.........Q..\",
\"..Q.........Q....Q.............QQ.............Q....Q.........Q..\",
\"..Q.........Q....Q.............Q.....Q.....Q..........Q.Q.......\",
\"..Q.........Q.........Q.Q..........Q.....Q.............Q.....Q..\",
\"..Q.........Q..........Q...Q....Q.............Q..Q...........Q..\",
\"..Q..........Q...Q..........Q..........QQ.............Q....Q....\",
\"..Q..........Q...Q............Q.Q..........Q...........Q....Q...\",
\"..Q..........Q...Q............Q.....Q...Q..............Q...Q....\",
\"..Q..........Q.....Q....Q..............Q....Q.........Q..Q......\",
\"..Q..........Q.....Q.....Q.............Q....Q.........Q.Q.......\",
\"..Q..........Q.........QQ..........Q..........Q.....Q....Q......\",
\"..Q..........Q.........QQ...........Q.........Q..Q.........Q....\",
\"..Q..........Q.........Q.Q.........Q....Q.............Q.....Q...\",
\"..Q...........Q..Q.............Q....Q...Q..........Q.........Q..\",
\"..Q...........Q..Q.............Q.....Q.....Q....Q...........Q...\",
\"..Q............Q...Q..........Q.Q............Q...Q..........Q...\",
\"...Q....Q...........Q..........Q.Q............Q...Q..........Q..\",
\"...Q....Q...........Q..........Q.....Q....Q...........Q..Q......\",
\"...Q.....Q..........Q..........Q.....Q..Q.........Q...........Q.\",
\"...Q.....Q............Q...Q..........Q.........QQ...........Q...\",
\"...Q.....Q............Q...Q..........Q.........Q....Q...Q.......\",
\"...Q.....Q............Q.....Q...Q..............Q.....Q....Q.....\",
\"...Q.....Q.............Q....Q.........Q.Q.........Q..........Q..\",
\"...Q.....Q.............Q.....Q..Q.........Q.........Q.........Q.\",
\"...Q.........Q..Q...........Q....Q.............Q..Q...........Q.\",
\"...Q.........Q.........Q.Q............Q.Q.........Q.........Q...\",
\"...Q.........Q.........Q..Q.....Q.............Q.....Q....Q......\",
\"...Q..........Q.Q..............Q....Q....Q...........Q....Q.....\",
\"...Q..........Q...Q............Q.Q..........Q...Q............Q..\",
\"...Q..........Q.....Q....Q...........Q..Q.........Q............Q\",
\"...Q..........Q.....Q.....Q.....Q............Q.........Q.Q......\",
\"...Q...........QQ.........Q..........Q...Q............Q.....Q...\",
\"...Q...........QQ...........Q.........Q..Q...........Q....Q.....\",
\"...Q...........Q....Q.....Q.....Q.............Q..Q...........Q..\",
\"....Q...Q..........Q.........Q.........Q.Q............Q...Q.....\",
\"....Q...Q..............Q...Q.....Q............Q...Q..........Q..\",
\"....Q...Q..............Q.....Q....Q...........Q..Q.........Q....\",
\"....Q....Q.........Q.........Q.........Q..Q.....Q.............Q.\",
\"....Q....Q.........Q..........Q...Q............Q.....Q..Q.......\",
\"....Q....Q...........Q..Q.............Q....Q...........Q..Q.....\",
\"....Q....Q.............QQ..........Q..........Q...Q..........Q..\",
\"....Q.....Q.....Q............Q.........Q.Q.........Q..........Q.\",
\"....Q.....Q.....Q.............Q..Q.............Q.....Q.....Q....\",
\"....Q.....Q............Q...Q..........Q.Q............Q...Q......\",
\"....Q.........Q.Q.........Q............Q.....Q.....Q.....Q......\",
\"....Q.........Q.Q..........Q.....Q.............Q.....Q....Q.....\",
\"....Q.........Q..Q.........Q...........QQ.........Q..........Q..\",
\"....Q.........Q..Q...........Q....Q.....Q..........Q...........Q\",
\"....Q.........Q..Q...........Q....Q.....Q..............Q...Q....\",
\"....Q.........Q....Q....Q.........Q............Q.....Q...Q......\",
\"....Q..........Q...Q....Q.........Q..........Q...Q............Q.\",
\"....Q..........Q...Q....Q.............Q..Q...........Q....Q.....\",
\".....Q..Q...........Q....Q.............Q..Q...........Q....Q....\",
\".....Q...Q............Q.Q.........Q.........Q..........Q...Q....\",
\".....Q...Q............Q.Q..........Q...........Q....Q.....Q.....\",
\".....Q....Q.....Q.............Q.....Q..........Q.Q.........Q....\",
\".....Q....Q.....Q..............Q...Q.....Q............Q.....Q...\",
\".....Q....Q.....Q..............Q....Q....Q.........Q..........Q.\",
\".....Q....Q.........Q.........Q.Q..........Q.....Q.............Q\",
\".....Q....Q.........Q..........QQ..........Q.....Q............Q.\",
\".....Q....Q...........Q..Q.........Q...........QQ...........Q...\",
\".....Q....Q...........Q..Q.............Q....Q...Q..........Q....\",
\".....Q....Q...........Q....Q....Q..............Q.Q..........Q...\",
\".....Q.....Q....Q...........Q..........Q.Q............Q...Q.....\",
\".....Q.....Q.....Q.............Q....Q.........Q.Q.........Q.....\",
\".....Q.....Q..........Q.Q.........Q.........Q....Q.............Q\",
\".....Q.....Q..........Q.Q..............Q.Q..........Q.....Q.....\",
\".....Q.........Q.Q.........Q....Q.............Q.....Q.....Q.....\",
\"......Q.Q.........Q............Q.....Q.....Q.....Q..........Q...\",
\"......Q..Q.........Q....Q..............Q....Q.....Q..........Q..\",
\"......Q..Q...........Q....Q.....Q..........Q...........Q....Q...\",
\"......Q...Q.....Q............Q.........Q....Q....Q.........Q....\",
\"......Q...Q............Q.Q..........Q...Q............Q.....Q....\",
\"......Q....Q.....Q..........Q..........QQ.........Q..........Q..\",
\"......Q....Q.....Q.............Q.....Q..Q.........Q.........Q...\",
\"......Q.....Q.....Q.....Q............Q.........Q.Q.........Q....\",
\".......Q.Q.........Q....Q.............Q.....Q.....Q..........Q..\",
\".......Q.Q..........Q.....Q.....Q.............Q....Q.........Q..\",
\".......Q..Q.....Q............Q...Q..........Q.........Q....Q....\",
\".......Q...Q....Q.........Q..........Q...Q............Q.....Q...\"
};
// .........................................................................
GridPane grids;
Button checkResult, resetBoardBtn;
Label warningMsgLbl;
// queen image that will be displayed in each square tile, when user clicks
// on it
Image queenImg = new Image(\"./res/queen.png\");
// stores the reference of 8 queens, so that user can be restricted to only
// 8 queens
ImageView[] queenImgView = new ImageView[8];
public MainGUI() {
warningMsgLbl = new Label(\"\");
for (int i = 0; i < 8; i++) {
queenImgView[i] = new ImageView(queenImg);
// resizing image so that it doses not exceed given button size
queenImgView[i].setFitHeight(40);
queenImgView[i].setFitWidth(40);
}
}
public static void main(String[] args) {
launch(args);
}
public void start(Stage mainStage) throws Exception {
mainStage.setTitle(\"8 Queen By : Mohit Uniyal\");
// Adding Tabs to provide solution
TabPane tabsPane = new TabPane();
Tab gameTab = new Tab(\"Game\");
Tab helpTab = new Tab(\"Help\");
// modifying tabs properties
gameTab.setClosable(false);
helpTab.setClosable(false);
tabsPane.getTabs().addAll(gameTab, helpTab);
addInfoToHelpTab(helpTab);
//applying css
gameTab.setStyle(\"-fx-background-color: blue; -fx-font: 20px \\\"Serif\\\"; \");
helpTab.setStyle(\"-fx-background-color: blue; -fx-font: 20px \\\"Serif\\\"; \");
// all the contents like chess board, label and button will be added to
// this main layout
BorderPane rootPaneBp = new BorderPane();
Scene mainScene = new Scene(tabsPane, 500, 550);
gameTab.setContent(rootPaneBp);
// center grid that will be displayed like a chess board
grids = new GridPane();
grids.setPadding(new Insets(5, 0, 5, 5));
grids.setHgap(5);
grids.setVgap(5);
// adding all buttons (chess board tiles) to the main GridPane
addImagesToGrids();
// this VBox will hold the title and the MenuBar of the game
VBox gameNameHbox = new VBox();
Label gameNameLbl = new Label(\"8 Queen Puzzle\");
gameNameHbox.getChildren().add(gameNameLbl);
// changing game name label properties
gameNameHbox.setAlignment(Pos.CENTER);
gameNameLbl.setStyle(\"-fx-font: 30px \\\"Serif\\\";\"
+ \"-fx-text-fill: white\");
// complete chess board will be displayed on the center of the window
grids.setAlignment(Pos.CENTER);
// HBox for two buttons i.e Reset Board and check Result
HBox buttonHbox = new HBox(5);
checkResult = new Button(\"Check\");
resetBoardBtn = new Button(\"Reset\");
buttonHbox.getChildren().addAll(warningMsgLbl, resetBoardBtn,
checkResult);
// applying CSS to the components
warningMsgLbl.setStyle(\"-fx-text-fill: red; -fx-font-size: 15pt;\");
// handling button event
checkResult.setOnAction(this);
resetBoardBtn.setOnAction(this);
buttonHbox.setAlignment(Pos.BOTTOM_RIGHT);
buttonHbox.setPadding(new Insets(8, 30, 10, 0));
checkResult.setStyle(\"-fx-font-size: 12pt; -fx-background-color: #c3c4c4, linear-gradient(#d6d6d6 50%, white 100%), radial-gradient(center 50% -40%, radius 200%, #e6e6e6 45%, rgba(230,230,230,0) 50%);\"
+ \"-fx-background-radius: 30; -fx-background-insets: 0,1,1; -fx-text-fill: black; -fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.6), 3, 0.0, 0, 1);\");
resetBoardBtn.setStyle(\"-fx-font-size: 12pt; -fx-background-color: #c3c4c4, linear-gradient(#d6d6d6 50%, white 100%), radial-gradient(center 50% -40%, radius 200%, #e6e6e6 45%, rgba(230,230,230,0) 50%);\"
+ \"-fx-background-radius: 30; -fx-background-insets: 0,1,1; -fx-text-fill: black; -fx-effect: dropshadow(three-pass-box, rgba(0,0,0,0.6), 3, 0.0, 0, 1);\");
// setting background color for all the components
gameNameHbox.setStyle(\"-fx-background-color: slateblue\");
grids.setStyle(\"-fx-background-color: slateblue\");
buttonHbox.setStyle(\"-fx-background-color: slateblue\");
// adding border pane contents
rootPaneBp.setTop(gameNameHbox);
rootPaneBp.setCenter(grids);
rootPaneBp.setBottom(buttonHbox);
// displaying main stage
mainStage.setScene(mainScene);
mainStage.setResizable(false);
mainStage.show();
}
//providing help tab for user
private void addInfoToHelpTab(Tab helpTab) {
BorderPane helpBp = new BorderPane();
Label helpHeadLbl = new Label();
helpHeadLbl.setText(\"How To Play\");
Label helpBodyLbl = new Label();
helpBodyLbl.setText(\"Rules\ \ 1: Place 8 queens on the chess board.\ 2: All queens must be arranged in a order, that no 2 queens can attack each other.\"
+ \"\ 3: Queen can attack in any direction horizontally, vertically and diagonally. \ 4: On Mouse click, one queen will be placed on the board.\"
+ \"\ 5: Clicking on the same queen will remove queen from chess board.\ 6: All 8 queens must be placed before clicking on \\\'check\\\' Button.\ \"
+ \"6: There are 92 solution to this puzzle.\ 7: Image below is one of the solution.\ \ \");
//vbox to wrap two helpLabels
VBox helpLblVb = new VBox();
helpLblVb.setPadding(new Insets(0,0,0,20));
helpLblVb.getChildren().addAll(helpHeadLbl,helpBodyLbl);
//below help instruction, this image will be displayed
ImageView solutionImg = new ImageView(new Image(\"./res/solution.jpg\"));
HBox solImgHb = new HBox();
solutionImg.setFitHeight(280);
solutionImg.setFitWidth(480);
solImgHb.getChildren().add(solutionImg);
solImgHb.setAlignment(Pos.CENTER);
//to wrap image and labels
VBox helpLblImgVb = new VBox();
//applying CSS to all components
helpLblImgVb.setStyle(\"-fx-background-color: slateblue\");
helpHeadLbl.setStyle(\"-fx-text-fill: white; -fx-font-size: 20pt\");
helpBodyLbl.setStyle(\"-fx-text-fill: white; -fx-font-size: 10pt\");
helpLblImgVb.getChildren().addAll(helpLblVb, solImgHb);
helpBp.setCenter(helpLblImgVb);
helpTab.setContent(helpBp);
}
// method to create different imageVeiw object and display them to the grids
// in GridPane
private Button all64Btn[][];
private void addImagesToGrids() {
// this flag will be used to alternatively identify chess board tiles so
// that a different color can be assigned to it
boolean ODDEVENFLAG = false;
String color = \"black\";
int buttonIndex = 0;
// all 64 button reference will be stored int the array of buttons
all64Btn = new Button[8][8];
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
// Alternately changing image that will be displayed on the
// button
if (ODDEVENFLAG) {
ODDEVENFLAG = false;
color = \"white\";
} else {
ODDEVENFLAG = true;
color = \"black\";
}
// setting button properties
all64Btn[i][j] = new Button();
all64Btn[i][j].setPadding(Insets.EMPTY);
all64Btn[i][j].setId(\"btn\" + \"_\" + buttonIndex);
all64Btn[i][j].setPrefHeight(50);
all64Btn[i][j].setPrefWidth(50);
all64Btn[i][j].setStyle(\"-fx-background-color: \" + color);
// finally adding button to the gridPane
grids.add(all64Btn[i][j], i, j);
buttonIndex++;
// setting action listener that will be called when button is
// pressed
all64Btn[i][j].setOnAction(this);
}
// again creating alternative change in the displayed images
ODDEVENFLAG = (ODDEVENFLAG) ? false : true;
}
}
// holds the information about imageview references that are used or available
private int[] usedImgViewRef = { 0, 0, 0, 0, 0, 0, 0, 0 };
// holds the information about used button reference
private Button[] pressedBtnArr = new Button[8];
private int totalQueenPlaced = 0;
// handling button events
public void handle(ActionEvent ae) {
Button pressedBtn = (Button) ae.getSource();
if (pressedBtn != checkResult && pressedBtn != resetBoardBtn) {
int i = 0, j = 0;
// checking for available index that can be used
while (i < 8 && usedImgViewRef[i] != 0)
i++;
if ((pressedBtn.getGraphic() == null) && (i < 8)) {
// when the button is empty adding a queen to it and also saving
// that button reference
pressedBtnArr[i] = pressedBtn;
pressedBtn.setGraphic(queenImgView[i]);
// turning image view reference to used mode i.e 1
usedImgViewRef[i] = 1;
totalQueenPlaced++;
} else {
// checking for button press, when all queens are used and still
// pressing an empty button
if (pressedBtn.getGraphic() != null) {
warningMsgLbl.setText(\"\");
// looking for reference button that will be holding
// the current button reference
while (pressedBtnArr[j] != pressedBtn)
j++;
// making that image view reference usable
usedImgViewRef[j] = 0;
pressedBtn.setGraphic(null);
pressedBtn.setEffect(null);
totalQueenPlaced--;
} else {
warningMsgLbl.setText(\"*all 8 queens are already in use\");
}
}
} else if (pressedBtn.getText().equals(\"Check\")) {
// checking for the solution i.e puzzle is solved or not
if (totalQueenPlaced == 8) {
// System.out.println(btn.getId());
String solString = getSolString();
boolean correctSol = rightSolution(solString);
// applying glow effect when solution is inncorrect
for (Button btn : pressedBtnArr) {
if (correctSol)
btn.setEffect(new InnerShadow(30, Color.YELLOW));
else
btn.setEffect(new InnerShadow(30, Color.RED));
}
// displaying messages according to result
if (correctSol) {
System.out.println(\"Success\");
// calling a method of helper package class WarnMessages
WarnMessages.displayAlertMessage(WarnMessages.SUCCESS);
} else {
WarnMessages.displayAlertMessage(WarnMessages.FAIL);
}
} else {
warningMsgLbl.setText(\"*you have to place 8 queens first\");
}
} else {
//when reset button is pressed
int i = 0;
totalQueenPlaced = 0;
for (Button btn : pressedBtnArr) {
if(btn!=null){
btn.setGraphic(null);
btn.setEffect(null);
pressedBtnArr[i] = null;
usedImgViewRef[i] = 0;
}
i++;
}
}
}
private int indx;
String getSolString() {
boolean checkFirst = true;
String solString = \"\";
indx = -1;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (checkFirst)
indx++;
if (all64Btn[j][i].getGraphic() != null) {
solString += \"Q\";
checkFirst = false;
} else
solString += \".\";
}
}
System.out.println(solString + \"fisrt : \" + indx);
return solString;
}
boolean rightSolution(String solString) {
int start = 0, end = 3;
//checking for only those solution where first row queen is placed
switch (indx) {
case 1:
start = 4;
end = 11;
break;
case 2:
start = 12;
end = 27;
break;
case 3:
start = 28;
end = 45;
break;
case 4:
start = 46;
end = 63;
break;
case 5:
start = 64;
end = 79;
break;
case 6:
start = 80;
end = 87;
break;
case 7:
start = 88;
end = 91;
break;
}
for (int i = start; i < end; i++) {
if (solString.equalsIgnoreCase(solStringArr[i])) {
return true;
}
}
return false;
}
}
WarnMessages.java
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
public class WarnMessages {
public final static int SUCCESS = 1, FAIL = 0;
static String warnMsg = \"\";
static Alert alertDialog = new Alert(AlertType.INFORMATION);
WarnMessages(){
}
static public void displayAlertMessage(int warnNo){
switch(warnNo){
case 0:
warnMsg = \"Sorry, You were close to solution, but not close enough\";
break;
case 1:
warnMsg = \"Great! You Solved It\";
break;
}
alertDialog.setTitle(\"Your Result\");
alertDialog.setHeaderText(\"8 Queen Puzzle\");
alertDialog.setContentText(warnMsg);
alertDialog.showAndWait();
}
}








