avril
2009
Un des premiers algorithmes que je vais détailler, c’est la distribution des cartes initiales.
Dans le projet, les cartes sont sous deux formes:
– une forme physique: format.png. Il s’agit du jeu de cartes de David Bellot disponible en svg, que j’ai découpé et transformé en cartes de 103×150 pixels sous format png.
– une forme symbolique: par exemple: #As_of_Hearts ou #King_of_Spades.
Le programme stocke donc un dictionnaire ayant en clé le symbole et en valeur l’image. (cards at: #As_of_Hearts -> renvoie l’image de l’as de coeur).
La méthode firstDistrib consiste donc à tout d’abord mélanger aléatoirement les symboles pour constituer une liste de symboles (pile) qui est ensuite distribuée aux 4 joueurs.
Voici le code commenté, et !! non optimisé pour en faciliter la lecture !!
| randomizateur cartes position card alea cartJ1 cartJ2 cartJ3 cartJ4 |
randomizateur := Random new. "générateur de nombres aléatoires"
pile := OrderedCollection new. "la pile de carte qui va être créé"
cartes := self referenceCards copy.
32
timesRepeat:
[alea := randomizateur next.
position := (alea * (cartes size - 1)) rounded.
position := position + 1. "obtient un random * n - 1. random étant entre 0 et 1, le résultat de la multiplication est 0 < x < n-1. En ajoutant ensuite 1, le résultat devient 1 < x < n"
pile add: (cartes at: position).
cartes removeAtIndex: position]. "pioche aléatoirement dans le paquet de cartes et l'ajoute dans la pile. Enlève la carte piochée de manière à ce qu'elle ne participe plus au tirage. On obtient une pile aléatoire de cartes à distribuer"
cartJ1 := OrderedCollection new.
cartJ2 := OrderedCollection new.
cartJ3 := OrderedCollection new.
cartJ4 := OrderedCollection new. "distribue maintenant la pile de cartes"
3
timesRepeat:
[card := pile removeFirst.
cartJ2 add: card].
3
timesRepeat:
[card := pile removeFirst.
cartJ3 add: card].
3
timesRepeat:
[card := pile removeFirst.
cartJ4 add: card].
3
timesRepeat:
[card := pile removeFirst.
cartJ1 add: card].
2
timesRepeat:
[card := pile removeFirst.
cartJ2 add: card].
2
timesRepeat:
[card := pile removeFirst.
cartJ3 add: card].
2
timesRepeat:
[card := pile removeFirst.
cartJ4 add: card].
2
timesRepeat:
[card := pile removeFirst.
cartJ1 add: card]. "fin de la distribution"
(joueurs at: 'Wu_Wei') cards: cartJ1.
(joueurs at: 'Joueur2') cards: cartJ2.
(joueurs at: 'Joueur3') cards: cartJ3.
(joueurs at: 'Joueur4') cards: cartJ4.
card := pile removeFirst. "prend la première carte des non distribuées"
returnedCard := card. "la désigne comme carte retournée"
self changed "envoie un message d'update aux dépendents"