Vous êtes sur la page 1sur 8

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Plan

1 Rappel
Algorithmes sur les listes chaı̂nées et les types de
fonction et procédure 2 Algorithmes sur les listes chaı̂nées
I3 - Algorithmique et programmation Afficher
Obtenir le nombre d’éléments
Insérer un élément
Nicolas Delestre

3 Le jeu du serpent
Analyse
Conception

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 1 / 31 Algo. LC et type FP- v1.0.1 2 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Liste chaı̂née 1 / 2 Liste chaı̂née 2 / 2

Utilisation de fonctions et procédures


Définition
fonction listeVide () : ListeChainee
Une liste chaı̂née est soit :
fonction estVide (uneListe : ListeChainee) : Booleen
une liste vide procédure ajouter (E/S uneListe : ListeChainee,E element : Element)
un élément suivi d’une liste chaı̂née fonction obtenirElement (uneListe : ListeChainee) : Element
⌊précondition(s) non(estVide(uneListe))
fonction obtenirListeSuivante (uneListe : ListeChainee) : ListeChainee
Conception
⌊précondition(s) non(estVide(uneListe))
Type ListeChainee = ˆNoeud procédure fixerListeSuivante (E/S uneListe : ListeChainee,E nelleSuite : ListeChainee)
Type Noeud = Structure
element : Element ⌊précondition(s) non(estVide(uneListe))

listeSuivante : ListeChainee procédure supprimerTete (E/S l :ListeChainee)


⌊précondition(s) non estVide(l)
finstructure
procédure supprimer (E/S uneListe : ListeChainee)

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 3 / 31 Algo. LC et type FP- v1.0.1 4 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Algorithmes Afficher 1 / 3

Afficher les éléments d’une liste chaı̂née


Obtenir le nombre éléments d’une liste chaı̂née Version itérative (sans les fonctions et procédures)
Insérer un élément à la ième position :
procédure afficher (E l : ListeChainee)
si i > longueur (l) alors l’insertion se fait en fin de liste
debut
si i ≤ 1 alors l’insertion se fait en début de liste
tant que l 6= NIL faire
afficherElement(lˆ.element)
À chaque fois, nous allons avoir un algorithme : l ← lˆ.listeSuivante
itératif utilisant directement la structure de liste chaı̂née (utilisation fintantque
des pointeurs, des champs de structure et des procédures d’allocation fin
et libération dynamique de la mémoire)
itératif utilisant les fonctions et procédures d’encapsulation
récursif utilisant les fonctions et procédures d’encapsulation

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 5 / 31 Algo. LC et type FP- v1.0.1 6 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Afficher 2 / 3 Afficher 3 / 3

Version itérative (avec les fonctions et procédures) Version récursive (avec les fonctions et procédures)
procédure afficher (E l : ListeChainee) procédure afficher (E l : ListeChainee)
debut debut
tant que non estVide(l) faire si non estVide(l) alors
afficherElement(obtenirElement(l)) afficherElement(obtenirElement(l))
l ← obtenirListeSuivante(l) afficher(obtenirListeSuivante(l))
fintantque finsi
fin fin

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 7 / 31 Algo. LC et type FP- v1.0.1 8 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Nombre d’éléments 1 / 3 Nombre d’éléments 2 / 3

Version itérative (sans les fonctions et procédures) Version itérative (avec les fonctions et procédures)
fonction nbElements (l : ListeChainee) : Naturel fonction nbElements (l : ListeChainee) : Naturel
Déclaration res : Naturel Déclaration res : Naturel
debut debut
res ← 0 res ← 0
tant que l 6= NIL faire tant que non estVide(l) faire
res ← res+1 res ← res+1
l ← lˆ.listeSuivante l ← obtenirListeSuivante(l)
fintantque fintantque
retourner res retourner res
fin fin

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 9 / 31 Algo. LC et type FP- v1.0.1 10 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Nombre d’éléments 3 / 3 Insérer 1/3

Version itérative (sans les fonctions et procédures)


procédure inserer (E/S l : ListeChainee, E i : NaturelNonNul, e : Element)
Version récursive (avec les fonctions et procédures) Déclaration g,d,temp : ListeChaine
debut
fonction nbElements (l : ListeChainee) : Naturel si l = NIL ou i ≤ 1 alors
d←l
debut allouer(l)
lˆ.element ← e
si estVide(l) alors sinon
lˆ.listeSuivante ← d

retourner 0 g←l
d ← lˆ.listeSuivante
sinon i ← i-1
tant que i 6= 1 et d 6= NIL faire
retourner 1+nbElements(obtenirListeSuivante(l)) i ← i-1
g←d
finsi d ← dˆ.listeSuivante
fintantque
fin allouer(temp)
tempˆ.element ← e
tempˆ.listeSuivante ← d
gˆ.listeSuivante ← temp
finsi
fin

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 11 / 31 Algo. LC et type FP- v1.0.1 12 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Insérer 2/3 Insérer 3/3

Version itérative (avec les fonctions et procédures) Version récursive (avec les fonctions et procédures)
procédure inserer (E/S l : ListeChainee, E i : NaturelNonNul, e : Element)
Déclaration g,d,temp : ListeChainee
procédure inserer (E/S l : ListeChainee, E i : NaturelNonNul, e :
debut Element)
si estVide(l) ou i ≤ 1 alors Déclaration temp : ListeChainee
ajouter(l,e)
sinon debut
g←l si estVide(l) ou i ≤ 1 alors
d ← obtenirListeSuivante(l)
i ← i-1 ajouter(l,e)
tant que i 6= 1 et non estVide(d) faire sinon
i ← i-1
g←d temp ← obtenirListeSuivante(l)
d ← obtenirListeSuivante(d) inserer(temp,i-1,e)
fintantque
ajouter(d,e)
fixerListeSuivante(l,temp)
fixerListeSuivante(g,d) finsi
finsi fin
fin
as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 13 / 31 Algo. LC et type FP- v1.0.1 14 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Analyse 1 / 2

Types
On suppose posséder les types suivants :
Pour les entités du jeu : Serpent, Position, Direction
Pour la séparation de l’IHM et de la logique métier :
ObtenirDirection
Afficher

as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 16 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Analyse 2 / 2 L’air de jeu 1 / 2

Analyse descendante Conception


Soit les types Direction et Position définis de la façon suivante :

Type Direction = {nord,est,ouest,sud}


Type Position = Structure
x : NaturelNonNul
y : NaturelNonNul
finstructure
L’air de jeu est caractérisée par quatre constantes XMIN, XMAX,
YMIN, YMAX ((XMIN, YMIN) en haut à gauche (XMAX , YMAX ) en
bas à droite)

On doit donner l’algorithme de :


fonction calculerNouvellePosition (p : Position, d : Direction) :
as
Architecture des Systèmes d’Information
Position as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 17 / 31 Algo. LC et type FP- v1.0.1 18 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

L’air de jeu 2 / 2 Le serpent 1 / 7


Fonction nouvellePosition Conception
fonction nouvellePosition (p : Position, d : Direction) : Position On se propose de représenter le serpent à l’aide d’une liste chaı̂née de
Déclaration resultat : Position
debut positions, tel que la tête de la liste représentera la position de la queue du
resultat ← p
cas où d vaut serpent et le dernier élément de la liste représentera la position de la tête
est:
resultat.x ← resultat.x + 1 du serpent. Ainsi on représente le type Serpent de la façon suivante :
si resultat.x > XMAX alors
resultat.x ← XMIN Type Serpent = Structure
finsi
ouest:
tete : ListeChaineePosition
resultat.x ← resultat.x - 1
si resultat.x < XMIN alors
queue : ListeChaineePosition
finsi
resultat.x ← XMAX
finstructure
nord:
resultat.y ← resultat.y - 1
si resultat.y < YMIN alors
resultat.y ← YMAX
finsi
sud:
resultat.y ← resultat.y + 1
si resultat.y > YMAX alors
resultat.y ← YMIN
finsi
fincas

fin
retourner resultat as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 19 / 31 Algo. LC et type FP- v1.0.1 20 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Le serpent 2 / 7 Le serpent 3 / 7

On doit donner l’algorithme de :


fonction obtenirPositionTete (s : Serpent) : Position Fonction obtenirPositionTete
fonction obtenirPositionQueue (s : Serpent) : Position fonction obtenirPositionTete (s : Serpent) : Position
debut
procédure avancerEnGrandissant (E/S s : Serpent, E d : Direction) retourner obtenirPosition(s.tete)
fin
procédure avancerSansGrandir (E/S s : Serpent, E d : Direction)
procédure initSerpent (E/S s : Serpent, E tailleInitiale : Fonction obtenirPositionQueue
NaturelNonNul) fonction obtenirPositionQueue (s : Serpent) : Position
⌊précondition(s) tailleInitiale>1 et debut
tailleInitiale≤(YMAX-YMIN) div 2 retourner obtenirPosition(s.queue)
fonction estUnePositionDuSerpent (s : Serpent, p : Position) : fin
Booleen
as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 21 / 31 Algo. LC et type FP- v1.0.1 22 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Le serpent 4 / 7 Le serpent 5 / 7

Fonction avancerEnGrandissant
procédure avancerEnGrandissant (E/S s : Serpent, E d : Direction) Fonction avancerSansGrandir
Déclaration temp : ListeChaineePosition procédure avancerSansGrandir (E/S s : Serpent, E d : Direction)
debut debut
temp ← listeVide() avancerEnGrandissant(s,d)
ajouter(temp,nouvellePosition(obtenirPositionTete(s),d)) supprimerTete(s.queue)
fixerListeSuivante(s.tete,temp) fin
s.tete ← temp
fin

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 23 / 31 Algo. LC et type FP- v1.0.1 24 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Le serpent 6 / 7 Le serpent 7 / 7

Fonction initSerpent Fonction estUnePositionDuSerpent


procédure initSerpent (E/S s : Serpent, E tailleInitiale : NaturelNonNul) fonction estUnePositionDuSerpent (s : Serpent, p : Position) : Booleen
⌊précondition(s) tailleInitiale>1 et tailleInitiale≤(YMAX-YMIN) div 2 Déclaration temp : ListeChaineePosition
trouve : Booleen
Déclaration p : Position
i : Naturel debut
temp ← s.queue
debut trouve ← FAUX
p.x ← (XMAX-XMIN) div 2 tant que non estVide(temp) et non trouve faire
p.y ← (YMAX-YMIN) div 2 si obtenirPosition(temp)=p alors
s.tete ← listeVide() trouve ← VRAI
ajouter(s.tete,p) sinon
resultat.queue ← s.tete temp ← obtenirListeSuivante(temp)
pour i ←1 à tailleInitiale-1 faire finsi
avancerEnGrandissant(s,nord) fintantque
finpour retourner trouve
fin fin

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 25 / 31 Algo. LC et type FP- v1.0.1 26 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Les proies 1 / 2 Les proies 2 / 2

Conception
On suppose possède la fonction suivante qui permet d’obtenir un naturel Fonction positionAleatoireProie
aléatoire compris entre deux bornes, donnez l’algorithme de la fonction fonction positionAleatoireProie (s : Serpent) : Position
positionAleatoireProie. Déclaration resultat : Position
debut
fonction naturelAleatoire (borneInf, borneSup : Naturel) : Naturel repeter
resultat.x ← naturelAleatoire(XMIN,XMAX)
resultat.y ← naturelAleatoire(YMIN,YMAX)
⌊précondition(s) borneInf < borneSup jusqu’a ce que non estUnePositionDuSerpent(s,resultat)
retourner resultat
fin
On doit donner l’algorithme de :
fonction positionAleatoireProie (s : Serpent) : Position

as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 27 / 31 Algo. LC et type FP- v1.0.1 28 / 31


Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Le jeu 1 / 3 Le jeu 2 / 3
Séparation IHM/Logique métier
On suppose posséder :
Type ObtenirDirection = fonction(d : Direction) : Direction tant que non jeuFini faire
aff(s,pProie,score)
Type Afficher = procédure(E s : Serpent ; positionProie : Position ; score : Naturel) dir ← oDir(dir)
p ← calculerNellePosition(obtenirPositionTete(s),dir)
si estUnePositionDuSerpent(s,p) alors
jeuFini ← VRAI
Procedure jouer sinon
si p = pProie alors
procédure jouer (oDir : ObtenirDirection, aff : Afficher, tailleInitiale,tailleAgrandissementSiProieMange : NaturelNonNul)
pProie ← positionAleatoireProie(s)
⌊précondition(s) tailleInitiale>1 et tailleInitiale≤(YMAX-YMIN) div 2 tailleAgrandissementRestant ← tailleAgrandissementRestant + tailleAgrandissementSiProieMange
score ← score + 1
Déclaration s : Serpent
finsi
pProie, p : Position
si tailleAgrandissementRestant > 0 alors
tailleAgrandissementRestant,score : Naturel
avancerEnGrandissant(s,dir)
dir : Direction
tailleAgrandissementRestant ← tailleAgrandissementRestant - 1
jeuFini : Booleen
sinon
debut avancerSansGrandir(s,dir)
initSerpent(s, tailleInitiale) finsi
tailleAgrandissementRestant ← 0 finsi
score ← 0 fintantque
dir ← nord
pProie ← positionAleatoireProie(s)
jeuFini ← FAUX
voir boucle principale (transparent suivant)

fin
supprimerSerpent(s) as
Architecture des Systèmes d’Information
as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 29 / 31 Algo. LC et type FP- v1.0.1 30 / 31

Rappel Algorithmes sur les listes chaı̂nées Le jeu du serpent

Le jeu 3 / 3

Ce qu’il reste à faire


Écrire les fonctions et procédures de l’IHM :
pour obtenir la prochaine direction
pour afficher l’état du jeu
Le programme principal

Ce qui pourrait être amélioré


Avoir un type AireDeJeu (pour éviter les constantes)

as
Architecture des Systèmes d’Information

Algo. LC et type FP- v1.0.1 31 / 31