Aller au contenu
Top-Metin2.org - Vous êtes à la recherche d'un serveur Metin 2 ? ×
×
×
  • Créer...

[Création] Les boucles


Swice

Messages recommandés

Bonjour, bonsoir à toutes et à tous !

Aujourd'hui je vous fais part de mon tout premier tutoriel sur Funky-Emulation, il portera sur les quêtes, et plus particulièrement sur les boucles, comme indiqué dans le titre.

 

Après avoir suivi les tutoriels d'autres membres qui vous apprennent à faire des quêtes lorsque vous débutez, vous comprendrez ce tutoriel.

Ce tutoriel portera principalement sur les boucles et sur différentes manières de les utiliser.

 

Commençons dès à présent par les boucles "Tant que" !

Je vous présente tout d'abord l'aspect réel de cette boucle, puis les différentes utilisations.

 

La boucle :

while condition est vraie do 
	Instructions
end

 

Exemple :

while Le four est froid do
	Chauffer le four
end

 

Passons maintenant à son emploi :

function tantQue1()
	local test = number(1,9)
	while test > 5 do // Tant que "test" est supérieur à 5 faire
		test = number(1,9) // "test" reprend une valeur aléatoire entre 1 et 9
	end
	return test // retourne la valeur de test (supérieure à 5)
end

 

Je vous l'accorde, cette fonction n'est pas très utile, mais je vous donne juste la manière de la former, à vous de trouver à quoi elle va vous servir.

function tantQue2()
	local tableau_tuto = {} // Création du tableau 
	local tant // Création de la variable
	while table.getn(tableau_tuto) < 3 do // Tant que la 'taille' du tableau est inférieure à 3 faire
		tant = number(1,5) // On stock dans la variable "tant" un nombre aléatoire entre 1 et 5
		table.insert(tableau_tuto, tant) // On stock la valeur de tant dans le tableau créé au début
	end
	say("Votre code est le "..tableau_tuto[1]..tableau_tuto[2]..tableau_tuto[3]) // On affiche un code à 3 chiffres
end
 

Cette fonction va vous donner un code à 3 chiffres contenu entre 000 et 555. A vous de trouver à quoi elle peut servir !

À présent je passe à la boucle contraire : "Faire .. Jusqu'à ce que .." !

 

La boucle :

repeat 
	Instructions
until Condition
 

Exemple :

repeat 
	Augmenter le son
until Assez fort

 

 

Passons maintenant à son emploi :

function repeat_until()
	local test = {"A", "B", "C", "D"} // On crée un tableau de valeurs 
	if table.getn(tableau_repeat_until) == table.getn(test) then // Si les deux tableaux (Celui que l'on vient de créer et celui qui sera présenté ci-dessous) sont de la même taille
		tableau_repeat_until = {} // Vider le tableau 'tableau_repeat_until'
	end
	local valeur // Création de la variable
	repeat // Faire..
		valeur = table_get_random_item(test) // Donner à "valeur" une valeur aléatoire du tableau
	until !table_is_in(tableau_repeat_until, valeur) // Jusqu'à ce que cette valeur ne soit pas dans la tableau 'tableau_repeat_until'
	table.insert(tableau_repeat_until, valeur) // Entre "valeur" dans le tableau 'tableau_repeat_until'
	return valeur // Retourne "valeur"
end

when 20000.chat."Tutoriel" begin
	local lettre = nom_de_la_quete.repeat_until()
	say(lettre)
end

 

Pour ceux ne possédant pas la fonction table_is_in (à mettre dans questlib.lua et à déclarer dans le quest function)

function table_is_in(self, test)
	for i = 1, table.getn(self) do
		if self[i]==test then
			return true
		end
	end
	return false
end
 

Attention, il faut créer le tableau 'tableau_repeat_until' dans le questlib.lua, de cette manière :

tableau_repeat_until = {}

 

Voilà à peu prêt à quoi sert cette boucle, à vous de lui trouver une utilité !

Pour finir, les boucles "Pour" !

 

La boucle :

for i = X, Y do // 0 < X < Y
	Instructions
end
 
for i = X, Y, Z do // 0 < X & 0 < Y
	Instructions
end

 

Ici, Z est l'avancement de la boucle. Z peut être positif, comme négatif. C'est lui qui déterminera l'avancement de la boucle. Si Z est implicite, il vaut 1.

 

Passons maintenant à son emploi :

function pour()
	for i = 3,6,1 do // Pour i allant de 3 à 6, et de 1 en 1, faire
		affect.add_hair(i, 10, 60*60) // Donner 10 points au bonus d'id 'i'
	end
end

 

Cette fonction donne 10 points au bonus d'identifiant 'i'.

Comme les autres, elle n'est pas très très utile, le but étant juste de vous les faire découvrir. À vous de jouer maintenant !

 

Elle résume cette fonction :

 

function give_bonus()
	affect.add_hair(3, 10, 60*60)
	affect.add_hair(4, 10, 60*60)
	affect.add_hair(5, 10, 60*60)
	affect.add_hair(6, 10, 60*60)
end
 

Elle n'est pas forcément plus longue à écrire, mais bien moins propre et 'moche'.

J'en ai fini avec toutes ces boucles. Je pense que ce tutoriel pourra aider les nouveaux ayant de l'imagination !

 

Je vous dis à bientôt, et bonne journée/soirée !

Modifié par Kameyu
Correction de la mise en forme
  • Love 3
Lien vers le commentaire
Partager sur d’autres sites

  • Réponses 13
  • Créé
  • Dernière réponse

Meilleurs contributeurs dans ce sujet

Meilleurs contributeurs dans ce sujet

function tantQue1()

local test = number(1,9)

while test > 5 do // Tant que "test" est supérieur à 5 faire

local test = number(1,9) // "test" reprend une valeur aléatoire entre 1 et 9

end

return test // retourne la valeur de test (supérieure à 5)

end

 

Vous êtes sure que c'est bien local test = number(1,9) qui est renvoyé ? Cela ne serait pas plutôt local test = number(1,9) ?

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Je vais expliquer la fonction un peu plus en détail.

 

Tout d'abord, je donne une valeur à la variable "test". => local test = number(1,9)

Ensuite, je dis :

Tant que "test" est supérieur à 5, faire :

test = number(1,9)

Je change donc la valeur de "test". Puis la boucle recommence, et recommence jusqu'à ce que j'ai une valeur de "test" inférieure à 5. (je précise que la boucle commence à while et se termine au premier end.

 

Maintenant pour l'affichage :

 

Si "test" < 5, il m'affiche la valeur. "test" est affiché.

Si "test" > 5, il fait la boucle, pour me donner une valeur inférieur (cette valeur sera "test"). "test" est affiché.

 

Voilà voilà, je pense que j'ai tout dis, si tu as d'autres, n'hésites pas !

Lien vers le commentaire
Partager sur d’autres sites

Citation
Bonjour,

 

Je vais expliquer la fonction un peu plus en détail.

 

Tout d'abord, je donne une valeur à la variable "test". => local test = number(1,9)

Ensuite, je dis :

Tant que "test" est supérieur à 5, faire :

local test = number(1,9)

Je change donc la valeur de "test". Puis la boucle recommence, et recommence jusqu'à ce que j'ai une valeur de "test" inférieure à 5. (je précise que la boucle commence à while et se termine au premier end.

 

Maintenant pour l'affichage :

 

Si "test" < 5, il m'affiche la valeur. "test" est affiché.

Si "test" > 5, il fait la boucle, pour me donner une valeur inférieur (cette valeur sera "test"). "test" est affiché.

 

Voilà voilà, je pense que j'ai tout dis, si tu as d'autres, n'hésites pas !

Bonjour, désolé de reprendre le sujet mais, en déclarant la variable test en local, elle n'a de valeur que dans la portion de code incluant la boucle et en la déclarant une nouvelle fois dans la boucle, elle n'a de valeur que dans la boucle donc, en sortant de la boucle, normalement, la variable test devrait reprendre la valeur de la première déclaration. Il me semble mais tout est une affaire de langage, c++, lua, basic ... tous n'ont pas la même réponse.

 

Cordialement

Modifié par noc
Lien vers le commentaire
Partager sur d’autres sites

En effet, le code

local test = number(1,9)
   while test > 5 do // Tant que "test" est supérieur à 5 faire
       local test = number(1,9) // "test" reprend une valeur aléatoire entre 1 et 9
   end
   return test // retourne la valeur de test (supérieure à 5)

 

fonctionnera mais est faux d'un point de vue algorithmique. Le second local n'est en rien nécessaire.

 

Ce qu'il faut comprendre, c'est la portée de la variable test dans la boucle. Par exemple :

function test()
    while condition do
         local texte = "chaine"
    end
    return texte
end

 

 

Ce code ne fonctionnera pas. La variable texte n'existe que dans la boucle et nul part ailleurs. Elle n'existe pas dans la fonction mère.

 

Par contre,

function test()
    local texte = "test"
    while condition do
         texte = "chaine"
    end
    return texte
end

 

 

nous renverra "chaine" (et non "test"). La variable texte est créée dans la fonction et sa valeur est modifiée dans la boucle.

 

Il faut comprendre que si la variable est déclaré dans un élément parent, elle le sera dans un élément enfant.

Si la variable déclarée dans l'élément parent est modifiée dans l'élément enfant, alors elle sera modifiée également dans l'élément parent.

 

Attention : quand je parle de l'élément enfant, c'est uniquement une boucle ou une condition et JAMAIS un appel de fonction qui, si elle est déclarée dans un autre fichier, ne possède pas les variables de l'élément parent (d'où les arguments). Les arguments manipulés à l'intérieur de la fonction sont des copies des réels arguments situés dans l'élément "parent" (celui depuis lequel on a appelé la fonction) et donc ces derniers ne seront pas modifiés.

Lien vers le commentaire
Partager sur d’autres sites

Merci ProleptylMT2 2.0 , c'est ce que je voulais souligner, d'un point de vu algorithmique c'est dangereux de programmer de la sorte, de plus déclarer une variable dans une boucle, c'est une perte de temps machine donc à ne faire que si on n'a pas le choix.

 

Cordialement

Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...
  • 2 semaines après...


  • brilliantdiscord_widget
  • Flux d'Activité

    1. 37
    2. 21

      Metin2 en 2020 peut-on en parler?

    3. 0

      METIN2Project

    4. 3

      Ressources - UnPack - Metin2 Client - Officiel

    5. 0

      Barre des tâches d'argent étendue

    6. 16

      Redémarrage automatique des channels

    7. 16

      Multi Logo GM / SGM / GA

  • En ligne récemment

    • Aucun utilisateur enregistré regarde cette page.

Information importante

Conditions d’utilisation / Politique de confidentialité / Règles / Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.