Le jeu de la vie en racket - partie 2
C’est le moment d’afficher à l’écran notre génération créée au hasard la dernière fois. Je rappelle que je n’écris pas de tests pour cette partie. Pour obtenir un affichage, je me contente de suivre les exemples donnés dans la documentation drawing overview et windowing overview.
Ce qui donne la première experimentation suivante:
Le truc marrant (une façon de voir comme une autre) est que si on joue les tests, la fenêtre s’affiche. C’est pas très pratique.
Mais avant tout, ce code révèle une erreur précédente:
On dirait un code barre ! Pas vraiment une distribution uniforme.
Alors le bug est simple à trouver, par contre je vais devoir écrire un ou plusieurs nouveaux tests et je garde ça pour la fin de l’article.
Ensuite, je voudrais faire une boucle qui affiche une nouvelle génération au hasard chaque seconde. Je dois avouer que cette histoire de canvas, je la sens pas trop. Et le code que j’ai pondu s’en ressent. D’abord je mets ce qui a trait à une génération dans un module à part:
Puis, tout le bazar de frame et de canvas, aussi dans un module:
Moi qui suis habitué à des méthodes de 2 ou 3 lignes, c’est pas vraiment ça. Et puis j’ai du mal à saisir le modèle objet de Racket.
Enfin le programme principal avec la boucle:
Si j’ai le temps, j’essaierais d’utiliser la bibliothèque 2htdp/universe
,
qui me semble bien plus simple.
Maintenant le bug. Le problème est que je crée des lignes complètes de 0 ou de 1 dans la liste qui représente une génération, plutôt que de distribuer uniformément ces 0 et ces 1. Je vais donc ajouter un test qui initialise le générateur de nombres aléatoires toujours de la même manière.
Sans surprise, le test échoue.
$ racket game-of-life-test.rkt
--------------------
FAILURE
actual: ((1 1) (1 1) (0 0))
expected: ((1 0) (1 0) (1 0))
name: check-equal?
location: (#<path:/home/xavier/code/game-of-life-racket/game-of-life-test.rkt> 21 3 537 112)
expression: (check-equal? (create-generation 2 3) (quote ((1 0) (1 0) (1 0))))
message: "It populates generation uniformly"
Et voici le fix.