Draw the UML diagrams of the classes used in your project
- Draw the UML diagrams of the classes used in your project.
- Javadoc style documentation.
- Use of OOP, Inheritance, exceptions, and Polymorphism.
- Display four images (playing cards) randomly.
- TextField to read user input.
- Buttons to generate random images and to validate.
- JUnit test suite for at least three functions
- Validate a user-entered expression for 24.
- Record time needed to solve the problem.
- Keep a record of all user activities in a log file.
- Generate a possible solution or report no solution.
Solution
import ToolKit.PostfixNotation;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import java.util.ArrayList;
import java.util.Stack;
public class Exercise_13 extends Application {
int[] validNumbers = new int[4];
@Override
public void start(Stage primaryStage) {
// Top pane
Button btRefresh = new Button(\"Shuffle\");
Label lblStatus = new Label(\"\");
HBox topPane = new HBox(lblStatus, btRefresh);
topPane.setAlignment(Pos.BASELINE_RIGHT);
topPane.setSpacing(10);
// Center Pane
HBox centerPane = new HBox();
centerPane.setAlignment(Pos.CENTER);
centerPane.setSpacing(10);
centerPane.setPadding(new Insets(10));
// set first 4 random cards
setRandomCards(centerPane);
// Bottom pane
TextField tfExpression = new TextField();
Label lblExpression = new Label(\"Enter an expression:\");
Button btVerify = new Button(\"Verify\");
HBox bottomPane = new HBox(10, lblExpression, tfExpression, btVerify);
// Container Pane
BorderPane borderPane = new BorderPane();
borderPane.setPadding(new Insets(10));
borderPane.setTop(topPane);
borderPane.setCenter(centerPane);
borderPane.setBottom(bottomPane);
// Listeners
btRefresh.setOnAction(e -> {
lblStatus.setText(\"\");
setRandomCards(centerPane);
});
btVerify.setOnAction(e -> {
String expression = tfExpression.getText();
if (isValid(expression) && isCorrect(expression)) {
lblStatus.setText(\"Good job! \" + expression + \" = 24\");
} else {
lblStatus.setText(\"Invalid Expression\");
}
});
Scene scene = new Scene(borderPane);
primaryStage.setTitle(\"4 Random Cards\");
primaryStage.setScene(scene);
primaryStage.show();
// Debug
}
private void setRandomCards(HBox pane) {
boolean[] usedCards = new boolean[52];
// choose 4 random distinct cards from the deck
int count = 0;
pane.getChildren().clear();
while (count < 4) {
int card = (int) (Math.random() * 52);
if (!usedCards[card]) {
usedCards[card] = true;
pane.getChildren().add(new ImageView(new Image(\"image/card/\" + (++card) + \".png\")));
int value = card % 13;
validNumbers[count] = (value == 0) ? 13 : value;
count++;
}
}
}
private static boolean isOperator(char ch) {
return (ch == \'(\' ||
ch == \')\' ||
isArithmeticOperator(ch));
}
private static boolean isArithmeticOperator(char ch) {
return (ch == \'/\' ||
ch == \'+\' ||
ch == \'-\' ||
ch == \'*\');
}
private static String[] separateExpression(String s) {
ArrayList<String> tokens = new ArrayList<>(30);
char[] chars = s.toCharArray();
String numBuffer = \"\";
for (char ch : chars) {
if (isOperator(ch)) {
if (numBuffer.length() > 0) {
tokens.add(numBuffer);
numBuffer = \"\";
}
tokens.add(ch + \"\");
} else {
if (ch != \' \')
numBuffer += ch;
}
}
if (numBuffer.length() > 0) {
tokens.add(numBuffer);
}
return tokens.toArray(new String[tokens.size()]);
}
private boolean isCorrect(String infixExpression) {
return (24 == PostfixNotation.evaluateInfix(infixExpression));
}
private boolean isValid(String infixExpression) {
String[] tokens = separateExpression(infixExpression);
// Check is tokens contains any letters
for (String s : tokens) {
for (char ch : s.toCharArray()) {
if (Character.isAlphabetic(ch))
return false;
}
}
Stack<Integer> operands = new Stack<>();
for (String token : tokens) {
if (!isOperator(token.charAt(0))) {
operands.push(Integer.parseInt(token));
}
}
if (operands.size() != validNumbers.length)
return false;
// Put validNumbers into a buffer ArrayList
ArrayList<Integer> validOperands = new ArrayList<>();
for (int num : validNumbers) {
validOperands.add(num);
}
for (int i = 0; i < validOperands.size(); i++) {
int number = operands.pop();
int index = validOperands.indexOf(number);
if (index != -1) {
validOperands.remove(index);
} else {
return false;
}
}
return true;
}
public static void main(String[] args) {
Application.launch(args);
}
}



