added placement constraints

This commit is contained in:
Lukian 2025-01-18 16:16:39 +01:00
parent 064e0aba80
commit 3a641d6d56
2 changed files with 149 additions and 138 deletions

View file

@ -84,7 +84,7 @@ class Flotte
operations
ajouterBateau(bateau: Bateau)
constraints
-- Contraintes qui vérifient que les bateaux sont de la bonne taille
-- Contraintes qui vérifient le nombre de bateaux par type
inv torpilleur: bateaux->select(b: Bateau | b.type = TypeBateau::Torpilleur)->size() = 1
inv contre_torpilleur: bateaux->select(b: Bateau | b.type = TypeBateau::Contre_Torpilleur)->size() = 2
inv croiseur: bateaux->select(b: Bateau | b.type = TypeBateau::Croiseur)->size() = 1
@ -94,6 +94,8 @@ end
class Coup
attributes
type: TypeCoup
constraints
inv unicite: joueur.coups.isUnique(c: Coup | c.case = case)
end
class Plateau
@ -111,7 +113,7 @@ operations
getEtat(): TypeCase
constraints
-- Contrainte qui vérifie qu'il n'y a pas deux cases au même endroit
inv unicite: plateau.cases->select(c: Case | c.x = x and c.y = y)->size() = 1
inv unicite: plateau.cases->isUnique(c: Case | c.x = x and c.y = y)
-- Contrainte qui vérifie que le plateau est de bonne dimensions
inv dimensions: x <= 10 and x > 0 and y > 0 and y <= 10
end
@ -121,14 +123,23 @@ attributes
type: TypeBateau
longueur: Integer
etat: EtatBateau
x1: Integer
y1: Integer
x2: Integer
y2: Integer
constraints
-- Contraintes qui vérifient que les bateaux sont de la bonne taille
inv torpilleur: type = TypeBateau::Torpilleur implies longueur = 2
inv contre_torpilleur: type = TypeBateau::Contre_Torpilleur implies longueur = 3
inv croiseur: type = TypeBateau::Croiseur implies longueur = 4
inv porte_avions: type = TypeBateau::Porte_Avions implies longueur = 5
inv torpilleur1: type = TypeBateau::Torpilleur implies longueur = 2 and cases->size() = 2
inv contre_torpilleur1: type = TypeBateau::Contre_Torpilleur implies longueur = 3 and cases->size() = 3
inv croiseur1: type = TypeBateau::Croiseur implies longueur = 4 and cases->size() = 4
inv porte_avions1: type = TypeBateau::Porte_Avions implies longueur = 5 and cases->size() = 2
-- Contrainte qui dit que si toutes les cases d'un bateau sont touchées alors le bateau est coulé
inv coule: cases->forAll(c: Case | c.type = TypeCase::Touche) implies etat = EtatBateau::Coule
-- Contrainte qui vérifie que le bateau est soit horizontal soit vertical
inv orientation: x1 = x2 or y1 = y2
-- Contraintes qui vérifient que les cases du bateau correspondent bien aux coordonnées
inv horizontal: y1 = y2 implies cases.forAll(c: Case | c.y = y1 and c.x >= x1 and c.x <= x2)
inv vertical: x1 = x2 implies cases.forAll(c: Case | c.x = x1 and c.y >= y1 and c.y <= y2)
end
association Utilise between
@ -147,8 +158,8 @@ Jeu[1] role jeu2
end
association Tire between
Joueur[*] role joueur
Coup[1] role coups
Joueur[1] role joueur
Coup[0..100] role coups
end
association Appartient between

View file

@ -103,19 +103,6 @@
<target>Bateau</target>
<name>Repartit</name>
<properties>
<edgeproperty id="Repartit::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>bateau</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>-4.0</userOffsetX>
<userOffsetY>-6.0</userOffsetY>
<attached>Repartit::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Repartit::target::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="true" visible="true">
@ -130,6 +117,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Repartit::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>bateau</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>-4.0</userOffsetX>
<userOffsetY>-6.0</userOffsetY>
<attached>Repartit::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Repartit::AssociationName"
sizeCalculated="true" type="associationName"
userDefined="false" visible="true">
@ -146,6 +146,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Repartit::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>cases</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>8.0</userOffsetX>
<userOffsetY>6.0</userOffsetY>
<attached>Repartit::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Repartit::source::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="true" visible="true">
@ -160,19 +173,6 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Repartit::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>cases</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>8.0</userOffsetX>
<userOffsetY>6.0</userOffsetY>
<attached>Repartit::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
</properties>
<waypoints>
<edgeproperty id="Repartit::WayPoint::0"
@ -207,19 +207,6 @@
<target>Plateau</target>
<name>Compose</name>
<properties>
<edgeproperty id="Compose::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>plateau</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>-17.0</userOffsetX>
<userOffsetY>-5.0</userOffsetY>
<attached>Compose::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Compose::target::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="false" visible="true">
@ -234,6 +221,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Compose::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>plateau</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>-17.0</userOffsetX>
<userOffsetY>-5.0</userOffsetY>
<attached>Compose::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Compose::AssociationName"
sizeCalculated="true" type="associationName"
userDefined="false" visible="true">
@ -311,19 +311,6 @@
<target>Coup</target>
<name>Etat</name>
<properties>
<edgeproperty id="Etat::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>coup</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>46.0</userOffsetX>
<userOffsetY>-14.0</userOffsetY>
<attached>Etat::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Etat::target::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="false" visible="true">
@ -338,6 +325,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Etat::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>coup</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>46.0</userOffsetX>
<userOffsetY>-14.0</userOffsetY>
<attached>Etat::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Etat::AssociationName"
sizeCalculated="true" type="associationName"
userDefined="false" visible="true">
@ -456,6 +456,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>joueur</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>8.0</userOffsetX>
<userOffsetY>7.0</userOffsetY>
<attached>Appartient::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient::source::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="true" visible="true">
@ -470,19 +483,6 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>joueur</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>8.0</userOffsetX>
<userOffsetY>7.0</userOffsetY>
<attached>Appartient::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
</properties>
<waypoints>
<edgeproperty id="Appartient::WayPoint::0"
@ -724,6 +724,19 @@
<target>Bateau</target>
<name>Appartient2</name>
<properties>
<edgeproperty id="Appartient2::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>bateaux</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>1.0</userOffsetX>
<userOffsetY>22.0</userOffsetY>
<attached>Appartient2::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient2::target::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="true" visible="true">
@ -738,19 +751,6 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient2::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>bateaux</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>1.0</userOffsetX>
<userOffsetY>22.0</userOffsetY>
<attached>Appartient2::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient2::AssociationName"
sizeCalculated="true" type="associationName"
userDefined="false" visible="true">
@ -767,6 +767,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient2::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>flotte</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>9.0</userOffsetX>
<userOffsetY>30.0</userOffsetY>
<attached>Appartient2::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient2::source::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="false" visible="true">
@ -781,19 +794,6 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Appartient2::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>flotte</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>9.0</userOffsetX>
<userOffsetY>30.0</userOffsetY>
<attached>Appartient2::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
</properties>
<waypoints>
<edgeproperty id="Appartient2::WayPoint::0"
@ -871,19 +871,6 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Joue1::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>joueur1</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>62.0</userOffsetX>
<userOffsetY>-25.0</userOffsetY>
<attached>Joue1::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Joue1::source::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="true" visible="true">
@ -898,6 +885,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Joue1::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>joueur1</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>62.0</userOffsetX>
<userOffsetY>-25.0</userOffsetY>
<attached>Joue1::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
</properties>
<waypoints>
<edgeproperty id="Joue1::WayPoint::0" sizeCalculated="true"
@ -930,19 +930,6 @@
<target>Coup</target>
<name>Tire</name>
<properties>
<edgeproperty id="Tire::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>coups</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>-19.0</userOffsetX>
<userOffsetY>-6.0</userOffsetY>
<attached>Tire::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Tire::target::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="false" visible="true">
@ -957,6 +944,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Tire::target::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>coups</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>-19.0</userOffsetX>
<userOffsetY>-6.0</userOffsetY>
<attached>Tire::WayPoint::1</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Tire::AssociationName"
sizeCalculated="true" type="associationName"
userDefined="false" visible="true">
@ -973,19 +973,6 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Tire::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>joueur</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>47.0</userOffsetX>
<userOffsetY>9.0</userOffsetY>
<attached>Tire::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Tire::source::multiplicity"
sizeCalculated="true" type="multiplicity"
userDefined="false" visible="true">
@ -1000,6 +987,19 @@
</strategy>
<hidden>false</hidden>
</edgeproperty>
<edgeproperty id="Tire::source::rolename"
sizeCalculated="true" type="rolename" userDefined="true" visible="true">
<name>joueur</name>
<strategy type="org.tzi.use.gui.views.diagrams.elements.positioning.StrategyRelativeToAttached">
<userOffsetX>47.0</userOffsetX>
<userOffsetY>9.0</userOffsetY>
<attached>Tire::WayPoint::0</attached>
<offset_x>8</offset_x>
<offset_y>8</offset_y>
<placement>TOP</placement>
</strategy>
<hidden>false</hidden>
</edgeproperty>
</properties>
<waypoints>
<edgeproperty id="Tire::WayPoint::0" sizeCalculated="true"