Le listing du mois : simulateur de vie (Blitz Basic) par Sylvain Terret
Non
Non, vous n'avez pas sous les yeux un énième tutoriel sur le Blitz Basic, il est plutôt question ici
d'un vieil ami oublié, mais néanmoins apprécié : Le Listing du Mois (et pourquoi pas de
l'Année). Vous l'avez sans doute remarqué, la presse informatique est devenue bien ennuyeuse pour qui
n'est pas benchmarkophile ou soucieux de savoir que la version 2004 de la suite bureautique Y est révolutionnaire
par rapport à la mouture précédente, car intégrant une méga nouvelle fonction de zigouigoui
machintruc qui permet au premier collègue venu de pourrir notre boîte e-mail et de lagger tout l'Internet
à grands coups de scripts PPS de 5 Mo. Où donc sont passés les magazines remplis de listings ? Sommes-nous
condamnés à lire de la pub pour des PC bidons, des articles sur la meilleure façon de configurer sa
barre des tâches ou des tests d'imprimante/scanner/fax ? Est-ce que ce n'est plus que ça la micro ?!
Moi je dis...
Moi, je dis stop. Stop à la misère intellectuelle et culturelle qui ronge les médias et qui nous tire
tous vers le bas. Nous sommes autre chose que des parts de marché/ cibles produit / temps de cerveau humain / brique dans
un mur (oui, il y a un clin d'oeil là). C'est en songeant à tout cela que j'ai eu envie d'utiliser Obligement
et l'Amiga pour nuancer (un petit peu) cette triste situation. Voici donc un court programme pas trop mal écrit qui
vous permettra, je l'espère, de passer un bon moment... de réflexion :-)
Un simulateur
Le code présenté ici est celui d'un simulateur de vie de cellules, classique. Vous pouvez consulter l'index
des commandes pour avoir les explications qu'il vous faut. Globalement, le principe de fonctionnement est simple, je
vous laisse le plaisir d'étudier le source soigneusement documenté pour voir comment ça marche
(bah oui, si je dis tout, c'est moins marrant). Bien entendu, il y a des optimisations possibles, là encore,
c'est à vous de jouer ! Les courageux qui seront allés jusqu'au bout auront le plaisir de voir évoluer
les petites bêbêtes. Pour l'avoir laissé tourner pendant un moment, je peux vous dire qu'on obtient
parfois des trucs surprenants ! Un 68040 à 25 MHz et une résolution de 640x512 sont nécessaires si on veut
profiter décemment du spectacle (oui, vraiment, il y a des optimisations à faire :-). A noter que le Blitz ne
marche pas sur Pegasos (cf. notre ami Henes qui me l'a confirmé lors de l'excellente HunoParty 2).
Bon code !
Le code source
WBStartup
WbToScreen 3
Use Screen 3
LoadFont 2,"topaz.font",8
Use IntuiFont 2
GTButton 0,1,242,252,100,15,"Restart",#PLACETEXT_IN
Window 0,0,14,600,300,$140e,"LifeSimAOS v1.0 Obligement version",-1,-1
DefaultOutput
AttachGTList 0,0
Use Window 0
;Creation du tableau contenant les infos sur les cellules
Dim cellules.b(57,24)
;Creation de la copie du tableau contenant les infos sur les cellules
Dim cellules_copie.b(57,24)
comptvoisins.b=0
Gosub InitSim
comptboucles.l=0
;Boucle principale du programme
While ev.l<>#IDCMP_CLOSEWINDOW
comptboucles.l=comptboucles.l+1
Use Window 0
WLocate 10,8
Print "Generation number ",comptboucles.l
;On recupere les evenements qui se produisent dans la fenetre du logiciel
ev.l=Event
;Si on clique sur le bouton RESTART
If ev=64
comptboucles.l=0
Gosub InitSim
EndIf
;Debut du code de la simulation
For compteur2.w=1 To 57 Step 1
For compteur3.w=1 To 24 Step 1
comptvoisins.b=0
If compteur2.w>1
If compteur3.w>1
;HAUT-GAUCHE
If cellules.b(compteur2.w-1,compteur3.w-1)=1
comptvoisins.b=comptvoisins.b+1
EndIf
EndIf
;GAUCHE
If cellules.b(compteur2.w-1,compteur3.w)=1
comptvoisins.b=comptvoisins.b+1
EndIf
;BAS-GAUCHE
If compteur3.w<24
If cellules.b(compteur2.w-1,compteur3.w+1)=1
comptvoisins.b=comptvoisins.b+1
EndIf
EndIf
EndIf
If compteur2.w<57
If compteur3.w>1
;HAUT-DROITE
If cellules.b(compteur2.w+1,compteur3.w-1)=1
comptvoisins.b=comptvoisins.b+1
EndIf
EndIf
;DROITE
If cellules.b(compteur2.w+1,compteur3.w)=1
comptvoisins.b=comptvoisins.b+1
EndIf
;BAS-DROITE
If compteur3.w<24
If cellules.b(compteur2.w+1,compteur3.w+1)=1
comptvoisins.b=comptvoisins.b+1
EndIf
EndIf
EndIf
;HAUT
If compteur3.w>1
If cellules.b(compteur2.w,compteur3.w-1)=1
comptvoisins.b=comptvoisins.b+1
EndIf
EndIf
;BAS
If compteur3.w<24
If cellules.b(compteur2.w,compteur3.w+1)=1
comptvoisins.b=comptvoisins.b+1
EndIf
EndIf
If (comptvoisins.b<2 OR comptvoisins.b>3)
cellules_copie.b(compteur2.w,compteur3.w)=0
Else
If comptvoisins.b=3
cellules_copie.b(compteur2.w,compteur3.w)=1
EndIf
EndIf
Next
Next
For compteur2.w=1 To 57 Step 1
For compteur3.w=1 To 24 Step 1
cellules.b(compteur2.w,compteur3.w)=cellules_copie.b(compteur2.w,compteur3.w)
Next
Next
Gosub RefreshCells
;Fin du code de la simulation
Wend
DetachGTList 0
Free Window 0
End
..InitSim
;Remplissage aleatoire du tableau des cellules
For compteur2.w=1 To 57 Step 1
For compteur3.w=1 To 24 Step 1
cellules.b(compteur2.w,compteur3.w)=Rnd(2)
Next
Next
For compteur2.w=1 To 57 Step 1
For compteur3.w=1 To 24 Step 1
cellules_copie.b(compteur2.w,compteur3.w)=cellules.b(compteur2.w,compteur3.w)
Next
Next
;Tracage du tableau
;Lignes horizontales
For compteur.w=20 To 260 Step 10
Wline 10,compteur.w,580,compteur.w,1
Next
;Lignes verticales
For compteur.w=10 To 580 Step 10
Wline compteur.w,20,compteur.w,260,1
Next
Gosub RefreshCells
Return
..RefreshCells
;Remplissage des cellules
For compteur2.w=11 To 571 Step 10
For compteur3.w=21 To 251 Step 10
WBox compteur2.w,compteur3.w,compteur2.w+8,compteur3.w+8,
cellules.b(Int(compteur2.w/10),Int((compteur3.w/10)-1))
Next
Next
Return
|
Index des instructions
WBStartup
Syntaxe :
WBStartup
Cette instruction permet à votre programme d'être lancé à partir du Workbench. Si elle
est manquante et que vous démarrez votre logiciel à partir du WB, le plantage est assuré.
Remonter en haut de l'index - Remonter en haut du source
WbToScreen
Syntaxe :
WbToScreen numéro écran
Cette instruction attribue un numéro d'écran à celui du Workbench. Cela vous permet d'utiliser l'écran du WB
comme n'importe quel autre écran pour y ouvrir des fenêtres par exemple.
Remonter en haut de l'index - Remonter en haut du source
Use Screen
Syntaxe :
Use Screen numéro écran
Indique au programme qu'il doit utiliser l'écran indiqué pour les opérations d'affichage et de saisie.
Remonter en haut de l'index - Remonter en haut du source
LoadFont
Syntaxe :
LoadFont numéro attribué à la police,"nom de la police.font",taille,style
Cette instruction permet de charger une police de caractères ("fonte" dans le langage amigaiste) à partir du dossier FONTS:. Voici quelques détails concernant le paramètre style :
-
Une valeur de 1 correspond à souligné,
-
Une valeur de 2 correspond à gras,
-
Une valeur de 4 correspond à italique,
-
Une valeur de 8 correspond à plus large que la normale.
Remonter en haut de l'index - Remonter en haut du source
Use IntuiFont
Syntaxe :
Use IntuiFont numéro d'une police de caractères chargée au préalable
La police de caractères passée en paramètre sera utilisée pour inscrire du texte à l'écran.
Remonter en haut de l'index - Remonter en haut du source
GTButton
Syntaxe :
GTButton numéro de la GadgetList du bouton,numéro du bouton,position en X,position en Y,largeur,hauteur,"texte",drapeau
Cette instruction crée un bouton attaché à ce que l'on appelle une GadgetList, en quelque sorte un ensemble de composants (boutons, texte,...) que l'on attribue à une fenêtre. Le paramètre drapeau optionnel spécifie, entre autres, la position du texte dans ou par rapport au bouton :
Valeur
|
Position du texte
|
$1
|
Gauche
|
$2
|
Droite
|
$4
|
Au-dessus
|
$8
|
En-dessous
|
Remonter en haut de l'index - Remonter en haut du source
Window
Syntaxe :
Window numéro que l'on veut donner à la fenêtre,position en X,position en Y,largeur,hauteur,drapeaux,"titre",numéro de la couleur du texte utilisée pour le titre de la fenêtre,numéro de la couleur utilisée pour la bordure de la fenêtre,numéro de la GadgetList rattachée (facultatif)
Cette instruction crée une fenêtre WorkBench. Voici plus de détails sur les drapeaux :
Drapeaux
|
Valeur
|
Description
|
WINDOWSIZING
|
$0001
|
Ajoute un gadget de redimensionnement à la fenêtre.
|
WINDOWDRAG
|
$0002
|
Indique que la fenêtre est déplaçable.
|
WINDOWDEPTH
|
$0004
|
Ajoute un gadget de profondeur à la fenêtre. Elle peut donc être placée devant ou derrière les autres. C'est là qu'on sent l'âge du WB...
|
WINDOWCLOSE
|
$0008
|
Ajoute un gadget de fermeture.
|
SIZEBRIGHT
|
$0010
|
Les drapeaux GIMME00 et WINDOWSIZING activés permettent de réserver une bordure à droite de la fenêtre interdisant l'écriture sur une largeur équivalente à la taille du gadget de redimensionnement.
|
SIZEBOTTOM
|
$0020
|
Idem que SIZEBRIGHT si ce n'est que la marge est créée en bas de la fenêtre.
|
BACKDROP
|
$0100
|
La fenêtre est placée derrière toutes celles qui sont déjà ouvertes. Le drapeau WINDOWDEPTH ne peut être activé et la fenêtre restera obligatoirement en arrière-plan.
|
GIMME00
|
$0400
|
Les bordures de la fenêtre ne peuvent en aucun cas être effacées par le contenu de la fenêtre si celui-ci vient à déborder. D'la balle.
|
BORDERLESS
|
$0800
|
Vous voyez ce que c'est une serveuse topless ? Bon, et bien c'est pareil, à la nuance près que c'est la bordure qui saute, et pas le haut ;-)
|
ACTIVATE
|
$1000
|
Active la fenêtre une fois ouverte.
|
Remonter en haut de l'index - Remonter en haut du source
DefaultOutput
Syntaxe :
DefaultOutput
Fait de la fenêtre actuellement active la sortie par défaut (des futures instructions Print par exemple). A noter que DefaultInput existe.
Remonter en haut de l'index - Remonter en haut du source
AttachGTList
Syntaxe :
AttachGTList numéro de la GadgetList,numéro de la fenêtre
Cette instruction attache un ensemble de gadgets GadTools à une fenêtre ouverte (voir GTButton).
Remonter en haut de l'index - Remonter en haut du source
Use Window
Syntaxe :
Use Window numéro de la fenêtre
Cette instruction active la fenêtre désignée. Un WindowInput et un WindowOutput sont automatiquement faits sur la fenêtre en question afin d'en faire l'entrée/sortie par défaut.
Remonter en haut de l'index - Remonter en haut du source
Dim
Syntaxe :
Dim nom_du_tableau(colonnes,lignes)
Cette instruction crée un tableau dont les cellules sont numérotées de 1 à n. Elle est riche en possibilités, je vous renvoie au manuel du Blitz pour en savoir plus.
Remonter en haut de l'index - Remonter en haut du source
Gosub
Syntaxe :
Gosub Label
Cette instruction indique à l'ordinateur qu'il doit exécuter ce qui se trouve à l'emplacement Label du programme, puis reprendre son cours normal là où il a été interrompu. A ne pas confondre avec Goto.
Remonter en haut de l'index - Remonter en haut du source
While...Wend
Syntaxe :
While condition(s)
instruction(s) à exécuter
Wend
Cette instruction appartient à la famille des boucles. Tant que la condition est satisfaite, le cycle se répète.
Remonter en haut de l'index - Remonter en haut du source
WLocate
Syntaxe :
WLocate X,Y
Cette instruction est utilisée pour spécifier la position du texte dans la fenêtre active. X et Y sont exprimés en pixels et indiquent le décalage à appliquer par rapport au coin supérieur gauche.
Remonter en haut de l'index - Remonter en haut du source
Print
Syntaxe :
Print Texte ou formule
Permet d'afficher du texte ou des valeurs numériques sur la sortie standard.
Remonter en haut de l'index - Remonter en haut du source
Event
Syntaxe :
Event
Cette instruction est similaire à WaitEvent : Elle retourne la valeur IDCMP des événements qui surviennent dans les fenêtres WB, mais se différencie par le fait qu'elle ne bloque pas l'exécution du programme pendant qu'elle attend un événement. Si rien ne se passe, Event renvoie 0.
Remonter en haut de l'index - Remonter en haut du source
If...EndIf
Syntaxe :
If condition(s) Then instruction à exécuter
OU
If condition(s)
instruction(s)
Else
instruction(s)
EndIf
La bonne vieille condition des familles, dois-je vraiment l'expliquer ?
Remonter en haut de l'index - Remonter en haut du source
For...Next
Syntaxe :
For variable=une valeur de départ To une valeur maximale Step valeur à ajouter à variable lors de chaque boucle (optionnel)
instruction(s)
Next
La boucle FOR, un grand classique. Les instructions sont exécutées jusqu'à ce que valeur de départ soit supérieure à valeur maximale. Pour décrémenter au lieu d'incrémenter, on peut spécifier un STEP négatif.
Remonter en haut de l'index - Remonter en haut du source
DetachGTList
Syntaxe :
DetachGTList numéro de la GadgetList à libérer
Utile pour libérer proprement la mémoire quand on quitte l'application.
Remonter en haut de l'index - Remonter en haut du source
Free Window
Syntaxe :
Free Window numéro de la fenêtre à détruire
Permet de supprimer de la mémoire une fenêtre dont on n'a plus besoin.
Remonter en haut de l'index - Remonter en haut du source
End
Syntaxe :
End
Indique la fin du programme.
Remonter en haut de l'index - Remonter en haut du source
Wline
Syntaxe :
Wline X1,Y1,X2,Y2,couleur
Cette instruction sert à dessiner une ligne (voire plusieurs si on spécifie X3,Y3...Xn,Yn) dans une fenêtre. Je vous laisse jouer avec les couleurs.
Remonter en haut de l'index - Remonter en haut du source
WBox
Syntaxe :
WBox X1,Y1,X2,Y2,couleur
Cette instruction dessine un rectangle plein dans une fenêtre. X1,Y1 sont les coordonnées du coin supérieur gauche et X2,Y2 celles du coin inférieur droit. Je vous laisse de nouveau jouer avec les couleurs.
Remonter en haut de l'index - Remonter en haut du source
Return
Syntaxe :
Return
Indique au programme qu'il doit reprendre le cours du programme là où il l'avait interrompu suite à un Gosub.
Remonter en haut de l'index - Remonter en haut du source
|
|