package ca.bcit.comp2522.project; import javafx.animation.Animation; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Alert; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.input.MouseButton; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; import javafx.stage.Window; import javafx.scene.layout.VBox; import javafx.scene.text.Font; import javafx.scene.text.FontWeight; import javafx.stage.Stage; import javafx.util.Duration; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Map; /** * MinesUI handles all Minesweeper UI elements, * main menu, grid generation of the minefield. * Updating button displays, disabling buttons, * showing flags, warnings, etc. * * @author Braeden Sowinski * @version 1.0.0 */ public class MinesUI { private static final int MENU_FONT_SIZE = 14; private static final int FONT_SIZE = 18; private static final Font FONT = Font.font("Arial", FontWeight.BOLD, FONT_SIZE); private static final Font MENU_FONT = Font.font("Arial", FontWeight.NORMAL, MENU_FONT_SIZE); private static final int MENU_PADDING = 5; private static final int POPUP_WIDTH = 500; private static final int POPUP_HEIGHT = 250; private static final int WINDOW_WIDTH = 900; private static final int WINDOW_HEIGHT = 700; private static final int BUTTON_WIDTH = 40; private static final int BUTTON_HEIGHT = 40; private static final int MENU_BUTTON_WIDTH = 200; private static final int MENU_BUTTON_HEIGHT = 60; private static final int PADDING = 20; private static final int GAME_PADDING = 5; private static final int VERTICAL_MARGIN = 15; private static final int TOPBAR_SPACING = 5; private static final int EASY_WIDTH = 8; private static final int EASY_HEIGHT = 8; private static final int EASY_MINES = 10; private static final int MEDIUM_WIDTH = 16; private static final int MEDIUM_HEIGHT = 16; private static final int MEDIUM_MINES = 40; private static final int HARD_WIDTH = 36; private static final int HARD_HEIGHT = 16; private static final int HARD_MINES = 99; private static final int EASY_WINDOW_WIDTH = 600; private static final int EASY_WINDOW_HEIGHT = 600; private static final int MEDIUM_WINDOW_WIDTH = 1000; private static final int MEDIUM_WINDOW_HEIGHT = 1000; private static final int HARD_WINDOW_WIDTH = 1800; private static final int HARD_WINDOW_HEIGHT = 1000; private static final int STARTING_FLAGS = 0; private static final int STARTING_SECONDS = 0; private static final int TIMER_TICK_SECONDS = 1; private static final int DEFAULT_BUTTON_KEY = -2; private static final int MINE_KEY = -1; private static final int ZERO_KEY = 0; private static final String TITLE_TEXT = "Random Mines - A Minesweeper Game"; private static final String SCORE_FILE = "./data/minesweeper-score.txt"; private static final Map BUTTON_THEMES; static { BUTTON_THEMES = new java.util.HashMap<>(); BUTTON_THEMES.put(-2, "-fx-background-color: #b3b3b3; -fx-text-fill: black;"); BUTTON_THEMES.put(-1, "-fx-background-color: #d9d9d9; -fx-text-fill: black;"); BUTTON_THEMES.put(0, "-fx-background-color: #d9d9d9; -fx-text-fill: black;"); BUTTON_THEMES.put(1, "-fx-background-color: #c8ffbf; -fx-text-fill: black;"); BUTTON_THEMES.put(2, "-fx-background-color: #edfc9f; -fx-text-fill: black;"); BUTTON_THEMES.put(3, "-fx-background-color: #fad08c; -fx-text-fill: black;"); BUTTON_THEMES.put(4, "-fx-background-color: #f59338; -fx-text-fill: black;"); BUTTON_THEMES.put(5, "-fx-background-color: #ff644d; -fx-text-fill: black;"); BUTTON_THEMES.put(6, "-fx-background-color: #ff644d; -fx-text-fill: black;"); BUTTON_THEMES.put(7, "-fx-background-color: #ff644d; -fx-text-fill: black;"); BUTTON_THEMES.put(8, "-fx-background-color: #ff644d; -fx-text-fill: black;"); } private final List