Introduction au dark basic
Un article de Games Creators Network.
Sommaire |
[modifier] Les variables
Tout d'abord, qu'est-ce qu'une variable ? Rappelez-vous vos cours de maths, votre prof (je sais, vous le détestez et vous avez envie de lui faire avaler de la mort au rat)... votre prof, je disais, a sûrement du vous faire résoudre quelques petites équations, n'est-ce pas ? Par exemple :
5x+8 = 38 5x = 30 x = 6
Cela vous rappelle de mauvais souvenirs ? Allez, tenez-vous bien, ce x est une variable ! Une variable est une lettre (ou plusieurs lettres) qui contient une valeur. Si lors d'une épreuve, vous modifiez la valeur de x (et hop, il vaut 7), votre prof ne sera peut-être pas très heureux, par contre, en programmation, cela ne pose aucun problème. Si leur utilité ne vous a pas encore sauté aux yeux, ne vous en faite pas, cela viendra.
Il existe plusieurs sortes de variables, chacune sert à stocker une sorte de donnée particulière. Il y a plusieurs sortes de données :
- Les nombres entiers
- Les booleans. C'est la plus petite unité de stockage. Composés d'un seul bit (0 ou 1), ils ne peuvent prendre que ces deux valeurs (0 ou 1),
- Les bytes sont composé de 8 bits, ils peuvent prendre des valeurs entières de 0 à 255,
- Les words, codés sur deux bytes, peuvent prendre des valeurs entières de 0 à 65535,
- Les dwords sont codés sur deux words. Ils peuvent prendre des valeurs entières de 0 à 4294967295,
- Les integers. Un integer est codé sur deux dwords et peut prendre des valeurs négatives. Ses valeurs peuvent aller de -9223372036854775808 à 9223372036854775807.
- Les nombres « réels ». Ces nombres ne sont que des approximations, c'est pourquoi j'ai mis « réels » entre guillemets.
- les floats. Un float est composé de 4 bytes. Il peut prendre des valeurs comprises dans ce champ : [+/-]3.4E[+/-]38. Il a 7 décimales de précision.
- les double floats. Un double float peut prendre des valeurs comprises dans ce champ : [+-]1.7E[+-]308. Il a 15 décimales de précision.
- Les chaînes de caractères, ou strings. Dans ce cours, je parlerai toujours de strings. Tout d'abord parce que c'est « plus sympa », ensuite parce que c'est plus court. Et que peut contenir un string ? Des lettres, toujours entourées de guillemets (").
[modifier] Déclarer une variable
Déclarer une variable est quelque chose de très important. En début de programme, faites la liste de toutes les variables que vous utilisez et spécifiez leur type. Ca se fait de cette manière :
"nom_de_la_variable as sorte_de_variable"
posx as float score as dword nom as string
Comme on ne peut définir une variable qu'une seule fois, il vaut mieux réfléchir deux fois en choisissant son nom.
[modifier] Définir un type personnalisé
Je considère cette partie comme très importante. Je ne sais pas comment définir ce type de variables de manière simple autrement qu'en donnant un exemple :
type mon_type a as float b as byte c as string endtype var as mon_type var.a = 7.5 var.b = 129 var.c = "Hello World"
Cette méthode est très pratique. Imaginez-vous que vous développez un FPS et que chaque ennemi doit avoir 20 variables (vie, positions, orientation, ...). Avoir 20 tableaux ne serait pas très pratique, mais un tableau comme ennemi().vie, ennemi().nom,... est beaucoup plus aisé à utiliser.
Un autre avantage est que vous êtes prévenus en cas de faute de frappe dans le nom, même s'il ne s'agit pas d'un tableau. Regardez cet exemple :
var_a as float var_b as byte var_c as string var_a = 7.5 var_d = 129 var_c = "Hello World" print var_a print var_b print var_c wait key
Là, comme vous pouvez le constater, j'ai fait une faute de frappe : j'ai écrit d au lieu de b. Ce n'est pas le genre de faute qui se remarque rapidement, car le d ressemble pas mal au b. De plus, cela posera un problème sûrement beaucoup plus loin dans le code et par forcémment là où il y a l'erreur. Et maintenant, avec les types :
type abc a as float b as byte c as string endtype var as abc var.a = 7.5 var.d = 129 var.c = "Hello World" print var.a print var.b print var.c wait key
Là, le compilateur remarque que la variable n'existe pas, cela évite de chercher une erreur dans le code pendant trop longtemps.
Toutefois, il ne faut pas utiliser les types à tord et à travers, seulement lorsque vous avez plusieurs variables qui se rapportent à la même chose.
[modifier] Les tableaux
Van Eyck était d'après moi le peintre le plus doué de tous les temps. Mais le genre de tableaux qu'il faisait n'a absolument rien à voir avec celui dont je vais vous parler ici. Je tenais juste à citer ce peintre ^_^
Un tableau, en programmation, est une variable pouvant contenir plusieurs valeurs. Voici un petit exemple :
dim mon_tableau(5) for t=1 to 5 mon_tableau(t) = 3*t next t for t=1 to 5 print mon_tableau(t) next t wait key
Ce code crée un tableau contenant cinq cellules. Ensuite, on peut l'utiliser comme n'importe quelle variable - à condition de spécifier un numéro de la cellule. Si vous ne le faites pas, le dieu du compilateur vous maudira d'un joli bug.
Les tableaux ne sont pas seulement en une dimension, mais peuvent en avoir jusqu'à neuf ! Je dois dire que je n'utilise presque jamais des tableaux de plus de deux dimensions, mais parfois, plus de dimensions peuvent être utiles. Voici un exemple de tableau à deux dimensions :
dim var(10,10) for t=1 to 10 for u=1 to 10 var(t,u)=rnd(5) next u next t for x=1 to 10 for y=1 to 10 print var(x,y)," "; next y print "" next x wait key
Le ; après le print signifie que le prochain print s'affichera à la suite et non après un retour à la ligne.
Comme avec les autres variables, il est possible de définir le type de tableau que vous désirez (byte, string, float,...) de la manière suivante :
dim mon_tableau(3) as dword type t_tab x as string y as float z as float endtype dim mon_autre_tableau(1234) as t_tab
Contrairement aux autres variables, il est possible de supprimer un tableau pour libérer de la mémoire - ou pour le recréer avec d'autres dimensions. La commande est undim, consultez l'aide pour plus d'informations.
[modifier] Modifier la structure d'un tableau
Avec un tableau à une dimension, on peut faire pas mal de choses. Je ne vais vous donner qu'un court exemple car avec cela vous devriez être capable d'utiliser les autres commandes que vous trouverez dans la partie core du manuel.
dim var(5) for t=1 to 5 var(t)=t next t print "le tableau a ", array count(var(0)), " éléments : " array insert at element var(0), 3 print "le tableau a maintenant ", array count(var(0)), " éléments : " for t=1 to array count(var(0)) print t, ". ", var(t) next t wait key
Dans ce code, un tableau de cinq éléments est crée. Ensuite, une valeur est assignée à chaque élément, de 1 à 5 pour que ça soit plus lisible.
Puis, array insert at element ajoute un élément au tableau. Le second paramètre (ici : 3) correspond à l'élément d'arrivée.
Finalement, tous les éléments sont affichés et vous pouvez voir que le troisième est vide, c'est celui qui vient d'être crée.
[modifier] Les conditions
Un ordinateur est capable de reconnaître différentes conditions :
A = B : A est égal à B A < B : A est inférieur à B A > B : A est supérieur à B A <= B : A est inférieur ou égal à B A >= B : A est supérieur ou égal à B A <> B : A est inférieur ou supérieur à B, donc A n'est pas égal à B
Chacune de ses conditions renvoie un boolean : 1 si elle est vraie, 0 si elle est fausse. Il est aussi possible de comparer plusieurs conditions, avec and, or, et xor. Xor signifie eXclusive or. Il ne renvoie 1 que si une des deux conditions est vraie. Voici ce qu'ils peuvent renvoyer :
0 and 0 = 0 0 and 1 = 0 1 and 0 = 0 1 and 1 = 1
0 or 0 = 0 0 or 1 = 1 1 or 0 = 1 1 or 1 = 1
0 xor 0 = 0 1 xor 0 = 1 0 xor 1 = 1 0 xor 0 = 0
On peut définir une condition - et la réaction - de plusieurs manières différentes. Certaines sont plus pratiques que d'autres dans certaines conditions.
if [condition] then [action si oui]
if [condition] then [action si oui] else [action si non]
if [condition] [action 1 si oui] [action 2 si oui] ... endif
if [condition] [action 1 si oui] [action 2 si oui] ... else [action 1 si non] [action 2 si non] ... endif
Il est très important d'avoir ces quatre schémas en tête : vous en aurez besoin tout au long de votre vie de programmeur. Et les and, or et xor ? Où vont-ils ? Dans condition. Regardez cette exemple :
a = 5 b = 6 c = 5 if a = B then print "A = B" if a = b or a = c then print "A = B ou A = C" if a = b and a = c then print "A = B et A = C" wait key
Examinons cas par cas :
a = b 5 = 5 -> 1
Le résultat est 1, la condition est remplie.
a = b or a = c 5 = 6 or 5 = 5 0 or 1 -> 1
Le résultat est 1, la condition est aussi remplie, même si l'un de ses termes est faux.
a = b and a = c 5 = 6 and 5 = 5 0 and 1 -> 0
Le résultat est 0, la condition n'est pas remplie.
Normalement, tout cela devrait vous sembler très simple. Si ce n'est pas le cas, ne vous affolez pas : ça viendra tout naturellement. Les conditions étant quelque chose de très important, je vous conseille de vous entraîner jusqu'à ce que vous les maîtrisiez : vous ne devez plus avoir la moindre hésitation en en écrivant une.
[modifier] Les boucles
Un jour, un débutant m'avait affirmé avoir écrit un programme de 11 000 lignes, en C. Il me semblait que ça faisait un peu beaucoup pour un débutant et je lui ai demandé des précisions. Il voulait, en fait, que son programme fasse un grand nombre de fois la même chose, alors il avait copié-collé son code, jusqu'à ce que le temps de compilation lui semble trop long pour en ajouter davantage.
L'informatique serait quelque chose de bien triste (et de terriblement frustrant) si les boucles n'existaient pas. En gros, elles servent à répéter plusieurs fois le même groupe de lignes. Combien de fois ? Cela dépend autant de la boucle que du programmeur et du programme.
[modifier] Do - loop
Cette boucle répète indéfiniment tout ce qui se trouve entre le do et le loop. Voici un petit exemple :
nom as string do print "Bonjour, comment vous appelez-vous ?" input "Je m'appelle ", nom loop
Là, vous pouvez répondre autant que vous le désirez, vous ne pourrez pas gagner. Votre ordinateur est beaucoup plus patient que vous, il continuera de vous saluer jusqu'à ce que vous quittiez le programme, quelle que soit la réponse. On peut quitter une boucle de deux manières différentes : soit avec un goto soit avec un exit.
[modifier] repeat - until
Cette boucle n'est pas infinie : elle s'arrête lorsque la condition est remplie. Toutes les commandes se trouvant entre l'endroit où la condition est remplie et le until sont encore lues une fois.
nom as string repeat print "Bonjour, comment vous appelez-vous ?" input "Je m'appelle ",nom print "Enchanté, ",nom, ", moi c'est Ordinateur." until nom="quitter" wait key
Entrez "quitter" comme nom pour remplir la condition. Il est aussi possible de quitter cette boucle avec un goto ou un exit.
[modifier] while - endwhile
Cette boucle se répète tant qu'une condition est valide. Lorsque la condition est modifiée, le programme lira encore les commandes jusqu'à endwhile. Ensuite, il retournera au while, et comme la condition n'est plus remplie, il ignorera la boucle.
Il est intéressant de remarquer que cette boucle n'est lue que si la condition est remplie lorsque le programme y arrive. Si vous entrez 11 dès la première fois, tout le contenu de la boucle sera ignoré.
input "Entrez un nombre de 1 à 20> ", nombre while nombre <> 11 input "Entrez un nombre de 1 à 20> ", nombre print "Merci" endwhile print "Gagné !" wait key
Bien entendu, un goto ou un exit fera quitter la boucle.
[modifier] For - next
J'ai déjà utilisé cette boucle en parlant des tableaux. Son principe est simple : elle se répète en modifiant la valeur d'une variable, la faisant passer de la valeur minimale à la valeur maximale. Il est possible d'incrémenter la variable de n'importe quelle valeur, le défaut est 1.
for variable = min to max step étape [choses à faire] next variable
Voici deux exemples :
for t=1 to 5 print t print 2*t print t^2 print "" next t wait key
for t=1 to 10 step 2 print t print 2*t print t^2 print "" next t wait key
Si vous désirez que la variable passe d'un maximum à un minimum, cela est aussi possible, mais il faut absolument mettre une valeur négative à step.
for t=10 to 1 step -2 print t print 2*t print t^2 print "" next t wait key
Un exit et un goto peuvent faire quitter cette boucle. Mais modifier la valeur de la variable (lui assigner une valeur supérieure à la valeur maximale) peut aussi faire l'affaire.
[modifier] La boucle "oops"
La boucle "oops" est une boucle très énervante. C'est quand vous vous gourez en écrivant la condition et qu'elle ne se remplit jamais. Là, c'est le programme qui reste bloqué. Bien entendu, cette boucle peut être de n'importe quelle sorte, mais faites attention : si c'est une boucle for-next, presser escape ne servira à rien. En effet, pour optimiser sa vitesse, les créateurs de Dark Basic Pro ont enlevé la vérification de la touche escape.
Lorsque vous avez une boucle for-next qui prend un certain temps à s'accomplir, ajoutez-y une condition permettant de quitter le programme avec escape. Faites aussi de même si vous programmez quelque chose de difficile dans une boucle for-next, vous serez ainsi quitte de quitter le programme avec la fameuse combinaison de touches "ctrl-alt-del" en cas de problème.
[modifier] Le texte
Bon, là, vous pouvez me demandez « Pourquoi on ne parle du texte qu'ici ? », mais je ne saurais pas quoi vous répondre à part « Soyez heureux qu'on en parle ».
Le texte, qu'est-ce ? C'est tout simplement les caractères qu'on affiche à l'écran. La commande de base est print, mais il en existe d'autres. Le texte a trois paramètres généraux : police, taille et couleur. Il est possible de modifier ces données ainsi que quelques autres secondaires. Certaines commandes peuvent renvoyer des informations sur les strings, par exemple la largeur qu'ils prendraient si on les affichait à l'écran, en tenant compte autant de la police que de la taille.
Il existe trois manières d'afficher du texte : print, text et center text. Pour plus d'informations sur ces commandes, lisez l'aide.
Que peut-on faire avec du texte ? Beaucoup de choses. Tenez, voici un exemple :
for t=100 to 1 step -1 print "Il y a ",t," bières sur un mur. J'en prend une, je la bois." wait 50 next t print "Il n'y a plus de bière !" wait key
D'accord, cet exemple n'est pas très intelligent, mais il donne soif (je vous conseille la Franziskäner, elle est bonne). Un autre pourrait vous sembler plus intéressant.
sync on sync rate 25 txt as string = "All those moments will be lost in time... like tears in rain. - Blade Runner" modified as string do for t=0 to len(txt) cls set text size 10+10*sin(36*t) modified = left$(txt, t) text screen width()-text width(modified), screen height()/2, modified sync next t for t=len(txt) to 0 step -1 cls set text size 10+10*sin(36*t) modified = left$(txt, t) text screen width()-text width(modified), screen height()/2, modified sync next t for t=0 to len(txt) cls set text size 10+10*sin(36*t) modified = right$(txt, t) text screen width()-text width(modified), screen height()/2, modified sync next t for t=len(txt) to 0 step -1 cls set text size 10+10*sin(36*t) modified = right$(txt, t) text screen width()-text width(modified), screen height()/2, modified sync next t loop
Ou encore :
sync on sync rate 0 txt as string set text font "Fixed sys" do size = 0 repeat txt = chr$(rnd(255)) set text size 8+rnd(15) inc size, text width(txt) ink rgb(rnd(10), rnd(155)+100, rnd(25)),0 print txt; sync until size > screen width() print "" loop
Ce dernier exemple est assez joli, même si le film auquel il vous fera penser est une véritable m***e. Comme vous pouvez le constater, le texte peut donner un assez bon effet, à condition de bien l'utiliser.
Maintenant, je commence un peu d'en avoir marre d'écrire, je continuerai un autre jour.
Tutoriel provenant de http://www.seuret.com

