You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
swish/SwichGIT/Doc/Algorithme/FonctionAnalyseEmpiler.md

8.9 KiB

ANALYSE DE CARTE#

COMPARAISON DE CARTE##

ComparaisonDeCarte(CarteMere:Matrice(4,3), Carte:Matrice(4,3)) : entier

Entrées : CarteMere et Carte :Matrice(4,3)

Sortie : entier

Objectif : Determine si les Cartes possèdent une liaison ( point <=> cercle )

DEBUT###

###Variables locales : Cox1,Cox2,Coy1,Coy2 des entiers


Si CarteMere est NULL alors

// L'assemblage est parfait car il n'y a pas de contrainte

retourne 2

Fin Si

//Recherche des coordonnées du point et du cercle sur la variable Carte

Cox1,Coy1,Cox2,Coy2 = rechercheCo(Carte)

// CAS N°1 : Il existe déjà un ensemble ( point <=> cercle) sur CarteMere là où Carte posséde un point ou un rond

Si CarteMere(Coy1,Cox1) == 3 ou CarteMere(Coy2,Cox2) == 3 alors

// Impossible d'empiler

retourne 0

Fin si

// CAS N°2 : L'empilement est parfait ! Les coordonnées du point et du cercle de Carte peuvent créer deux liaisons ( point <=> cercle ) avec CarteMere

Si CarteMere(Coy1,Cox1) == 1 et CarteMere(Coy2,Cox2) == 2 alors

// Les coordonnées sont bonnes

retourne 2

Fin Si

// CAS N°3 : Il est possible de créer une liaison ( point <=> cercle ) entre CarteMere et Carte

Si CarteMere(Coy1,Cox1) == 1 ou CarteMere(Coy2,Cox2) == 2 alors

//Liaison Possible

retourne 1

Fin si

// CAS N°4 : On ne peut rien faire avec ces cartes

retourne 0

FIN

COMPARAISON TOTAL DE LA CARTE

ComparaisonTotal(CarteMere:Matrice(4,3) d'entiers,CarteFille:Matrice(4,3), index entier):entier,Tableau(4,3) d'entiers

Entrees : CarteMere,CarteFille :Matrice(4,3), index entier

Sortie : entier,Matrice(4,3)

Objectif : Determine si les Cartes possèdent une liaison ( point <=> cercle ) MAIS avec toutes les possibilitées de rotation de Carte

###DEBUT

###Variables locales

Code,Code1 des entiers


Si CarteMere est NULL alors

// Il n'y a rien à faire

retour 1,CarteFille

Fin si

// Note : Cette fonction sait combien de fois elle a été appelée grâce à la variable index. En effet pour une carte donnée il existe 4 variantes d'elle-même. La fonction va donc appeler au fur et à mesure toutes ses variantes et les tester.

//On obtient ces opérations suivantes

Si index == 1 alors

// On effectue une rotation verticale pour obtenir la 2eme variante

CarteFille <- rotationVerticale(CarteFille)

Fin Si

Si index == 2 alors

// On effectue une rotation Horizontale pour obtenir la 3eme variante

CarteFille <- rotationHorizontale(CarteFille)

Fin Si

Si index == 3 alors

// On effectue une rotation Vertivale pour obtenir la 4eme variante

CarteFille <- rotationVerticale(CarteFille)

Fin Si

Si index == 4 alors

// aucune variante ne colle avec CarteMere

retourne -1,CarteMere

Fin Si

//Après avoir modifié CarteFille on peut tester la variante avec CarteMere

Code <- ComparaisonDeCarte(CarteMere,CarteFille)

Si Code == 2 alors

// L'empilement est parfait donc on empile les cartes

CarteMere = CarteMere + CarteFille

retourne Code,CarteMere

Fin si

Si Code == 1 alors*

// NOTE : il est important de vérifier ce cas présent. En effet si une seule liaison est possible, certaines cartes offrent plusieurs possibilités d'assemblage impliquant deux variantes. Comment savoir laquelle est la bonne pour le tas final ? La fonction va le faire remarquer.

Code1 <- ComparaisonDeCarte(TasDeCarte,rotationHorizontale(CarteFille))

Si Code1 == 1 alors

// Les variantes horizontalement symétriques possèdent toutes les deux une liaison avec CarteMere on ne peut pas savoir laquelle est la bonne pour faire le tas final.

retour 4, CarteFille

Fin Si

Si Code1 == 2 alors

// La variante horizontalement symétrique s'assemble parfaitement, on l'assemble donc.

CarteMere = CarteMere + rotationVerticale(CarteFille)

retourne 2, CarteMere

Fin Si

// On teste maintenant avec la variante verticalement symétrique

Code1 <- ComparaisonDeCarte(CarteMere,rotationVerticale(CarteFille))

Si Code1 == 2 alors

// La variante verticalement symétrique s'assemble parfaitement, on l'assemble donc.

CarteMere <- CarteMere + rotationVerticale(CarteFille)

retourne 2, CarteMere

Fin Si

Si Code1 == 1 alors

// Les variantes verticalement symétriques possèdent toutes les deux une liaison avec CarteMere on ne peut pas savoir laquelle est la bonne pour faire le tas final.

retourne 3,CarteFille

Fin Si

Fin si

// Si aucune liaison n'est possible, on appelle à nouveau la fonction en Incrémentant index

retourne ComparaisonTotal(CarteMere,CarteFille,index + 1)

FIN

ASSEMBLAGE

Assemblage(TasDeCarte: Liste Matrice(4,3),CarteMere:Matrice(4,3) :entier, Matrice(4,3)

Entree : TasDeCarte Liste Matrice(4,3), CarteMere Matrice(4,3)

Sortie : entier, Matrice(4,3)

Objectif : Savoir si un tas de carte envoyé en paramètre peut être empiler ou non

DEBUT

###Variable locale

Carte Matrice(4,3)

CopieCarteMere Matrice(4,3)

Code entier

CarteParallele Matrice(4,3)


// Si le tas de carte est NULL il ne peut pas rapporter de point donc on ne peut pas l'assembler sinon on traite la première carte

Si TasDeCarte est NULL

retourne 0, CarteMere

Sinon

Carte = teteL(TasDeCarte)

// On garde une copie de CarteMere

CopieCarteMere = CarteMere

// On regarde si Carte peut s'assembler avec CarteMere

Code,CarteMere = Comparaisontotal(CarteMere,Carte,0)

Fin si

// En fonction du Résultat obtenue on traite

// Cas 1 : Si Code vaut 2 et que TasDeCarte est NULL on a atteint la fin du paquet et l'assemblage est parfait

Si Code vaut 2 et TasDeCarte est NULL

retourne 2, CarteMere

Fin si

// Cas 2 : TasDeCarte est NULL mais l'assemblage n'est pas parfait. On ne peut pas assembler correctement le tas de carte. On le signal

Si TasDeCarte est NULL et Code different de 2

retourne 0,CarteMere

Fin si

// NOTE : à ce stade si l'algorithme lit ces lignes nous savons que TasDeCarte n'est pas NULL. Seul la valeur de Code retourné par **ComparaisonTotal nous interesse

//Cas 3 : Code vaut 2 ou 0, l'assemblage est parfait ou impossible mais il reste des cartes à traiter. Il faut donc insérer cette carte à la fin de la liste et continuer en traitant les autres carte.

Si Code vaut 2 ou Code vaut 0 ou Code vaut -1

TasDeCarte = insrq(TasDeCarte,Carte)

retourne Assemblage(TasDeCarte,CopieCarteMere)

Fin si

// Cas 4: Code vaut 3, il y a plusieur possibilitées d'assemblage.On va donc essayer les deux possibilités proposées.

//NOTE Dans ce cas la fonction comparaisontotal retourne la carte possédant la symétrie. Donc CarteMere est devenue cette carte. d'où l'importance de CopieCarteMere

Si Code vaut 3

CarteParallele = CarteMere

// On teste les deux possibilité

Code,CarteMere = Assemblage(TasDeCarte,CopieCarteMere + CarteParallele)

Code1,CarteMere1 = Assemblage(TasDeCarte,CopieCarteMere + rotationVerticale(CarteParallele))

// On regarde si l'une des deux possibilité fonctionne

Si Code1 vaut 2

retourne 2,CarteMere1

Fin si

Si Code vaut 2

retourne 2,CarteMere

Fin Si

// Sinon aucun assemblage est bon

retourne 0,CarteMere

Fin si

// Cas 5: Code vaut 4, il y a plusieur possibilitées d'assemblage.On va donc essayer les deux possibilités proposées.

Si Code vaut 4

CarteParallele = CarteMere

// On teste les deux possibilité

Code,CarteMere = Assemblage(TasDeCarte,CopieCarteMere + CarteParallele)

Code1,CarteMere1 = Assemblage(TasDeCarte,CopieCarteMere + rotationHorizontale(CarteParallele))

// On regarde si l'une des deux possibilité fonctionne

Si Code1 vaut 2

retourne 2,CarteMere1

Fin si

Si Code vaut 2

retourne 2,CarteMere

Fin Si

// Sinon aucun assemblage est bon

retourne 0,CarteMere

Fin si

// Cas 6 : Code vaut 1 On continue l'assemblage en appelant une nouvelle instance de l'algorithme.

Si Code vaut 1

retourne Assemblage(TasDeCarte,CarteMere)

Fin si

FIN