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