Object subclass: #Paquet instanceVariableNames: 'cartes ' classVariableNames: 'Couleurs Generateur Valeurs ' poolDictionaries: '' category: 'VL-Cartes-A-Jouer'! !Paquet methodsFor: 'accessing'! classer "Trie le paquet dans l'ordre par couleur et par valeurs" cartes := (SortedCollection withAll: cartes sortBlock: self class ordreClassique ) asOrderedCollection.! empiler: uneCarte "Ajoute une carte à la fin du paquet. Si la carte est dans un autre paquet, la retire prealablement" uneCarte retirer. cartes addLast: uneCarte. uneCarte paquet: self.! glisser: uneCarte "Ajoute une carte au debut du paquet. Si la carte est dans un autre paquet, la retire prealablement" uneCarte retirer. cartes addFirst: uneCarte. uneCarte paquet: self.! melanger "Battre les cartes" cartes size * 2 timesRepeat: [ self empiler: (self tirerUneCarte) ]! nombreDeCartes "retourne le nombre de cartes contenues dans le paquet" ^ cartes size! tirerLaDerniereCarte "Retire la derniere carte du paquet et la delivre en valeur de retour" cartes isEmpty ifTrue: [ ^nil ]. ^ self retirerCarte: cartes last! tirerLaPremiereCarte "Retire la premiere carte du paquet et la delivre en valeur de retour" cartes isEmpty ifTrue: [ ^nil ]. ^ self retirerCarte: cartes first! tirerUneCarte "Tire une carte du paquet (au hasard) et la delivre en valeur de retour" cartes isEmpty ifTrue: [ ^nil ]. ^ self retirerCarte: (cartes at: ((Generateur next * cartes size) asInteger + 1))! ! !Paquet methodsFor: 'private'! retirerCarte: uneCarte "La carte est connue comme faisant partie du paquet recepteur." uneCarte paquet: nil. cartes remove: uneCarte. ^ uneCarte! ! !Paquet methodsFor: 'initialize-release'! initialize cartes := OrderedCollection new! ! !Paquet methodsFor: 'subset accessing'! cartesDeCouleur: uneCouleur "Ramene la collection des cartes du paquet ayant la couleur donnée" "Paquet jeuDe32Cartes cartesDeCouleur: #Coeur" ^ cartes select: [:x | x couleur = uneCouleur ]! cartesDeValeur: uneValeur "Ramene la collection des cartes du paquet ayant la valeur donnée" "Paquet jeuDe32Cartes cartesDeValeur: #Roi" ^ cartes select: [:x | x valeur = uneValeur ]! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! Paquet class instanceVariableNames: ''! !Paquet class methodsFor: 'instance creation'! couleurs: lesCouleurs valeurs: lesValeurs | jeu | jeu := self new. lesCouleurs do: [:uneCouleur | lesValeurs do: [:uneValeur | jeu empiler: (Carte couleur: uneCouleur valeur: uneValeur) ]]. ^ jeu! jeuDe32Cartes "Ramene un nouveau jeu de 32 cartes" "Paquet jeuDe32Cartes" ^ self couleurs: Couleurs valeurs: self valeurs32! jeuDe52Cartes "Ramene un nouveau jeu de 52 cartes" ^ self couleurs: Couleurs valeurs: self valeurs52! new ^super new initialize! ! !Paquet class methodsFor: 'class initialization'! initialize "Paquet initialize" Couleurs := #(Coeur Pique Carreau Trefle). Valeurs := #(As 2 3 4 5 6 7 8 9 10 Valet Dame Roi). Generateur := Random new.! ! !Paquet class methodsFor: 'class accessing'! ordreClassique ^ [:uneCarte :uneAutreCarte | | i1 i2 | ((i1 := Couleurs indexOf: uneCarte couleur) < (i2 := Couleurs indexOf: uneAutreCarte couleur )) or: [ i1 = i2 and: [ ((Valeurs indexOf: uneCarte valeur) < (Valeurs indexOf: uneAutreCarte valeur )) ] ] ]! valeurs32 ^ Valeurs reject: [:x | (x isKindOf: Number) and: [ x between: 2 and: 6 ]]! valeurs52 ^ Valeurs! ! Object subclass: #Carte instanceVariableNames: 'paquet couleur valeur ' classVariableNames: '' poolDictionaries: '' category: 'VL-Cartes-A-Jouer'! !Carte methodsFor: 'initialize-release'! couleur: uneCouleur valeur: uneValeur couleur := uneCouleur. valeur := uneValeur! ! !Carte methodsFor: 'accessing'! batailleCompare: uneCarte "Ramene 0 s'il y a bataille, -1 si le recepteur est moins fort et 1 s'il est plus fort" | ordreDeBataille v1 v2 | ordreDeBataille := (2 to: 10), #(Valet Dame Roi As). v1 := ordreDeBataille indexOf: valeur. v2 := ordreDeBataille indexOf: uneCarte valeur. ^ (v1 - v2) sign! couleur ^couleur! paquet ^paquet! retirer "Si la carte appartient à un paquet, retirer la carte du paquet" paquet notNil ifTrue: [ paquet retirerCarte: self ].! valeur ^valeur! ! !Carte methodsFor: 'private'! paquet: unPaquet paquet := unPaquet! ! !Carte methodsFor: 'printing'! printOn: aStream aStream nextPutAll: '(', valeur printString, ' de ', couleur asString, ')'! ! "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! Carte class instanceVariableNames: ''! !Carte class methodsFor: 'instance creation'! couleur: uneCouleur valeur: uneValeur ^self new couleur: uneCouleur valeur: uneValeur! ! !Carte class methodsFor: 'exemples'! exemple01 | jeu c1 c2 | jeu := Paquet jeuDe32Cartes. jeu melanger. 10 timesRepeat: [ c1 := jeu tirerUneCarte. c2 := jeu tirerUneCarte. Transcript show: c1 printString, ' vs ', c2 printString, ' = ', (c1 batailleCompare: c2) printString; cr ].! ! Paquet initialize!