ajout du projet

master
thchazot1 2 years ago
parent f89b81c09f
commit 20016ad19d

133
projet/.gitignore vendored

@ -0,0 +1,133 @@
# ---> JetBrains
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf
# AWS User-specific
.idea/**/aws.xml
# Generated files
.idea/**/contentModel.xml
# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml
# Gradle
.idea/**/gradle.xml
.idea/**/libraries
# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr
# CMake
cmake-build-*/
# Mongo Explorer plugin
.idea/**/mongoSettings.xml
# File-based project format
*.iws
# IntelliJ
out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# SonarLint plugin
.idea/sonarlint/
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
# Editor-based Rest Client
.idea/httpRequests
# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
# ---> macOS
# General
.DS_Store
.AppleDouble
.LSOverride
# Icon must end with two \r
Icon
# Thumbnails
._*
# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent
# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk
# ---> Java
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
replay_pid*

@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" languageLevel="JDK_18" default="true" project-jdk-name="18" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Capteurs.iml" filepath="$PROJECT_DIR$/Capteurs.iml" />
</modules>
</component>
</project>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/ressources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="lib" level="project" />
</component>
</module>

@ -0,0 +1,85 @@
# La course de dé (version JavaFX)
L'objectif de ce TP est d'ajouter une interface graphique au jeu de dé que vous avez codé en C++ en première année. Pour rappel :
> La «course de dé» se joue en lançant un dé. Les joueurs jouent tour à tour (pour ce TP nous nous limiterons à deux joueurs). Lorsque c'est à son tour, le joueur lance un dé et, tant qu'il ne fait pas 1, accumule les points des lancers successifs. S'il fait 1, il perd les points qu'il avait accumulés pendant son tour de jeu et la main passe, c'est à l'autre joueur de jouer. Un joueur peut sciemment décider d'arrêter de lancer le dé et ainsi sécuriser le score de son tour de jeu. Le premier joueur qui atteint un score de victoire (par exemple 50) gagne.
Afin de vous concenter sur l'interface graphique, nous vous fournissons la version Java du jeu que vous avez codé en C++. La conception de ce dernier est rappelé ci-dessous.
```plantuml
@startuml
skinparam defaultFontName Tahoma
skinparam classAttributeIconSize 0
skinparam monochrome true
skinparam shadowing false
skinparam linetype ortho
skinparam class {
BackgroundColor transparent
}
skinparam package {
BackgroundColor transparent
}
hide circle
package launcher {
class ConsoleGame {
+{static} main(args : String[])
}
}
package model {
class Dice {
-{static}NB_FACES_DEFAULT : int = 6 {frozen}
-nbFaces : int
-value : int
+Dice(nbFaces : int)
+Dice()
+getValue() : int
+roll() : int
+clear()
}
class Player {
-{static}num : int = 0
-name : string
-totalScore : int
-currentScore : int
+Player(name : string)
+Player()
+getName() : string
+getCurrentScore() : int
+setCurrentScore(score : int)
+getTotalScore() : int
+setTotalScore(score : int)
}
class Game {
+{static}LOSE_DICE_VALUE : int = 1 {frozen}
+{static}SCORE_TO_WIN : int = 50 {frozen}
-gameOver : boolean
-currentPlayerIndex : int
+Game()
+addPlayer(player : Player)
+getCurrentPlayer() : Player
+rollDice()
+getDiceValue() : int
+isGameOver() : boolean
+passToNextPlayer()
+restart()
}
Game --> "-dice" Dice
Game --> "*\n-players" Player
ConsoleGame ..> Game
}
@enduml
```

@ -0,0 +1,75 @@
/*
* Copyright (c) 2012, 2014 Oracle and/or its affiliates.
* All rights reserved. Use is subject to license terms.
*
* This file is available and licensed under the following license:
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the distribution.
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
root {
display: block;
}
.root {
-fx-background-image: url("https://www.francetvinfo.fr/pictures/zwzFc6PU5JuzL2NA0BwMqhCrvo0/1200x900/2016/08/23/shrek-5.jpg");
}
.label {
-fx-font-size: 12px;
-fx-font-weight: bold;
-fx-text-fill: #333333;
-fx-effect: dropshadow( gaussian , rgba(255,255,255,0.5) , 0,0,0,1 );
}
#welcome {
-fx-font-size: 75px;
-fx-font-family: "Arial Black";
-fx-fill: #818181;
-fx-effect: innershadow( three-pass-box , rgba(0,0,0,0.7) , 6, 0.0 , 0 , 2 );
}
#left{
-fx-text-fill: red;
}
.button {
-fx-text-fill: white;
-fx-font-family: "Arial Narrow";
-fx-font-weight: bold;
-fx-background-color: #B0E0E6;
-fx-effect: dropshadow( three-pass-box , rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1 );
}
.button:hover {
-fx-background-color: linear-gradient(#2A5058, #61a2b1);
}
#rectangle{
-fx-background-image: url("https://i-mom.unimedias.fr/2020/09/16/gingy-shrek.jpg?auto=format,compress&cs=tinysrgb");
}

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import java.lang.Integer?>
<?import javafx.scene.image.ImageView?>
<SplitPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<items>
<ListView fx:id="listeDesCapteurs" />
<TextArea fx:id="temperatureCapteur" wrapText="true" />
<TextArea fx:id="temperatureCapteurVirtuel"/>
</items>
</SplitPane>

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.layout.BorderPane?>
<SplitPane dividerPositions="0.3" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Integer fx:id="moins1" fx:value="-1" />
</fx:define>
<items>
<TreeView fx:id="tree"/>
</items>
</SplitPane>

@ -0,0 +1,60 @@
package launcher;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;
import javafx.stage.Stage;
import modele.Capteur;
import modele.CapteurVirtuel;
import modele.Stub;
import view.TreeViewCapteur;
import view.ViewCapteurVirtuel;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Launch extends Application {
@Override
public void start(Stage primaryStage) throws IOException {
/*Parent root = FXMLLoader.load(getClass().getResource("/fxml/Capteur.fxml"));
Scene scene = new Scene(root);*/
CapteurVirtuel leCapteurVirtuel = (CapteurVirtuel) Stub.genererCapteur();
ObservableList<Capteur> capteurs = Stub.genererObservableList();
TreeViewCapteur treeViewCapteur = new TreeViewCapteur(capteurs,"/fxml/TreeViewCapteur.fxml","Mon capteur");
Thread t = new Thread(() -> {
Random r = new Random();
while (true) {
try {
Thread.sleep(1000);
Platform.runLater(() -> {
for (ObservableMap.Entry<Float, Capteur> map : leCapteurVirtuel.getLesCapteurs().entrySet()) {
try {
map.getValue().genTemp(r.nextFloat(50));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
leCapteurVirtuel.genTemp(1);
});
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});
t.start();
}
public static void main(String args[]) {
Application.launch(args);
}
}

@ -0,0 +1,34 @@
package modele;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.beans.property.*;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public abstract class Capteur {
public Capteur(float temp, String nom) {
this.temperature.set(temp);
this.nom.set(nom);
}
private final FloatProperty temperature = new SimpleFloatProperty();
public float getTemperature() {return temperature.get();}
public FloatProperty temperatureProperty() {return temperature;}
public void setTemperature(float temperature) {this.temperature.set(temperature);}
private final StringProperty nom = new SimpleStringProperty();
public String getNom() {return nom.get();}
public StringProperty nomProperty() {return nom;}
public void setNom(String nom) {this.nom.set(nom);}
public abstract void genTemp(float x) throws IOException;
}

@ -0,0 +1,42 @@
package modele;
import javafx.beans.property.ListProperty;
import javafx.beans.property.MapProperty;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.property.SimpleMapProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;
public class CapteurVirtuel extends Capteur{
public CapteurVirtuel(float temp, String nom) {
super(temp, nom);
}
private ObservableMap<Float, Capteur> capteurObs = FXCollections.observableHashMap();
private final MapProperty<Float, Capteur> lesCapteurs = new SimpleMapProperty<>(capteurObs);
public ObservableMap<Float, Capteur> getLesCapteurs() {return lesCapteurs.getValue();}
public void setLesCapteurs(ObservableMap<Float, Capteur> value) {lesCapteurs.set(value);}
public MapProperty<Float, Capteur> lesCapteursProperty() {return lesCapteurs;}
public void addCapteur(Capteur capteur, Float poids) {
capteurObs.put(poids, capteur);
}
@Override
public void genTemp(float x) {
float tempTotal=0;
if (getLesCapteurs().size()==0){
setTemperature(0);
return;
}
for (ObservableMap.Entry<Float, Capteur> map : capteurObs.entrySet()) {
tempTotal+=map.getValue().getTemperature()*map.getKey();
}
if (getLesCapteurs().size()==0) return;
tempTotal=tempTotal/getLesCapteurs().size();
setTemperature(tempTotal);
}
}

@ -0,0 +1,19 @@
package modele;
import javafx.beans.InvalidationListener;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
public class CpuCapteur extends Capteur{
public CpuCapteur(float temperature, String nom) {
super(temperature,nom);
}
@Override
public void genTemp(float x) throws IOException {
setTemperature(Float.parseFloat(Files.readString(Path.of("/sys/class/thermal/thermal_zone2/temp"))));
}
}

@ -0,0 +1,18 @@
package modele;
import javafx.beans.InvalidationListener;
import java.util.Random;
public class RandomCapteur extends Capteur{
public RandomCapteur(float temperature, String nom) {
super(temperature, nom);
}
@Override
public void genTemp(float x) {
Random random = new Random();
setTemperature(random.nextFloat(x));
}
}

@ -0,0 +1,37 @@
package modele;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import java.util.ArrayList;
import java.util.List;
public class Stub {
public static Capteur genererCapteur() {
CapteurVirtuel retour = new CapteurVirtuel(45, "cap1");
retour.addCapteur(new CpuCapteur(12, "cap2"), 12F);
retour.addCapteur(new CpuCapteur(0, "cap3"), 7F);
retour.addCapteur(new CpuCapteur(20 ,"cap4"), 6F);
retour.addCapteur(new CpuCapteur(5, "cap5"), 4.5F);
retour.addCapteur(new RandomCapteur(25,"cap6"), 3F);
retour.addCapteur(new RandomCapteur(40,"cap7"), 1F);
retour.addCapteur(new RandomCapteur(30,"cap8"), 12F);
return retour;
}
public static ObservableList<Capteur> genererObservableList(){
List<Capteur> capteurs = new ArrayList<>();
CapteurVirtuel retour = new CapteurVirtuel(45, "cap1");
retour.addCapteur(new CpuCapteur(12, "cap2"), 12F);
retour.addCapteur(new CpuCapteur(0, "cap3"), 7F);
retour.addCapteur(new CpuCapteur(20 ,"cap4"), 6F);
retour.addCapteur(new CpuCapteur(5, "cap5"), 4.5F);
capteurs.add(retour);
capteurs.add(new CpuCapteur(0, "cap6"));
capteurs.add(new CpuCapteur(20 ,"cap7"));
capteurs.add(new CpuCapteur(5, "cap8"));
return FXCollections.observableList(capteurs);
}
}

@ -0,0 +1,19 @@
package view;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.SubScene;
import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
public class FxmlWindow extends Stage {
public FxmlWindow(String url, String title) throws IOException {
FXMLLoader loader = new FXMLLoader(this.getClass().getResource(url));
loader.setController(this);
setScene(new Scene(loader.load()));
show();
}
}

@ -0,0 +1,15 @@
package view;
import javafx.event.Event;
import javafx.fxml.FXML;
import javafx.scene.Parent;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import modele.RandomCapteur;
public class Home {
public Home() {
}
}

@ -0,0 +1,66 @@
package view;
import javafx.beans.property.ListProperty;
import javafx.beans.property.Property;
import javafx.beans.property.SimpleListProperty;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.fxml.FXML;
import javafx.scene.control.*;
import javafx.util.converter.NumberStringConverter;
import modele.Capteur;
import modele.CapteurVirtuel;
import java.io.IOException;
import java.util.ArrayList;
public class TreeViewCapteur extends FxmlWindow {
public TreeViewCapteur(ObservableList<Capteur> lesCapteurs, String url, String title) throws IOException {
super(url,title);
this.lesCapteurs = lesCapteurs;
TreeItem<Capteur> root=new TreeItem<>();
for (Capteur capteur: lesCapteurs) {
TreeItem<Capteur> item = new TreeItem<>(capteur);
addTreeItem(item);
root.getChildren().add(item);
}
tree=new TreeView<>(root);
}
private void addTreeItem(TreeItem<Capteur> cap){
if (cap.getValue() instanceof CapteurVirtuel){
for (Capteur capteur : ((CapteurVirtuel) cap.getValue()).getLesCapteurs().values()){
TreeItem<Capteur> item = new TreeItem<>(capteur);
addTreeItem(item);
cap.getChildren().add(item);
}
}
cap.getChildren().add(cap);
}
@FXML
private TreeView<Capteur> tree;
@FXML
private TextArea name;
@FXML
private TextArea temperature;
private ObservableList<Capteur> lesCapteurs;
public void initialize() {
tree.getSelectionModel().selectedItemProperty().addListener((observableValue, capteurTreeItem, t1) -> {
name.textProperty().unbindBidirectional(t1.getValue().nomProperty());
temperature.textProperty().unbindBidirectional(t1.getValue().temperatureProperty());
});
}
}

@ -0,0 +1,65 @@
package view;
import javafx.beans.property.*;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableArray;
import javafx.collections.ObservableList;
import javafx.collections.ObservableMap;
import javafx.fxml.FXML;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.TextArea;
import javafx.util.converter.NumberStringConverter;
import modele.Capteur;
import modele.CapteurVirtuel;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ViewCapteurVirtuel extends FxmlWindow {
public ViewCapteurVirtuel(CapteurVirtuel leCapteur, String url, String title) throws IOException {
super(url,title);
this.leCapteur = leCapteur;
ListProperty<Capteur> lesCapteurs = new SimpleListProperty<>(FXCollections.observableList(new ArrayList<>(leCapteur.getLesCapteurs().values())));
listeDesCapteurs.itemsProperty().bind(lesCapteurs);
temperatureCapteurVirtuel.textProperty().bindBidirectional(leCapteur.temperatureProperty(), new NumberStringConverter());
}
@FXML
private ListView<Capteur> listeDesCapteurs;
@FXML
private TextArea temperatureCapteur;
@FXML
private TextArea temperatureCapteurVirtuel;
private Capteur leCapteur;
public void initialize() {
listeDesCapteurs.setCellFactory((param) ->
new ListCell<Capteur>() {
@Override
protected void updateItem(Capteur item, boolean empty) {
super.updateItem(item, empty);
if (!empty) {
textProperty().bind(item.temperatureProperty().asString());
} else {
textProperty().unbind();
setText("");
}
}
});
listeDesCapteurs.getSelectionModel().selectedItemProperty().addListener((__,old,newV)->{
if (old != null) {
temperatureCapteur.textProperty().unbindBidirectional(old.temperatureProperty());
}
if (newV != null) {
temperatureCapteur.textProperty().bindBidirectional((Property<String>) newV.temperatureProperty().asString());
}
});
}
}

@ -0,0 +1,11 @@
package view;
import javafx.beans.InvalidationListener;
import javafx.beans.Observable;
import javafx.scene.control.Spinner;
import javafx.scene.control.TextArea;
import javafx.scene.layout.BorderPane;
import modele.RandomCapteur;
import org.w3c.dom.Text;
import java.io.IOException;
Loading…
Cancel
Save