Niveau : Débutant.
Prérequis : Cours #1 réussi.
Sujets traités : Les tableaux (array et hash), les commentaires, les controles (if else, for, while)
Cours :ThéoriesNous avons vu au cours précédent qu'il existait différents types. Nous avons appris les opérations de base sur les integers (int), les floats et les strings. Passons maintenant à deux types un peu plus corsés, les tableaux.
La différence entre les 2 tableaux? Les arrays (vecteurs) sont unidimentionnel et sont référés par index. Un index est un nombre allant de 0 à taille du vecteur -1. Les hashes sont bidimentionnel et sont référé par une clé de référence et il n'y a pas d'index.
Bon pour faire les exercises, si vous ne voulez pas perdre le contenu du cours 1, je vous suggère de le mettre en commentaire. Permettez moi donc une pause dans les explication en cours pour vous présenté les deux façons de mettre des commentaires. La première est la plus simple et est rencontré partout. L'utilisation du symbole #. Dès que ce symbole est rencontrer, tout ce qui suit sur la ligne est un commentaire et n'est pas exécuté. La deuxième méthode est plus capricieuse sur la syntaxe, mais permet de commenter un gros bloc de code. La ligne précédent le code à commenté doit commencer par =begin. Il ne doit y avoir ni espace, ni tabulation, rien. Immédiatement collé sur la marge, =begin. Pour terminer le bloc de commentaire... je vous laisse deviner.... =end
![Wink](https://2img.net/i/fa/i/smiles/icon_wink.gif)
. Donc commentez votre précédent script. Vous pouvez vous créer une nouvelle page de script pour ne pas voir votre bloc de commentaire, ou simplement écrire en dessous, peu importe... N'oubliez pas que pour s'exécuter, vous devez commencer par begin et terminer par end.
Bon ceci étant fait, on peut commencer. Comment affecte-t-un une valeur de tableau? Facile. Les arrays sont encadrés par des corchets [] et les éléments sont séparés par des virgules. Donc [0,1,2,3,4,5] est un array de 6 éléments. Dans ce cas-ci, l'index est égale à la valeur dans l'index. Le premier élément est donc à l'index 0 et le dernier à l'index 5. Pour les tableaux, on peut également compter à rebours. L'index -1 est le dernier élément, -2 l'avant dernier et ainsi de suite. Important!! La valeur de l'index est toujours comprise entre ±(taille du array -1).to_i, toute valeur sortant de ce domaine retourne une valeur nil, qui est considéré comme une erreur par le compilateur (car nil ne peut pas être converti à un autre type que lui-même).
Pour donner une valeur de array à une variable, c'est simple, prep = ["mais", "ou", "et", "donc", "car", "ni", "or"]. Est-ce qu'on est obligé de mettre des valeurs de type identique dans un talbeau? Non. On pourrait penser à un tableau du genre stat=["Hikari", 20, 1.0, ["Admin","Scritpeur"], {"script" => 50, "event" => 3}]. Dans l'ordre, les valeurs du tableau sont un string, un int, un float, un array, un hash. Eh oui. Un tableau est une valeur valables pour un tableau.
Tant qu'à l'avoir abordé, voyons le hash. Contrairement au array qui est encadré par des [], le hash est encadré par des accolades {} et les membres sont aussi séparé par des virgules. La façon de donner une valeur à un hash est de définir le référent et sa veleur avec un opérateur =>. Donc info = {"nom" => "Hikari", "script" => 50, "event" => 3} est un hash dont nom à la valeur Hikari, script a une valeur de 50 et event une valeur de 3.
Comment récupéré les valeur de ces deux tableaux? Ça dépends du tableau. Pour le array, vous demandez uniquement l'index. Dans notre exemple, print prep[1] afficherais à l'écran «ou». Pour le hash, c'est la même chose, mais les index n'existe pas, vous devez demander la valeur de la clé. Dans notre exemple, print info["nom"] afficherait «Hikari». Remarquez que cette fois, dans les 2 cas, on utilise les crochets [], et non pas les accolades. Les accolades servent uniquement lors de l'initialisation de la variables pour la différencier du hash, mais par la suite, les deux sont considéré comme tableau, l'un ayant des index, l'autre ayant des clés de recherches. L'un et l'autre ont leurs avantages. L'array a un accès plus rapide et peut être rapidement parcouru grâce à une boucle (que nous verrons dans quelques instants) et le hash permet de conserver plusieurs informations avec des référent facile à se rappeler. C'est à vous de décider lequel prendre pour telle ou telle situation.
Comment changer, ajouter et retirer des valeurs des talbeaux? Pour modifier, c'est très simple. Vous donner l'élément à chager et vous donner sa nouvelle valeur. info["nom"] = "MirainoHikari" aura pour effet de remplacer le hash comme ceci : {"nom" => "MirainoHikari", "script" => 50, "event" => 3} et écrire prep[0] = "sur" aura pour effet de modifier l'array comme suit : ["sur", "ou", "et", "donc", "car", "ni", "or"].
Pour ajouter une valeur, cette fois aussi c'est différent. Pour l'array, on utilise l'opérateur +, pour le hash, l'opérateur =. L'opérateur = !?!... Et oui. Commençons par le array puisque ça compréhension se fait plus naturellement. Si on écrit tab = [1, 2] + [3, 4], la valeur finale de tab sera [1,2,3,4] vraiment simple. on veut ajouté [5,6], pas de problème, tab += [5, 6]. La valeur de tab est maintenant [1,2,3,4,5,6]. C'est quoi l'opérateur += déjà?? Cet opérateur nous permet de ne pas écrire tab = tab + [5,6]. C'est seulement un racourci de programmation. Apprenez à vous en servir rapidement car il est particulièrement pratique. La soustraction, la multiplication, la division et l'exponentiel ont également ce raccourci, dans l'ordre, -=, *=, /= et **=. Pour le hash, il n'y a pas d'index, donc du coup, il ne sait pas trop où il est rendu. Donc en écrivant info["vie"] = 100, info devient {"nom" => "MirainoHikari", "script" => 50, "event" => 3, "vie" = 100}. Donc, lors de l'affectation, si un valeur n'existe pas, elle est ajouter à la suite. C'est aussi simple que ça. On ne peux malheureusement pas ajouter des éléments en groupe comme un tableau. Il faut donc s'assurer que le hash est déjà bien consturuit. Vous pouvez faire un print sur un tableau, mais le résultat est difficile à lire vu que tous les éléments sont mis bout à bout, sans espaces ni virgule.
Bon maintenant, pour effacer un élément. Pour une fois, les deux s'entendent pour une même méthode. La fonction delete existe. Pour le tableau, l'argument est la valeur à retirer, pour le hash, la clé. Exemple tab.delete(1) retire la valeur 1 du tableau tab et info.delete("vie") retire la clé vie et sa valeur (100) du hash info. Pour retirer à l'index d'un tableau, on utilisera la fonction delete_at. Donc tab.delete_at(-1) retire la dernière valeur du tableau, soit 6 dans notre exemple.
Nous avons vu des clés de types string, mais en fait les clé peuvent également être de n'importe quel type. disons un hash qui ressemble à ceci. mon_hash = {5 => "cinq", [1,2] => "tab", "trois" => 3, "array" => ["b",5,6,"a"]}, est parfaitement valide. Se rappeler cependant que c'est la clé qui est désignée. Donc print hash[5] affiche «cinq» à l'écran. Lorsque la clé est un entier, il faut faire attention de ne pas le confondre avec un array. Mais cela reste parfaitement légale. Il faut juste trouver une nomenclature qui nous convienne. Les valeurs peuvent également être un autre hash.
Quand on a un tableau dans un tableau, comment accède-t-on au données? Simplement en mettant plusieurs crochet. Disons que ma_var = [[1,2],[3,4]], si je veux accèdé à la valeur 4, je dois écrire ma_var[1][1] (on n'oublie pas, les index commencent à 0). Si ma_var = {"cle1" => [1,2,3], "cle2" => {"key1" => "me", "key2" => "you"}}, pour affiché le 3, ont fait ma_var["cle1"][2] et pour obtenir le you, on fait ma_var["cle2"]["key2"].
Pour connaitre le longeur d'un array, la fonction size et la fonction length existe. La fonction size est cependant préféré par le fait qu'elle est plus courte à écrire. C'est d'autant plus vrai dans VX où l'espace est limité dans les scripts des events. Il est possible également de convertir les données en type array avec .to_a.
Il existe encore plusieurs fonctions et opération possible sur les tableaux, mais là, ça commence à être plus avancé. Gardons ça pour une autre leçon.
==========
Les contrôles sont des mots clés qui servent à faire des trucs moins linéaires. Les controles que nous regarderons aujourd'hui sont les suivants : les conditions et les boucles.
Les conditions sont très simple. Si la condition est vrai alors fait quelque chose, sinon fait autre chose. La façon habituelle de le faire est
- Code:
-
if CONDITION
...
else
...
end
Le bloc if est également terminé par un end pour indiquer la fin de la condition. L'utilisation du else n'est pas obligatoire. S'il n'y a rien a exécuter dans le cas ou la condition est fausse, on omet tout simplement le else.
- Code:
-
if CONDITION
...
end
Donc supposons qu'on ait une variable contenant un entier. Si cet entier est supérieur à un nombre on affiche quelque chose et on affiche autre chose dans le cas contraire. Voyons l'exemple.
- Code:
-
begin
mon_age = 26
if mon_age < 18
print "Tu es un enfant"
else
print "Tu es un adulte"
end
end
Il y a moyen d'imbriqué les conditions IF...
- Code:
-
begin
mon_age = 26
if mon_age < 18
if mon_age >= 12
print "Tu es adolescent"
else
print "Tu est un enfant"
end
else
if mon_age <= 65
print "Tu es adult"
else
print "Tu est un vieillard"
end
end
end
Ce code indique que lorsque l'âge se situe entre [12,18[ c'est un adolescent, strictement inférieur à 12 c'est un enfant, entre [18,65] c'est un adult et strictement supérieur à 65 c'est un vieillard. Modifier manuellement la valeur de mon_age pour vous aperçevoir de cette réalité. Malheureusement, comme indiquer dans le premier cours, get n'est pas disponible dans le RGSS. Pour le moment, vous devez modifier manuellement cette valueur. Mais nous verrons éventuellement comment faire une capture de valeur. Pourquoi get n'est pas disponible? Parce que RPG Maker a sa propre interface de capture pour les string et les entiers. Ce n'est pas très grave pour le moment. D'ici la fin des cours, vous pourrez coder la fonction get pour utiliser votre clavier. Pour le moment, vivons avec ce handicape.
Parfois, on veut donner une valeur conditionnel à une autre. Au lieu d'écrire
- Code:
-
if condition
ma_val = qqc
else
ma_val = autre
end
on peut écrire simplement ma_val = condition ? qqc : autre. C'est un peu vague, mais je vous explique. Prenons un exemple concret. ma_val = ma_var >= 15 ? 15 : ma_var. Cela veux dire, si la variable ma_var est supérieur ou égale à 15, ma_val prend la valeur 15, sinon, elle prend la valeur de ma_var. Cela peut s'avérer fort pratique dans certaine situation.
Le deuxième contrôle est la boucle. Il existe deux type de boucle: for et while. Tout deux se termine avec end, bien entendu. Les deux syntaxes sont différentes, mais font la même chose. Il faut les voir comme étant «jusqu'à» et «tant que».
Voici 2 syntaxes pour for. Nous étudierons leur différence immédiatement après les avoir vu.
- Code:
-
begin
a = ["a : "]
b = ["b : "]
for i in 1..10
a += [i.to_s+" "]
end
for i in 1...10
b += [i.to_s+" "]
end
print a
print b
end
Exécuter ce code. Vous comprendrez la différence. Pourtant, il n'y a qu'un point de différence. Ce point supplémentaire se rend jusqu'à la 2e valeur sans utilisé cette deuxième valeur. for i in 1..10 se traduirait en français en «pour les i de 1 jusqu'à 10 inclusivement» alors que for i in 1...10 se traduirait par «pour les i partant de 1 jusqu'à ce que i soit 10». La nuance est difficile à deceler dans ses phrases, mais voyons comment le compilateur le traite. Il faut savoir que lorsque le end jumelé au for est atteint, la variable i est incrémentée de 1 automatiquement. Dans le premier cas le test invisible if i == 10 est effectuer après l'exécution de la boucle alors que dans le second cas, il est effectué avant. Faites des tests avec ces boucles pour comprendre cette différence, car elle sera très importante pour la suite.
Vous vous rappelez, avant de commencer la théorie des contrôles, nous avions vu la fonction size. Pour parcourir un array, une boucle est très agréable. Si vous ne voulez pas avoir à faire plusieur print, je vous suggère un symbole littéral. Il existe plusieurs de ces symboles réservé pour tous les types de données. Nous en apprendrons à l'occasion selon les besoin. Le symbole littéral d'aujourd'hui appratient aux strings. C'est "\n" Celui-ci permet de faire une nouvelle ligne. Je vais l'utiliser dans l'exemple suivant. N'oubliez pas de convertir vos données si vous utilisez ce littéral. Voici comment afficher le contenu d'un tableau.
- Code:
-
begin
a = ["Pseudo : ","Script : ","Vie : "]
b = ["Hikari",50,100]
result = ""
for i in 0...a.size
result += a[i].to_s + b[i].to_s + "\n"
end
print result
end
J'ai utilisé 0...a.size car les array ont un index allant de 0 à size - 1. L'équivalent avec seulement .. aurait été for i in 0..a.size-1. Il existe cependant une autre méthode, qui elle fonctionne autant pour les arrays que pour les hashes : each. Cette fonction permet de prendre chaque membre du tableau un par un. Par contre, les hash ont trois fonction de ce genre : each, each_pair, each_value et each_key. each et each_pair revient au même et renvoie la clé et sa valeur. each_key renvoie uniquement les clés et each_value uniquement la valeur. Voici un exemple avec array.each et hash.each_value.
- Code:
-
begin
#avec un array
resp1 = ""
var_1 = ["des pommes", "des poires", "un melon", "Des abricots"]
var_1.each do |Choix|
resp1 += "Je voudrais " + Choix.to_s + " s'il vous plait" + "\n"
end
print resp1
#avec un hash
resp2 = ""
var_2 = {719928 => "des pommes", 87645 => "des poires", 11998 => "un melon", 65432 => "Des abricots"}
var_2.each_value do |Choix|
resp2 += "Vous avez acheté " + Choix.to_s + ". Merci." + "\n"
end
print resp2
end
Maintenant, le while. Le while, c'est tant que la condition est vrai. Il existe 2 méthode while, mais je vais délibérément passer par dessus la 2e, car elle nécessite plusieurs codes en parrallèle. Nous y reviendrons peut-être lorsque nous intègrerons RPG Maker aux leçons, mais pour le moment, on va se concentrer sur la première méthode.
- Code:
-
begin
ary = ["Bonjour","à","vous"]
i = 0
resp = ""
while i < ary.size
resp += ary[i].to_s + " "
i += 1
end
resp += "!"
print resp
end
Vous remarquerez que cette fois, il faut incrémenter i manuellement et le test de validité est écrit à la main. Dans certain cas, ça peut être utile, mais généralement, for est plus que suffisent. C'est pour cette raison que j'utiliserai d'avantage for que while dans mes exemple, mais sachez que les 2 méthode existe. Il est également possible d'imbriquer des for et des while. Seuelement se rappeler d'utiliser des variables différentes pour chaque boucle.
Donc voilà... Ceci mets fin au cours #2. Essayez de comprendre tous les scripts présents avant de faires les exercices.