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.
354 lines
8.9 KiB
354 lines
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 |