Le jeu de la vie
GW-Basic, utilisé par PC-Basic
Programme avec Graphique et Texte
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