Tutoriaux RGSS (Ruby)
II-Les "array"
- Tutorial rédigé par Bahamut 1.2.
- Aucune démo n'est disponible pour ce tutorial.
Je suis fier de vous présenter la suite du tutorial RGSS !
Je vais vous parler des array en Ruby/RGSS, le principe peut être un peu difficile à saisir (quoique), mais il s'agit en fait d'un outil très puissant et donc, très pratique !
I-Un array ? Kézako ?
II-Manipuler les tableaux
III-Hachez vos tableaux !
IV-Tableau ou hachage ?
V-La vraie puissance des Array !

I-Un array ? Kézako ?
En fait, nous allons voir qu'un array est comme une variable, mais en plus fort ! J'espère que maintenant vous comprenez le fonctionnement d'une variable, sinon allez relire mon premier tuto. Prenons l'exemple d'une variable contenant un texte, par exemple le nom d'un héros, celui qu'on aime tous :
$nom = "Arshes"
Jusque là rien de compliqué on donne à la variable $nom la valeur "Arshes". Supposons maintenant que notre ami Arshes, rencontre sur son chemins quelques amis guerriers et autres magiciens prets à l'aider. On peut leur donner à chacun un numéro par exemple, ce cette maniere :
$nom_0 = "Arshes"
$nom_1 = "Basil"
$nom_2 = "Sirus"
$nom_3 = "Mélody"
On a alors en tout 4 variables (petit rappel, j'ai mis des "underscore" pour séparer le mot "nom" du chiffre, car dans un nom de variable on ne met pas d'espace !), avec 4 valeurs différentes. Cependant vous voyez que ces variables ce ressemblent un peu, c'est donc maintenant qu'on va utiliser un array. Un array peut en fait contenir plusieurs valeurs, contrairement à une variable qui elle ne contient qu'une seule valeur, ici "Arshes" ou "Sirus" par exemple. On va créer un array, un "tableau" que l'on va appelé tout simplement $nom, et qui contiendra tous les noms : "Arshes", "Basil", "Sirus" et "Melody". On parle de tableau, car ces valeurs sont rangées pour que l'on puisse y accéder. Voici comment on pourrait représenter notre tableau $nom :

Chaque valeur occupe donc une ligne, et est associée à un numéro, car je vous rappelle que les valeurs sont rangées ! Attention cependant, car un array commence toujours à zéro, comme vous pouvez le voir ! La premiere valeur a pour numéro 0, et non pas 1. Mainenant avec ce tableau, il suffit de "demander" au programme la valeur qui se trouve à la position 2 de l'array $nom pour avoir le resultat "Sirus" par exemple. Mais voyons d'abord comment créer notre tableau $nom en Ruby. Il suffit simplement d'utiliser le signe égal comme pour une variable classique, et d'insérer toutes les valeurs à la suite, entre crochets et séparés par des virgules !
$nom = ["Arshes", "Basil", "Sirus", "Mélody"]
Cette ligne seule suffit à définir toutes les valeur du tableau, et au passage notez que le nombre de valeurs qu'on peut y mettre est illimité, enfin pour l'exemple je me suis contenté des quatres premiers noms de héos de la base de données...
Comment ensuite retrouver une valeur parmis ce grand tableau (4 valeurs wahou !) ? Très simple, on utilise encore une fois les crochets, de cette manière :
$variable = $nom[3]
Ainsi la variable $variable sera égale à la valeur de l'array n°3, c'est à dire "Mélody" (encore une fois un tableau commence à 0 et pas à 1).
Continuons sur cette lancée, sachez maintenant que les array fonctionnent exactement comme des variables : On peut avoir "array" "@array" ou "$array" comme les variables. Ils peuvent contenir aussi bien du texte, des chiffres ou quoi que ce soit d'autre, comme les variables, voire meme du texte et des nombres à la fois ! On peut leur ajouter .to_s ou .to_i, comme les variables. Attention cependant, n'oubliez pas d'ecrire les flottants avec des points, surtout que maintenant les virgules nous servent.
Souvenez-vous, je vous avait parlé de $game_variables au tutorial précédent. Vous devez comprendre maintenant qu'il s'agit d'un array, car qu'il y ait 10 variables d'événements dans votre jeu, qu'il y en ait 100, 3000, ou 89856, toutes leurs valeurs sont stockées dans $game_variables !

II-Manipuler les tableaux
Bon, reprenons notre exemple initial, l'array nommé $nom. On va maintenant s'amuser à lui faire subir tout un tas de choses. On va commencer par le "ranger"...Oui j'ai dit que les valeurs étaient rangées, mais là on va faire les ranger encore mieux...
$nom.sort
Voilà ce qui va nous servir. En fait cette ligne permet de ranger les valeurs soit par ordre alphabétiques si c'est des chaînes de caractères ou par ordre croissant pour des chiffres. Par exemple si on fait cela sur notre tableau $nom, il contiendra toujours les memes valeurs, mais pas dans le meme ordre. On aura ["Arshes", "Basil", "Mélody", "Sirus"] au lieu de ["Arshes", "Basil", "Sirus", "Mélody"]. Simple non ? Voici maintenant une autre fonction qui permet d'inverser tout ça :
$nom.reverse
Cette méthode reverse nous permet d'inverser les valeurs, c'est à dire que la premiere valeur devient la derniere par exemple. Dans le cas de notre tableau $nom, on passera de ["Arshes", "Basil", "Sirus", "Mélody"] à ["Mélody", "Sirus", "Basil", "Arshes"]. Autre exemple avec des chiffres, si on a par exemple [0, 1, 2, 3], la methode reverse le transformera en [3, 2, 1, 0] ! Allez, une autre méthode encore :
$nom.length
"length" signifie "largeur" en anglais. En fait cela nous donne la "taille" de notre tableau, en gros combien de valeurs il contient. Par exemple si on fait
$variable = $nom.length
...alors $variable contiendra le nombre d'éléments de l'array $nom, c'est à dire 4.
Et si on faisait un petit exercice pour se reposer (...) ? Si je vous donne l'array suivant :
$nombres : [99, 200, 8.2, -7, 8567]
Comment trouver à l'aide d'un code en ruby, le chiffre le plus grand, et le stocker dans une variable ? Ok c'est peut-etre un peu dur comme premier exercice, mais réfléchissez bien avec les 3 méthodes que vous avez, et voici meme un petit indice : Seules 2 méthodes vont nous servir.
Voici la solution, essayer avant de regarder, faites votre code sur le bloc note par exemple et dés que vous penser que c'est bon vérifiez. Sachez aussi qu'il y a plusieurs solutions, et rien qu'avec ces 3 méthodes j'en vois déjà 2...en voici une :
$nombres : [99, 200, 8.2, -7, 8567]
$nombres.sort
$nombres.reverse
$nombre_le_plus_grand = $nombres[0]
Voici les explications ligne par ligne : La premiere ligne c'est celle qui définit le tableau, pas la peine de revenir dessus, je l'ai remise pour qu'on se souvienne bien de quoi on parle. La deuxieme ligne permet de ranger les valeurs dans l'ordre croissant, le chiffre le plus grand se retrouve donc en dernier, c'est pourquoi on utilise la méthode reverse pour l'avoir en premiere position. La derniere ligne n'a pas besoin de plus d'explications je pense. Mais je suis sur que certains d'entre vous vont se demander pourquoi on n'a pas fait directement
$nombres.sort
$nombre_le_plus_grand = $nombres[4]
Evidemment, le résultat est le meme puisqu'avec la méthode sort, le chiffre le plus grand se retrouve en dernier, c'est à dire en position 4 puisqu'il y a 5 valeurs (encore une fois, on part de 0...je sais je radote^^). C'est correct, mais ça ne vous fait pas beaucoup travailler, et en plus, on ne sait pas toujours combien l'array contient de valeur...Mais on peu le savoir avec "length" ! Finalement je vais vous le donner cette exemple, parcequ'il présente quelque chose de bien utile :
$nombres : [99, 200, 8.2, -7, 8567]
$nombres.sort
$derniere_position = $nombres.length - 1
$nombre_le_plus_grand = $nombres[$derniere_position]
Ne vous enfuyez pas...On reprend ligne par ligne. Encore une fois on utilise la méthode sort pour classer par ordre croissant. Mais quelle est cette variable $derniere_position ?? Hé bien, i vous regarder la derniere ligne, on a cherché comme dans l'exemple précédent, à "choisir" la derniere valeur du tableau, c'est-à-dire la quatrième. Cette valeur, 4, correspond bien au nombre total de valeurs du tableau moins 1 ! C'est logique qu'on enlève 1, car je vous le rapelle encore une fois (ça fait pas de mal^^), les tableaux commencent à la valeur 0. $derniere position correspond ainsi au "numéro" de la derniere valeur, c'est à dire la plus grande puisqu'on a utilisé sort. Et là, on a simplement mis une variable au lieu du chiffre 4 (puique le tableau est le meme, $derniere_position vaut aussi 4 !), ce qui est tout à fait faisable, et je le répéete, bien pratique ! Ne vous ennuyez pas avec ça si vous ne comprenez pas bien, mais retenez (et c'est ce que je voulais montrer) que vous pouvez toujours mettre des variables à la place des valeurs !
Allez, c'est fini pour cet exercice, on va continuer de jouer avec notre tableau $nom, voici maintenant les méthodes utilisables les plus intéressantes !
Et si on retrouvait nos héros, Arshes et compagnie ? Reprenons aussi notre tableau $nom. Imaginons maintenant que, lancés sur la périlleuse route de l'aventure, nos téméraires combattants fassent la rencontre d'un nouvel allié. Tout ça pour vous dire comment ajouter une valeur à un array. C'est simple en fait il suffit d'utiliser le signe + ! Et souvenez vous bien que les raccourcis tels que += existent aussi. Pour ajouter le nom "Estelle" à notre liste, voici comment faire :
$nom += ["Estelle"]
Ya-t-il quelque chose à expliquer ? Souvenez-vous simplement de bien mettre les crochets, pour le reste tout marche comme les variables. Vous pouvez évidemment ajouter aussi une valeur chiffrée, auquel cas, comme d'habitude vous ne mettrez pas de guillemets !
On peut egalement enlever une valeur avec le signe - , ça marche exactement pareil. Pour finir, on ne peut pas "diviser" le tableau, mais on peut le "multiplier". Oui c'est bizarre, regardez plutot :
$nom = ["Arshes", "Basil", "Sirus", "Mélody"]
$nom *= 2
Ici, on multiplie par 2 (évidemment il faut ici un chiffre, pas du texte !!). En fait les valeurs du tableau vont etre recopiées à la fin, ce qui nous donnera : ["Arshes", "Basil", "Sirus", "Mélody", "Arshes", "Basil", "Sirus", "Mélody"]. Je ne vous montrerai pas d'exemple avec la multiplication par 3, 4, 5 ou 888, ne m'en veuillez pas...
Une petite devinette "gastronomique" pour finir :
$menu1 = ["salade", "entrecote", "frites", "crême brûlée"]
$menu2 = ["escalope", "haricots verts", "glace"]
$menu1 -= ["salade"]
$total = $menu1 + $menu2
$total.sort
$total.reverse
$resultat = $total[1]
Déjà je m'excuse, mais je n'ai pas réussi à trouver plus compliqué ! Le but du jeu est bien sur de retrouver la valeur de $resultat....
En fait je ne sais pas moi-même la reponse, la voici donc, l'enigme résolue en direct live :
$resultat vaut..."frites" !! En fin de compte, tout ce code revenait à choisir le deuxieme alimant le plus loin dans l'ordre alphabétique parmis les deux tableaux...Bon c'était vache, mais faut bien s'amuser !!
On va maintenant passer à quelque chose d'encore plus intéressant.

III-Hachez les tableaux !
Pour commencer, je vous rassure tout de suite, rien de violent ou de gore là-dedans, désolé...Et je précise qu'aucun tableau ne sera maltraîté dans la suite de ce tutorial. Bon trève d'humour douteux, passons aux choses serieuses ! On va laisser de coté Arshes et sa joyeuse troupe, et reprendre l'exemple de l'exercice précédent. Prenons par exemple cet Array :
$menu = ["salade", "entrecote", "frites", "crême brûlée", "coca light"]
Vous constatez qu'on a un bon repas, une entrée, une viande, etc. Pour avoir la viande par exemple on fera juste
$menu[1]
...qui aura alors pour valeur "entrecotte" (miam). Seulement voilà, il n'est pas toujours facile de se souvenir que le 1 correspond à la viande oe le 3 au dessert. Hé bien en "hachant" notre tableau, on va pouvoir utiliser pour se repérer non plus des chiffres, mais des chaines de caracteres. Ainsi on pourra par exemple dire que "entrecote" correspond à la "viande" de $menu1, alors qu'avant on aurait dit que "entrecote" était l'éléement n°2 de $menu. Voici tout de suite le code permettant de faire ceci, mieux vaut je pense commencer par vous le montrer :
$menu = {
"entrée" => "salade",
"viande" => "entrecote",
"légumes" => "frites",
"dessert" => "crême brûlé",
"boisson" => "coca light"
}
Premier détail : On n'utilise plus des crochets mais des accolades. Cependant quand on voudra retrouver une valeur en particulier on utilisera toujours les crochets, mais pour l'instant, on n'en a pas fini avec ce petit bout de code ! En fait la suite est assez simple, je dirait meme "logique", on indique une clé, et ensuite sa valeur. Hé oui, "entrée", "dessert" ou "boisson" sont appelées des clés, leurs valeurs respectives étant "salade", "crême brûlée" et "coca light" (régime oblige). Maintenant pour savoir quel dessert on a commandé, il suffit d'utiliser :
$menu["dessert"]
Avouez que c'est plus explicite qu'avec un chiffre non ? Et n'oubliez pas de mettre les guillemets sinon le programme va chercher la variable s'appellant dessert !
Bien entendu on peut toujours utiliser les methodes length, sort ou reverse, même si l'utilité de ces deux dernieres saute moins aux yeux...On peut rajouter une clé et sa valeur, le plus naturellement du monde (enfin après ça dépend des gens quoi^^) :
$menu["fromage"] = "camembert"
Je vous avoue que je ne savais plus vraiment quoi rajouter...Notez que cette methode fonctionne ausi avec les tableaux précédents, mais encore une fois c'est exactement comme les variables !

IV-Tableau ou Hachage ?
Bon, ce petit paragraphe n'est peut etre pas d'un utilité fondemmentale, mais puisque maintenant vous connaissez ces deux outils, mieux vaut savoir quand utiliser chacun d'entre eux !
En fait, quand les donnees ont besoin d'etre triées, répertoriées, et qu'elles contiennent le meme genre d'information, mieux vaut utiliser un tableau comme ceux de la premiere partie. Si l'on reprend notre Array $nom, qui contient les noms des héros, il serait bien inutile d'utiliser un hachage. En effet, il s'agit ici d'une simple liste de noms, les clés, s'il y en avait, pourraient être "nom du perso 1", "nom du perso 2" etc...Vous comprenez bien qu'il est plus intéressant de garder les chiffres d'un tableau. Mais par contre, l'exemple du menu, qui contient des donnees variées, un hachage permet de s'y retrouver bien plus facilement. Voilà, c'était une simple précision, on peut maintenant passer au chapitre le plus intéressant !

V-La vraie puissance des Array !
Attention ce chapitre est plutot difficile, alors ouvres bien vos mirettes !^^
Reprenons le tableau $nom, encore une fois. Il contient le nom de chacun des personnages. On voudrait aller plus loin, et faire un tableau pour chaque personnage, comprenant toutes ses caractéristiques. On pourrait faire ceci :
$perso_0 = {
"Nom" => "Arshes",
"Arme" => "Epée",
"Classe" => "Combattant",
"Niveau" => 1
}
$perso_1 = {
"Nom" => "Basil",
"Arme" => "Lance",
"Classe" => "Lancier",
"Niveau" => 8
}
...et ainsi de suite pour les 2 autres personnages. Bon je me suis arrêté aux, nom, arme, classe et niveau, évidemment c'est infini. Notez que la valeur de la clé "niveau" est un entier, comme ça on peut effectuer des opérations dessus pendant, comme ajouter 1 au niveau si le perso a assez d'expérience. Vous le voyez ça ressemble énormément au tout premier exemple de ce tutorial, où on avait $nom_0, $nom_1 et compagnie...Vous voyez où je veux en venir ? On va faire un tableau, qui va contenir ces tableaux ! Il contiendra donc les tableaux correspondants à chaque personnage, et contenant toutes ses informations. VOici comment on pourrait le représenter :

En fait les valeurs des clés du tableau ne sont plus des chiffres où du texte, mais d'autres tableaux !! On peut alors procéder de deux manières pour créer ce genre de tableau : soit définir chaque "sous-tableau" d'abord, puis créer le tableau qui les contiendra en disant qu'il contient tel et tel tableau, ou bien tout définir d'un coup. Voyons la premiere méthode :
$perso_0 = {
"Nom" => "Arshes",
"Arme" => "Epée",
"Classe" => "Combattant",
"Niveau" => 1
}
$perso_1 = {
"Nom" => "Basil",
"Arme" => "Lance",
"Classe" => "Lancier",
"Niveau" => 8
}
$persos = [ $perso_0, $perso_1 ]
Tout simplement, on réutilise les noms des tableaux précédents, mais attention cependant, ne mettez pas de guillemets, sinon votre tableau contiendra les chaines de caractères "$perso_0" et "$perso_1"...Et bien sur, on peut aussi utiliser un hachage ici, mais ce n'est pas la peine puisque ces tableaux servent à la meme choses et contiennent le meme genre de données. Voici maintenant la deuxieme méthode, qui permet de définir directement le tableau, mais attention car votre code doit etre clair et bien indenté (je ferai une annexe là-dessus). Voilà ce que j'ai fait (en ne reprenant que 2 persos encore une fois) :
$persos = [
{
"Nom" => "Arshes",
"Arme" => "Epée",
"Classe" => "Combattant",
"Niveau" => 1
},
{
"Nom" => "Basil",
"Arme" => "Lance",
"Classe" => "Lancier",
"Niveau" => 8
}
]
L'explication est simple, par rapport au premier exemple j'ai simplement remplacé $perso_0 et $perso_1 par leurs définitions, toujours entre crochets et séparés par une virgule. On ouvre les crochets, on met le permier élément, le tableau, ensuite une virgule et le deuxieme tableau, puis enfin on ferme les crochets. Cette méthode n'est toutefois pas toujours conseillée. En effet, ici on a seulement 2 dimensions, c'est à dire un tableau qui en contient d'autres, mais imaginez qu'on ait par exemple 5 dimensions, comprenez : un tableau qui contient des tableaux qui contiennent des tableaux qui contiennent des tableaux qui contiennent des tableaux ! Vous comprenez alors que ça peut vite devenir le foutoir. Rassurez vous quand meme, pour arriver à faire un tableau à 5 dimensions, faut vraiment être masochiste, 2 dimensions devraient suffire pour la plupart des tâches.
Voyons maintenant comment "isoler" des données et ensuite les modifier par exemple. Par exemple, si on veut le niveau du perso n°0, comment faire ? En fait on commence par dire de quel tableau on parle, le tableau "le plus grand" on va dire, celui qui contient tous les autres, ici "$persos". Bon ici on parle de $perso_0, autrement dit Arshes ! Voici comment "sélectionner" le tableau $perso_0 :
$persos[0]
Regardez bien, c'est logique, on sélélectionne le premier élément du tableau, que ce soit un autre tableau ou une variable, ça fonctionne pareil. Cependant là on a sélectionné tout le tableau, autrement dit il reste encore à ne prendre que la valeur de la clé "niveau" de ce tableau (je rappelle qu'on cherche le niveau de ce personnage !). Comprenez bien que $perso[0] est notre tableau, c'est comme le $perso_0 du premier exemple. Et comment on fait pour choisir la valeur d'une clé dans un tableau ? Hé bien on réutilise les crochets, juste après le nom du tableau, comme on fait depuis le début du tuto. En fait, seul le nom du tableau change :
$perso[0]["niveau"]
Ce qui renverra la valeur 1. L'important est de bien voir $perso[0] comme un tableau, duquel on prend une valeur. Comme je l'ai dit précedemment, on peut avoir un nombre illimité de dimensions, et donc de crochets derriere....
Ce nouvel outil vous permet en tout cas une chose extrêmement utile et pratique : créer une base de données. Hé bien oui, vous voyez la base de données de RPG Maker ? Hé bien on peut maintenant faire la meme chose. Définir une liste de personnages, ici avec un tableau principal nommé $persos, et toutes leurs caractéristiques (nom, arme, etc...) ! Voilà qui va s'avérer très utile pour un systeme de combat ! Là, on a rentré les valeurs de base des statistiques, celles du début du jeu, comme on l'aurait fait dans la base de données du logiciel. Ces valeurs sont évidemment variables, le niveau peut augmenter par exemple. Si vous avez encore du mal, voici comment faire. Vous vous souvenez comment récupérer le niveau d'un perso ? Sinon regarder juste au dessus^^ Ce bout de code n'est ni plus ni moins qu'une variable : le niveau de Arshes ! On peut la modifier comme toute variable, lui faire subir tout un tas de truc, bref l'éclate totale !!! =D
Pour rajouter un niveau au perso n°1, facile :
$perso[0]["niveau"] += 1
Juste un petit rappel, on a défini précédemment le niveau comme égal à 1, c'est donc une variable de type "int", donc encore une fois cela fonctionne comme une variable, c'est pour ça qu'on peut effectuer des opérations dessus, contrairement au nom par exemple, qui est de type "string" (auquel on peut toutefois "ajouter" une autre chaine de caractères).
Voilà qui clot ce tutorial ! Le prochain sera le plus important car on y parlera conditions (auf changement de programme...), et les possibilités étant encore plus larges que celles proposées par RPG Maker, vous allez enfin pouvoir commencer à faire des choses trèèès intéressantes !!