From 0c2c3ee5a55f36d270171f2f67938542e251fdc5 Mon Sep 17 00:00:00 2001 From: polo Date: Thu, 2 Jul 2026 00:14:17 +0200 Subject: fork utilisant maven --- .../java/vue/simulation/AfficheSimulation.java | 201 +++++++++++++++++++++ .../java/vue/simulation/SimAptAndWeaponsVBox.java | 130 +++++++++++++ src/main/java/vue/simulation/SimFigurinesVBox.java | 139 ++++++++++++++ src/main/java/vue/simulation/SimHistogramme.java | 101 +++++++++++ src/main/java/vue/simulation/SimUnitsVBox.java | 65 +++++++ 5 files changed, 636 insertions(+) create mode 100644 src/main/java/vue/simulation/AfficheSimulation.java create mode 100644 src/main/java/vue/simulation/SimAptAndWeaponsVBox.java create mode 100644 src/main/java/vue/simulation/SimFigurinesVBox.java create mode 100644 src/main/java/vue/simulation/SimHistogramme.java create mode 100644 src/main/java/vue/simulation/SimUnitsVBox.java (limited to 'src/main/java/vue/simulation') diff --git a/src/main/java/vue/simulation/AfficheSimulation.java b/src/main/java/vue/simulation/AfficheSimulation.java new file mode 100644 index 0000000..bb658a3 --- /dev/null +++ b/src/main/java/vue/simulation/AfficheSimulation.java @@ -0,0 +1,201 @@ +package vue.simulation; + + +import vue.AfficheTopMenu; + +import java.util.ArrayList; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.Scene; +import javafx.scene.control.Button; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.ScrollPane; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; +import modele.ArmeeListe; + +import modele.User; + +public class AfficheSimulation +{ + private static SimAptAndWeaponsVBox weapons_aptitudes_menu = new SimAptAndWeaponsVBox(); + public static boolean inversion = false; // pour le bouton inversion + + public static void refreshWeaponAndAptitude(SimAptAndWeaponsVBox wap) + { + weapons_aptitudes_menu.getChildren().clear(); + weapons_aptitudes_menu.getChildren().addAll(wap.getChildren()); // copie profonde + //weapons_aptitudes_menu.setStyle("-fx-border-width: 1; -fx-border-color: black; -fx-border-radius: 2; -fx-padding: 3px;"); + weapons_aptitudes_menu.setStyle("-fx-background-color: rgb(210, 210, 210); -fx-padding: 4px; -fx-border-color: black; -fx-border-radius: 4;"); + } + + public static SimAptAndWeaponsVBox getWeaponsAtitudesMenu() { + return weapons_aptitudes_menu; + } + public static void cleanWeaponsAtitudesMenu() { + weapons_aptitudes_menu = new SimAptAndWeaponsVBox(); + } + + public static void affiche(Stage primaryStage, User session) + { + // listes d'armées + ArrayList lists_of_lists = session.getListes(); // listes d'objets ArmeeListe + String[] list_names = session.getListNames(); // tableau des noms des listes + + System.out.print(session.getListes() + "wawa" + session.getListNames() + "wiwi"); + VBox root_box = new VBox(); + + AfficheTopMenu menu = new AfficheTopMenu(primaryStage, session); // menu du haut de l'écran + + HBox main = new HBox(); // partie principale de la fenêtre + + + /* -- colonne de gauche -- */ + VBox column1_box = new VBox(); + column1_box.prefWidthProperty().bind(main.widthProperty().multiply(0.3)); + + ScrollPane column1_scrollpane = new ScrollPane(); // conteneur avec barres de défilement + column1_scrollpane.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); // pas de barre horizontale + + VBox column1 = new VBox(); + column1.prefWidthProperty().bind(column1_scrollpane.widthProperty()); + + + // menu choix armée + HBox col1_first_row = new HBox(); // menu déroulant + logo faction + ChoiceBox list1_drop_down = new ChoiceBox<>(); + list1_drop_down.setStyle("-fx-font-size: 15;"); + list1_drop_down.prefWidthProperty().bind(column1_scrollpane.widthProperty()); + for(int i = 0; i < list_names.length; i++) + { + list1_drop_down.getItems().add(list_names[i]); + } + col1_first_row.getChildren().add(list1_drop_down); + column1.getChildren().add(col1_first_row); + + // unités colonne 1 (par défaut) + SimUnitsVBox units_list1 = new SimUnitsVBox(1); + column1.getChildren().add(units_list1); + column1_scrollpane.setContent(column1); + + VBox.setMargin(weapons_aptitudes_menu, new Insets(5,2,2,2)); + column1_box.getChildren().addAll(column1_scrollpane, weapons_aptitudes_menu); + + + /* -- colonne centrale -- */ + VBox column2 = new VBox(); + column2.prefWidthProperty().bind(main.widthProperty().multiply(0.4)); + column2.setAlignment(Pos.TOP_CENTER); + + // boutons inverser et simuler + Button btn_simulate = new Button("Action !!"); + btn_simulate.setStyle("-fx-font-size: 15;"); + + Image icons_inversion = new Image("/images/inversion_icons.png"); + ImageView icons_inversion_box = new ImageView(icons_inversion); + Button btn_reverse_armies = new Button(); + btn_reverse_armies.setGraphic(icons_inversion_box); + + // grande image + Image image_col2 = new Image("/images/wip.jpg"); + ImageView image_box = new ImageView(); + image_box.setPreserveRatio(true); + image_box.fitWidthProperty().bind(column2.widthProperty()); + image_box.setImage(image_col2); + + // contrairement aux VBox, ce conteneur ne s'adapte pas à la taille des ses enfants, c'est l'image qui s'adapte + Pane big_image_pane = new Pane(); + big_image_pane.getChildren().add(image_box); + + // assemblage + column2.getChildren().addAll(btn_simulate, big_image_pane, btn_reverse_armies); + + + /* -- colonne de droite -- */ + ScrollPane column3_box = new ScrollPane(); // conteneur avec barres de défilement + column3_box.prefWidthProperty().bind(main.widthProperty().multiply(0.3)); + column3_box.setHbarPolicy(ScrollPane.ScrollBarPolicy.NEVER); // pas de barre horizontale + + VBox column3 = new VBox(); + column3.prefWidthProperty().bind(column3_box.widthProperty()); + + HBox col3_first_row = new HBox(); // menu déroulant + logo faction + ChoiceBox list2_drop_down = new ChoiceBox<>(); + list2_drop_down.setStyle("-fx-font-size: 15;"); + list2_drop_down.prefWidthProperty().bind(column1_scrollpane.widthProperty()); + for(int i = 0; i < list_names.length; i++) + { + list2_drop_down.getItems().add(list_names[i]); + } + col3_first_row.getChildren().add(list2_drop_down); + column3.getChildren().add(col3_first_row); + + // unités colonne 3 + SimUnitsVBox units_list2 = new SimUnitsVBox(2); + column3.getChildren().add(units_list2); + column3_box.setContent(column3); + + + /* -- assemblage -- */ + main.getChildren().addAll(column1_box, column2, column3_box); + root_box.getChildren().addAll(menu, main); + + + /* ACTION !! */ + btn_simulate.setOnAction(e -> { + if(Battle.getSelectedList(1) != null && Battle.getSelectedList(2) != null + && Battle.getSelectedUnitIndex(1) >= 0 && Battle.getSelectedUnitIndex(2) >= 0) + { + ControlleurSimu.afficheSimu(big_image_pane, Battle.getSelectedUnit(1), Battle.getSelectedUnit(2)); + } + else { + System.out.println("conditions non remplies pour faire une simulation"); + } + }); + + + Scene scene = new Scene(root_box,800,600); + primaryStage.setTitle("Simulation"); + primaryStage.setScene(scene); + primaryStage.show(); + + + // choix des listes d'armées + ArrayList unit_lists = new ArrayList(); + unit_lists.add(units_list1); + unit_lists.add(units_list2); + ArrayList> lists_drop_down = new ArrayList>(); + lists_drop_down.add(list1_drop_down); + lists_drop_down.add(list2_drop_down);; + ArrayList first_rows = new ArrayList(); + first_rows.add(col1_first_row); + first_rows.add(col3_first_row); + for(int i = 0; i < 2; i++) + { + final int j = i; + lists_drop_down.get(i).getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + if(!inversion) { + ControlleurSimu.selectAList(j + 1, lists_of_lists, newValue); + } + ControlleurSimu.PullDownUnits(j + 1, first_rows.get(j), unit_lists.get(j)); + }); + } + + // inversion de l'attaquant et du défenseur + btn_reverse_armies.setOnAction(e -> { + if(Battle.getSelectedList(1) != null && Battle.getSelectedList(2) != null) { + ControlleurSimu.reverseArmies(lists_drop_down); + } + else { + System.out.println("conditions non remplies pour inverser listes"); + } + }); + } +} diff --git a/src/main/java/vue/simulation/SimAptAndWeaponsVBox.java b/src/main/java/vue/simulation/SimAptAndWeaponsVBox.java new file mode 100644 index 0000000..5014b59 --- /dev/null +++ b/src/main/java/vue/simulation/SimAptAndWeaponsVBox.java @@ -0,0 +1,130 @@ +package vue.simulation; + +import java.util.ArrayList; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.CheckBox; +import javafx.scene.control.ChoiceBox; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.layout.HBox; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.VBox; +import modele.Aptitude; +import modele.Arme; +import modele.Figurine; + +public class SimAptAndWeaponsVBox extends VBox +{ + private int group_number; + private String group_name; + int group_size; + String[] weapon_names; + String[] aptitude_names; + + //public SimAptAndWeaponsVBox(){} + + // setters + public void setFigGroup(int fig_group_number, String fig_group_name, int fig_group_size){ + group_number = fig_group_number; + group_name = fig_group_name; + group_size = fig_group_size; + } + public void setArmes(ArrayList weapon_list){ + weapon_names = new String[weapon_list.size()]; + for(int i = 0; i < weapon_list.size(); i++) { + weapon_names[i] = weapon_list.get(i).getNom(); + } + } + public void setAptitudes(ArrayList aptitude_list){ + aptitude_names = new String[aptitude_list.size()]; + for(int i = 0; i < aptitude_list.size(); i++) { + aptitude_names[i] = aptitude_list.get(i).getName(); + } + } + + public void setAptAndWeapons(ArrayList fig_group) + { + /* -- ligne 1: numéro du group et nom figurine -- */ + HBox first_row = new HBox(); + + // numéro du group de figurines identiques + Label number = new Label(Integer.toString(group_number)); + number.setAlignment(Pos.CENTER); + number.setMinHeight(25); + number.setMinWidth(25); + number.setStyle("-fx-text-fill: white; -fx-background-color: black; -fx-background-radius: 4;"); + HBox.setMargin(number, new Insets(0, 2, 2, 0)); + + Label figurine_name = new Label(group_name); + first_row.getChildren().addAll(number, figurine_name); + + + /* -- ligne 2: menu déroulant choix de l'arme -- */ + ChoiceBox select_weapon = new ChoiceBox(); + + // sécurité + for(int i = 0; i < weapon_names.length; i++) + { + select_weapon.getItems().add(weapon_names[i]); + } + + // valeur initiale menu déroulante + Arme weapon = Battle.getSeletedWeapon(1, group_name); + if(weapon != null) { + select_weapon.setValue(weapon.getNom()); + } + else { + select_weapon.setValue(weapon_names[0]); + } + // caractéristiques + FlowPane weapon_stats = new FlowPane(); + setWeaponStats(weapon, weapon_stats); + + select_weapon.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { + ControlleurSimu.selectAWeapon(this, newValue, fig_group, weapon_stats); + }); + + // choix du nombre d'attaquants (= nombre d'armes) + Slider nb_of_attackers = new Slider(0, group_size, Battle.getSelectedUnit(1).getAliveFigsOfAGroup(group_name)); + nb_of_attackers.setMajorTickUnit(1); + nb_of_attackers.setMinorTickCount(0); + nb_of_attackers.setSnapToTicks(true); + //nb_of_attackers.setShowTickMarks(true); + nb_of_attackers.setShowTickLabels(true); + //nb_of_attackers.setBlockIncrement(1); + + nb_of_attackers.valueProperty().addListener((observable, oldValue, newValue) -> { + ControlleurSimu.AliveFigsChoice(1, newValue.intValue(), group_name); + }); + + // checkbox + FlowPane aptitudes = new FlowPane(); + for(int i = 0; i < aptitude_names.length; i++) + { + CheckBox one_aptitude = new CheckBox(aptitude_names[i]); + one_aptitude.setStyle("-fx-padding: 2px;"); + aptitudes.getChildren().add(one_aptitude); + + one_aptitude.setOnAction(e -> { + ControlleurSimu.checkOrUncheckAnAptitude(one_aptitude.isSelected(), one_aptitude.getText(), fig_group); + }); + } + + this.getChildren().addAll(first_row, select_weapon, weapon_stats, nb_of_attackers, aptitudes); + } + + public void setWeaponStats(Arme weapon, FlowPane weapon_stats) { + weapon_stats.setStyle("-fx-padding: 3px;"); + Label A = new Label("A " + weapon.getA() + " | "); + Label F = new Label("F " + weapon.getF() + " | "); + Label PA = new Label("PA " + weapon.getPA() + " | "); + Label D = new Label("D " + weapon.getD() + " | "); + Label portee = new Label("portée " + weapon.getPortee()); + weapon_stats.getChildren().addAll(A, F, PA, D, portee); + } +} + diff --git a/src/main/java/vue/simulation/SimFigurinesVBox.java b/src/main/java/vue/simulation/SimFigurinesVBox.java new file mode 100644 index 0000000..4940917 --- /dev/null +++ b/src/main/java/vue/simulation/SimFigurinesVBox.java @@ -0,0 +1,139 @@ +package vue.simulation; + +import java.util.ArrayList; +import java.util.HashMap; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.control.Spinner; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.layout.HBox; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.VBox; +import modele.Figurine; +import modele.Unit; + +public class SimFigurinesVBox extends VBox +{ + private Unit unit; + private int column; + private ArrayList weapons_aptitudes_menu_view = new ArrayList(); + private boolean open = false; // les figurines sont cachées par défaut + + public SimFigurinesVBox(int col, Unit unit){ + column = col; + this.unit = unit; + this.setStyle("-fx-padding: 2px;"); + } + + public boolean isOpen(){ + return open; + } + public void changeState(){ + open ^= true; // inversion de bouléen avec un masque 00000001 + } + + public void setFigurines() + { + /* -- boucle sur les groupes de figuriones -- */ + int i = 0; // valeurs des boutons numérotés + for(HashMap.Entry> entry : unit.getIdenticalFigsGroups().entrySet()) + { + FlowPane fig_group = new FlowPane(); + //fig_group.setStyle("-fx-background-color: rgb(220, 220, 220);"); + String fig_name = entry.getKey(); + ArrayList fig_list = entry.getValue(); + i++; + if(column == 1) + { + // boutons numérotés des groupes de figurines + Button number = new Button(Integer.toString(i)); + number.setAlignment(Pos.CENTER); + number.setMinHeight(25); + number.setMinWidth(25); + number.setStyle("-fx-text-fill: white; -fx-background-color: black;"); + fig_group.getChildren().add(number); + + // zone des armes et aptitudes + SimAptAndWeaponsVBox weapons_aptitudes_menu = new SimAptAndWeaponsVBox(); + weapons_aptitudes_menu.setFigGroup(i, fig_name, fig_list.size()); + weapons_aptitudes_menu_view.add(weapons_aptitudes_menu); + + number.setOnAction(e -> + { + ControlleurSimu.makeWeaponsAndAptitudeZone(fig_list, weapons_aptitudes_menu); + }); + } + else { + Label fig_name_label = new Label(fig_name); + fig_name_label.setStyle("-fx-padding: 0 5px 0 0"); + fig_group.getChildren().add(fig_name_label); + + Slider nb_of_defenders = new Slider(0, fig_list.size(), + Battle.getSelectedUnit(2).getAliveFigsOfAGroup(fig_name)); + nb_of_defenders.setMajorTickUnit(1); + nb_of_defenders.setMinorTickCount(0); + nb_of_defenders.setSnapToTicks(true); + //nb_of_attackers.setShowTickMarks(true); + nb_of_defenders.setShowTickLabels(true); + //nb_of_attackers.setBlockIncrement(1); + + fig_group.getChildren().add(nb_of_defenders); + + nb_of_defenders.valueProperty().addListener((observable, oldValue, newValue) -> { + ControlleurSimu.AliveFigsChoice(2, newValue.intValue(), fig_name); + }); + } + + + /* -- figurines d'un groupe -- */ + for(Figurine fig : fig_list) + { + HBox one_fig_box = new HBox(); + Image one_image; + if(fig.getHP() > 0) { + one_image = new Image("/images/android-fill.png"); + } + else { + one_image = new Image("/images/android-line.png"); + } + ImageView one_image_box = new ImageView(); + one_image_box.setPreserveRatio(true); + //one_image_box.setFitHeight(24); // appeler une des deux méthodes de dimensionnement + one_image_box.setFitWidth(24); + one_image_box.setImage(one_image); + one_fig_box.getChildren().add(one_image_box); + + if(column == 1) { + Label hp_label = new Label(fig.getHP() + " PV "); + one_fig_box.getChildren().add(hp_label); + } + else { + Label hp_label = new Label("PV:"); + Spinner spinner = new Spinner<>(0, fig.getHPMax(), fig.getHP()); + spinner.setMaxWidth(55); + one_fig_box.getChildren().add(hp_label); + one_fig_box.getChildren().add(spinner); + one_fig_box.setStyle("-fx-padding: 0 3px 0 0;"); + + spinner.valueProperty().addListener((obs, oldValue, newValue) -> { + ControlleurSimu.hpUpdate(newValue, fig, one_image_box); + }); + } + + SimFigurinesVBox.setMargin(one_fig_box, new Insets(5)); + fig_group.getChildren().add(one_fig_box); + } + SimFigurinesVBox.setMargin(fig_group, new Insets(3)); + + this.getChildren().add(fig_group); + } + } +} + diff --git a/src/main/java/vue/simulation/SimHistogramme.java b/src/main/java/vue/simulation/SimHistogramme.java new file mode 100644 index 0000000..519c90b --- /dev/null +++ b/src/main/java/vue/simulation/SimHistogramme.java @@ -0,0 +1,101 @@ +package vue.simulation; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.chart.Axis; +import javafx.scene.chart.BarChart; +import javafx.scene.chart.CategoryAxis; +import javafx.scene.chart.NumberAxis; +import javafx.scene.chart.XYChart; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import javafx.stage.Stage; + +public class SimHistogramme extends Pane{ + private Pane p; + + + +// public SimHistogramme() { +// super(); +// } + + public static void setHist(int[] tabdegat ,int[] tabmort, float degat_moyen ,float mort_moyen,Pane p) { + Axis xAxis = new CategoryAxis(); + xAxis.setLabel("nbr mort"); + + NumberAxis yAxis = new NumberAxis(); + yAxis.setLabel("pourcentage"); + + Axis xAxis2 = new CategoryAxis(); + xAxis2.setLabel("nbr degat"); + + javafx.scene.chart.NumberAxis yAxis2 = new NumberAxis(); + yAxis2.setLabel("pourcentage"); + + // Create a BarChart + BarChart barChart = new BarChart(xAxis, yAxis); + BarChart barChart2 = new BarChart(xAxis2, yAxis2); + + // Series 1 - Data of 2014 + XYChart.Series dataSeries1 = new XYChart.Series(); + //dataSeries1.setName("mort moyen : "+mort_moyen); + for(int i=0;i(""+i , tabmort[i]/100)); + } + } + + //barChart.getData().add(dataSeries1); + + + // Series 1 - Data of 2014 + XYChart.Series dataSeries2 = new XYChart.Series(); + //dataSeries2.setName("degat moyen : "+degat_moyen); + for(int i=0;i(""+i , tabdegat[i]/100)); + } + } + + barChart.getData().add(dataSeries1); + barChart2.getData().add(dataSeries2); + + + + VBox vbox = new VBox(); + vbox.getChildren().add(barChart); + vbox.getChildren().add(barChart2); + barChart.maxWidthProperty().bind(p.widthProperty()); + barChart2.maxWidthProperty().bind(p.widthProperty()); + barChart2.prefHeight(150); + barChart.prefHeight(150); + barChart.lookupAll(".default-color0.chart-bar") + .forEach(n -> n.setStyle("-fx-bar-fill: red;")); + barChart2.lookupAll(".default-color0.chart-bar") + .forEach(n -> n.setStyle("-fx-bar-fill: green;")); + + + barChart.setMaxHeight(220); + barChart2.setMaxHeight(220); + barChart.prefHeight(200); + barChart.setLegendVisible(false); + barChart2.setLegendVisible(false); + barChart.setTitle("nbr mort moyen : "+mort_moyen); + barChart2.setTitle("nbr degat moyen : "+degat_moyen); + barChart2.prefHeight(200); + VBox.setVgrow(barChart, Priority.ALWAYS); + VBox.setVgrow(barChart2, Priority.ALWAYS); + //vbox.setSpacing(10); + + + p.getChildren().add(vbox); + } + + + + + //BarChart barChart = new BarChart(xAxis, yAxis); + +} + diff --git a/src/main/java/vue/simulation/SimUnitsVBox.java b/src/main/java/vue/simulation/SimUnitsVBox.java new file mode 100644 index 0000000..df02f82 --- /dev/null +++ b/src/main/java/vue/simulation/SimUnitsVBox.java @@ -0,0 +1,65 @@ +package vue.simulation; + +import java.util.ArrayList; + +import application.Battle; +import controlleur.ControlleurSimu; +import javafx.scene.control.Button; +import javafx.scene.layout.VBox; +import modele.Unit; + +public class SimUnitsVBox extends VBox +{ + private ArrayList