Le jeu de la vie

GW-Basic, utilisé par PC-Basic

Programme avec Graphique et Texte

PC-BASIC

Des décennies avant Les Sims, il y avait le Jeu de la Vie.

Le Jeu de la Vie a été développé par le mathématicien John Conway en 1970, inspiré par un problème initialement posé par le polymathe John von Neumann.

Une fois un motif de cellules « vivantes » (pixels, dans notre programme) initialisé, le jeu se déroule automatiquement ; il suffit de se détendre et d'observer l'évolution de la vie, génération après génération, sur un plateau de jeu (ou une grille), selon les règles suivantes :

1. Mort par sous-population : une cellule vivante, entourée d'une ou deux autres cellules vivantes, meurt. (Une cellule adjacente peut se situer à huit positions différentes : au-dessus, en dessous, à gauche, à droite ou sur les quatre diagonales.)

2. Mort par surpopulation : une cellule vivante, entourée de quatre autres cellules vivantes ou plus, meurt.

3. Maintien de la vie : une cellule vivante entourée de deux ou trois autres cellules vivantes survit et se transmet à la génération suivante.

4. Reproduction : une cellule morte entourée de trois autres cellules vivantes est régénérée.

Notre version GW-BASIC du jeu… Le jeu, appelé LIFE.BAS, commence par vous présenter un choix : souhaitez-vous que le plateau de jeu soit rempli de cellules vivantes de manière aléatoire, ou préférez-vous dessiner les cellules vivantes une par une ?

Si vous préférez une génération aléatoire, il vous sera demandé combien de cellules vivantes vous souhaitez créer.

Si vous préférez dessiner, vous pourrez déplacer un curseur sur le plateau de jeu et, à l'aide du pavé numérique pour vous déplacer et en appuyant sur la barre d'espace pour activer les cellules (ou sur P pour les désactiver), créer un état initial.

Appuyer sur la touche Échap lance le jeu : des générations successives de cellules vivront et mourront.

L'outil de dessin permet d'explorer les motifs de la vie.

Par exemple, la configuration initiale d'un bloc de pixels de deux par deux est appelée « nature morte », car chaque génération reste inchangée.

Parmi les autres natures mortes, on trouve le pain, le bateau et la ruche.

Mais certaines configurations initiales oscillent.

Par exemple, le clignotement — une rangée de trois pixels adjacents — se transforme en une colonne de trois pixels à la génération suivante, puis redevient une rangée, et ainsi de suite à l'infini ; le clignotement a donc une période de deux.

Parmi les autres motifs de période deux, on trouve le phare et le crapaud.

Et des figures encore plus complexes, comme le pentade-cathlon (illustré ci-dessous), ont des périodes beaucoup plus longues.

Mais ce n'est que la partie émergée de l'iceberg. Il existe des motifs oscillants, comme des vaisseaux spatiaux, qui se déplacent et se transforment de génération en génération. Et la complexité ne s'arrête pas là.

LIFE.BAS vous permet d'explorer facilement toutes ces notions d'automates cellulaires.

Ce programme présente plusieurs techniques de programmation que nous n'avons pas encore rencontrées.

Notamment, examinez la ligne 1, qui contient l'instruction GET.

GET capture une image à l'écran et la stocke dans un tableau, ici appelé DEG. L'image capturée est celle d'un point blanc, qui sert de curseur (si l'utilisateur choisit d'initialiser manuellement le plateau de jeu avec des cellules vivantes).

La ligne 690 utilise l'instruction PUT pour placer l'image acquise par GET à l'écran. Le paramètre XOR permet au point blanc de se déplacer sur l'écran tout en laissant le fond inchangé.

Une variable INKEY$ gère le déplacement du curseur et l'initialisation (voir les lignes 692 à 800).

Les règles du Jeu de la Vie sont implémentées dans des boucles imbriquées (voir lignes 130 à 320), avec une sous-routine permettant de rafraîchir les cellules vivantes et mortes, appelée une fois par génération (à partir de la ligne 500).

Enfin, veuillez noter que le mode graphique SCREEN 7 est utilisé, et non le mode SCREEN 9 à plus haute résolution.

Bien que LIFE.BAS suive scrupuleusement les règles du Jeu de la Vie, il souffre d'un problème majeur : la lenteur.

Réduire la taille du plateau (ou de la grille) accélérerait le jeu (puisqu'il y aurait moins de pixels à gérer), même si le plateau est déjà relativement petit.

Les programmes GW-BASIC interprétés ont une vitesse d'exécution limitée, et LIFE.BAS en pâtit particulièrement.

LIFE.BAS

0 KEY OFF:SCREEN 7:COLOR 15,1:CLS
1 DIM DEG(20):PSET(1,1),15:GET(1,1)-(1,1),DEG:PSET(1,1),0
11 DIM FUTUREGEN(20,20) 'Array for cells
12 FOR X=1 TO 20:FOR Y=1 TO 20:FUTUREGEN(X,Y)=1: NEXT Y:NEXT X
15 PRINT"--- LE JEU DE LA VIE DE CONWAY ---"
16 PRINT"Entrez 1 pour des cellules aléatoires, 2 pour un tirage personnalisé.":INPUT D
17 IF D=2 THEN GOTO 600
18 INPUT"Combien de cellules aléatoires (1 to 100)";R
19 CLS
20 IF R<1 OR R>100 THEN 17
30 'Generate random initial living cells (pixels)
40 RANDOMIZE TIMER
50 FOR L=1 TO R
60 X=INT(1+20*RND(1))
70 Y=INT(1+20*RND(1))
90 FUTUREGEN(X,Y)=15
110 NEXT L
115 GOSUB 500 'Sous-programme pour dessiner les cellules vivantes initiales
120 'Aménager l'espace de vie initial
122 PSET(98,48),14:DRAW"R24 D24 L24 U24"
124 COLOR 15
125 LOCATE 1,1:PRINT"---LE JEU DE LA VIE DE CONWAY ---"
126 LOCATE 2,1:PRINT"Appuyez <ESCAPE> pour Quitter."
129 'Examinez tout autour de chaque cellule vivante (huit positions possibles).
130 FOR Y=50 TO 70
140 FOR X=100 TO 120
150 COUNT=0 'Sera utilisé pour compter le nombre de cellules autour du pixel actuel.
160 ALIVE=0 'Sera utilisé pour déterminer si la cellule est vivante.
170 IF POINT(X,Y)=15 THEN ALIVE=1 ELSE ALIVE=0 'La cellule est-elle vivante ??
180 IF POINT(X-1,Y)=15 THEN COUNT=COUNT+1
190 IF POINT(X-1,Y-1)=15 THEN COUNT=COUNT+1
200 IF POINT(X,Y-1)=15 THEN COUNT=COUNT+1
210 IF POINT(X+1,Y-1)=15 THEN COUNT=COUNT+1
220 IF POINT(X+1,Y)=15 THEN COUNT=COUNT+1
230 IF POINT(X+1,Y+1)=15 THEN COUNT=COUNT+1
240 IF POINT(X,Y+1)=15 THEN COUNT=COUNT+1
250 IF POINT(X-1,Y+1)=15 THEN COUNT=COUNT+1
260 IF ALIVE=1 AND COUNT<=1 THEN FUTUREGEN(X-100,Y-50)=1
265 IF ALIVE=1 AND COUNT>=4 THEN FUTUREGEN(X-100,Y-50)=1
270 IF ALIVE=0 AND COUNT=3 THEN FUTUREGEN(X-100,Y-50)=15
280 COUNT=0
290 ALIVE=0
300 NEXT X
310 NEXT Y
311 I$=INKEY$:IF I$=CHR$(27) THEN END
312 GOSUB 500 "Appeler la sous-routine pour redessiner
315 GEN=GEN+1
317 LOCATE 3,1:PRINT"GENERATION:";GEN
320 GOTO 120 'Créer la prochaine génération
500 'Sous-programme pour représenter graphiquement les cellules vivantes de la « future » génération
510 FOR Y=1 TO 20
520 FOR X=1 TO 20
530 PSET(X+100,Y+50),FUTUREGEN(X,Y)
540 NEXT X
550 NEXT Y
560 RETURN
600 'Sous-programme permettant à l'utilisateur de dessiner les cellules vivantes initiales
610 CLS
620 PSET(98,48),14:DRAW"R24 D24 L24 U24"
630 LOCATE 1,1:PRINT"--- LE JEU DE LA VIE DE CONWAY --
640 LOCATE 2,1:PRINT"Dessinez les emplacements initiaux des cellules vivantes"
650 LOCATE 3,1:PRINT"Utilisez: W(UP), Z(DOWN),A(D), S(G)"
660 LOCATE 4,1:PRINT"<SPACE> set point <ESCAPE> pour sortir,"
665 LOCATE 5,1:PRINT"et P pour supprimer le point "
670 X=110:Y=60
690 PUT(X,Y),DEG,XOR:FOR G=1 TO 300:NEXT G:PUT(X,Y),DEG,XOR
692 Y$=INKEY$
694 IF Y$="" THEN 690
710 IF Y$=CHR$(27) THEN CLS:GOTO 120
720 IF Y$="A" THEN X=X-1
730 IF Y$="S" THEN X=X+1
740 IF Y$="W" THEN Y=Y-1
750 IF Y$="Z" THEN Y=Y+1
751 IF X<100 THEN X=100
752 IF X>120 THEN X=120
753 IF Y<50 THEN Y=50
754 IF Y>70 THEN Y=70
760 IF Y$=" " THEN PSET(X,Y),15:FUTUREGEN(X-100, Y-50)=15
770 IF Y$="P" THEN PSET(X,Y),1:FUTUREGEN(X-100,Y-50)=1
800 GOTO 690