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/Doc/Algorithme/FonctionAnalyseEmpiler.md

4.7 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, CarteMere

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

Code <- 2;

TasDeCarte <- TasDeCarte + rotationVerticale(CarteFille)

retour Code, TasDeCarte

Fin Si

Si Code1 == 1 alors

Code <- 3

retour Code,TasDeCarte

Fin Si

Fin si

Si Code == 0 alors

retour ComparaisonTotal(TasDeCarte,CarteFille,index + 1)

Fin si

FIN