• 06 Décembre 2019, 09:17:19


Auteur Sujet: [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]  (Lu 17915 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2210
    • Voir le profil
Apprenons le Pawn avec Gilux !
Partie 2 :Structures utiles

Salut, et bienvenue dans la 2e partie de mon tutoriel PAWN.
Dans le 1er tuto, vous avez pu voir comment bien débuter en scripting, et créer vos premières commandes.

Maintenant, nous allons voir comment gérer les structures avancées

SOMMAIRE :
1) Les variables
    1.1) Des variables spéciales : les arrays
2) Les conditions
3) Les boucles
4) Conclusion


1) Les variables
Une variable est une information (32 bits) qui va aller se loger dans la mémoire vive de votre machine. Elle permet de contenir une information comme le nom du joueur, la couleur de son pseudo et bien d'autres choses.
Il existe 2 catégories de variables : Les variables globales et les variables locales
Contrairement à une variable locale qui fonctionne uniquement entre les accolades où elle est placée, une variable globale sera utilisé dans tout le script, elle pourra être modifiée dans tous les callbacks.
Une variable se déclare avec le terme new, qui peut être complété par un des tags suivants, en fonction du type de variable qu'il doit retenir :

    * bool : Booléen
    * Float: Nombre à virgule
    * File : Fichier
    * text : Textdraw
    * Menu : Menu
(Il n'est pas obligé d'en mettre)

Exemple :
Code: Pawn
  1. new Float:PositionX;
Code: Pawn
  1. new Menu:tuning;
Code: Pawn
  1. new File:Listeban;

J'ai donc ici créé 3 variables, la 1ère stockera un nombre à virgule, le second un menu, et le dernier un fichier.
Note : Ne pas oublier le ; !

On peut aussi déclarer une variable comme ça :
Code: Pawn
  1. new vie = 40;
(Donner une valeur à la variable dès sa déclaration)

Code: Pawn
  1. new vie, armure, argent;
(Déclarer plusieurs variables d'un seul coup (Mais on ne peut pas leur attribuer de valeur)

Modifier une variable
Si dans votre script, vous avez le besoin de modifier une variable, voici la syntaxe :
Code: Pawn
  1. MaVariable = 10;
La valeur de MaVariable passera à 10.

1.1)Des variables spéciales : Les arrays
1.1.1) Les tableaux simples
Les arrays sont des tableaux de variables. Ils vous permettent de stocker des variables sans être obligé d'en créer un nombre énorme.
Dans un tableau, une valeur est associée à un index. Cet index commence toujours à 0. C'est à dire qu'un tableau avec 25 index se terminera par l'index 24.

Si cela vous est flou, voici une représentation de ces tableaux :


Pour créer un array, on procède de la même manière qu'une variable, c'est à dire avec new. Voici comment créer le tableau ci-dessus :
Code: Pawn
  1. new monTableau[8];
Ce code va faire la même chose en une ligne que ceci :
Code: Pawn
  1. new var0;
  2. new var1;
  3. new var2;
  4. new var3;
  5. new var4;
  6. new var5;
  7. new var6;
  8. new var7;
  9.  

Pour assigner une variable à un index particulier du tableau, on procède comme ceci :
Code: Pawn
  1. nomDuTableau[index] = valeur;
Ainsi, pour modifier la case avec l'index 4, qui est donc la 5e case, on fera :
Code: Pawn
  1. nomDuTableau[4] = valeur

Les chaînes de caractères sont aussi des arrays ! Chaque caractère occupe une case. Si l'on veut stocker le mot "Salut !" dans un tableau, il faudra 7 cases (5 lettres, 1 symbole et 1 espace) + 1 pour le nullbyte (\0) qui termine la chaîne de caractères.
Il faut donc déclarer un tableau de 8 cases.
Code: Pawn
  1. new string[8] = "Salut !"; //
  2. printf("Valeur de la 5e case (Et donc l'index 4) de mon tableau : %c",monTableau[4]); // La fonction printf envoie un texte formaté dans la console : Il peut changer en fonction de la valeur d'une variable. Ici, %c représente un caractère.
  3.  
Ici, la console affichera : Valeur de la 5e case (Et donc l'index 4) de mon tableau : t 

Il existe d'autres symboles pour printf : %i pour un entier, %s pour une chaîne entière, et %f pour un flottant.

Nous allons maintenant apprendre à utiliser ces variables, avec l'ajout de conditions.

2) Les conditions
Les conditions vont permettre d'adapter le script en fonction de certains paramètres donnés.

if
La condition basique est introduite avec le mot-clé "if" qui signifie "si", et "else" qui signifie "sinon".
Voici un bout de code :

Code: Pawn
  1. if(GetPlayerMoney(playerid) >= 25000)
  2. {
  3. SendClientMessage(playerid,0xFFFFFF,"Tu as beaucoup d'argent !");
  4. }
  5. else
  6. {
  7. SendClientMessage(playerid,0xFFFFFF,"Tu es pauvre toi :p");
  8. }

(Ce code dira "Tu as beaucoup d'argent !" si le joueur à plus de 25000 $)

Donc on peut remarquer que :
• Toute ce qui suit une condition doit être entre accolades
• Une condition ne prend jamais de point-virgule
• Si la 1ère condition n'est pas remplie, on fait ce qui correspond à "else"
• On utilise des signes comme >=

Ces signes sont des opérateurs, en voici une liste :

Signe   Signification
==    Egal à
!=    Différent de
>    Strictement plus grand que
<    Strictement plus petit que
>=    Plus grand ou égal à
<=    Plus petit ou égal à

Cette structure à un défaut : elle ne permet que de tester qu'une condition, mais cela va être corrigé maintenant :


else if
"else if" signifie "sinon, si". Si une première condition n'est pas validée, on va continuer et chercher si la 2e est vraie, etc.... jusqu'au "else" final si aucune condition n'est validée.

Voici un exemple commenté :
Code: Pawn
  1. <?php
  2.  
  3. if(GetPlayerMoney(playerid) >= 25000) // Si le joueur possède plus de 25 000 $
  4. {
  5. SendClientMessage(playerid,0xFFFFFF,"Tu as beaucoup d'argent !"); // On envoie le message et le script ignorera les conditions suivantes.
  6. }
  7. else if (GetPlayerMoney(playerid) >= 10000) // Si il ne possède pas plus de 25 000$, mais si il en possède plus de 10 000
  8. {
  9. SendClientMessage(playerid,0xFFFFFF,"C'est pas encore ça, mais tu as de quoi vivre ;)"); // Même chose, on envoie le message et on continue
  10. }
  11. else // Si il possède moins de 10000
  12. {
  13. SendClientMessage(playerid,0xFFFFFF,"Tu es pauvre toi :p"); // Si les 2 premières conditions sont fausses (Il n'a pas plus de 25000, ni plus de 10000), on envoie ce message.
  14. }


Les conditions multiples
Il peut vous arriver de vouloir tester 2 ou plusieurs conditions ensemble.

Pour cela, il existe 2 signes : && et || (Alt Gr + 6). Le 1er signifie "ET" et le second signifie "OU"

Exemple :
Code: Pawn
  1. if (GetPlayerMoney(playerid) >= 25000) && GetPlayerScore(playerid) >= 100)
signifiera "Si le joueur a 25000$ ou plus ET si il a 100 points ou plus"
alors que
Code: Pawn
  1. if (GetPlayerMoney(playerid) >= 25000) || GetPlayerScore(playerid) >= 100)
signifiera "Si le joueur a 25000$ ou plus OU si il a 100 points ou plus"

Inverse
Il existe un symbole pour indiquer l'inverse : ce symbole est "!"
Exemple :
Code: Pawn
  1. if (!GetPlayerMoney(playerid) > 25000)
Revient à dire : "Si le joueur n'a pas plus de 25000 $" et équivaut à : if (GetPlayerMoney(playerid) < 25000)


Retour direct
Pourquoi garder 3 lignes alors qu'on peut en utiliser qu'une ?

En effet,
Code: Pawn
  1. if (!IsPlayerAdmin(playerid)) // Si le joueur n'EST PAS admin
  2. {
  3. SendClientMessage(playerid,color,"Cette commande est réservée aux admins !");
  4. }

Peut s'écrire :
Code: Pawn
  1. if (!IsPlayerAdmin(playerid)) return SendClientMessage(playerid,color,"Cette commande est réservée aux admins !");

Tout se joue après le return, vous pouvez utiliser la même chose pour varier du SERVER:UNKNOWN COMMAND.
Dans OnPlayerCommandText, remplacez "return 0;" par "return SendClientMessage(playerid,color,"Cette commande est réservée aux admins !");"
Cela remplacera le message pas beau à voir  :lmao

Passons à la suite, les boucles !

3) Les boucles
Les boucles permettent de faire automatiquement des actions répétitives.
Ainsi, si vous voulez vous faire flooder pour le fun, au lieu de taper ceci :
Code: Pawn
  1. <?php
  2.  
  3. if(strcmp(cmd, "/floodemoi", true) == 0)
  4. {
  5.     SendClientMessage(playerid,0xFFFFFFFF, "Haha je te flood !!!");
  6.     SendClientMessage(playerid,0xFFFFFFFF, "Haha je te flood !!!");
  7.     SendClientMessage(playerid,0xFFFFFFFF, "Haha je te flood !!!");
  8.     SendClientMessage(playerid,0xFFFFFFFF, "Haha je te flood !!!");
  9.     SendClientMessage(playerid,0xFFFFFFFF, "Haha je te flood !!!");
  10.     SendClientMessage(playerid,0xFFFFFFFF, "Haha je te flood !!!");
  11.  
  12. // Et ceci 50 fois...
  13.     return 1;
  14. }

Il existe des boucles, qui tourneront tant qu'une condition sera vraie.

Nous allons commencer avec "While", la plus basique.

While

La boucle While reçoit un paramètre, c'est une condition. Tant que celle-ci sera vraie, la boucle tournera indéfiniment.

Voici un code qui fait la même chose que la commande précédente.

Code: Pawn
  1. <?php
  2.  
  3. new Flood;
  4. if(strcmp(cmd, "/floodemoi", true) == 0)
  5. {
  6. while(Flood < 200)
  7. {
  8.     SendClientMessage(playerid,0xFFFFFFFF,"Haha je te flood !!!");
  9.     Flood++;
  10. }
  11. }

Je résume : Tant que "Flood" sera inférieur à 200, on envoie un message au joueur, et on incrémente Flood (Très important, sinon la boucle tournera indéfiniment, faisant crasher votre serveur)

Do.....While
Il existe une autre forme de boucle : do.....while. Celle-ci, contrairement à while, effectuera une fois l'action, même si la condition est fausse !. La syntaxe est quasiment identique, excepté une petite différence : la condition se met sous la boucle.

Exemple :
Code: Pawn
  1.  
  2. <?php
  3.  
  4. new test = 10; // On crée une variable et on lui met 10 comme valeur.
  5. do // Initialisation de la boucle
  6. {
  7.         test++; // Incrémentation de la variable
  8.         print("Boucle Do...while effectuee"); // Envoie un message dans la console du serveur.
  9. }
  10. while (test < 10); // Tant que test est plus petit que 10
  11.  

Dans ce premier code, on crée une variable égale à 10.
La condition à beau être fausse (10 n'est pas plus petit que 10), l'action sera effectuée une fois, la variable vaudra 11, et on sortira de cette boucle.

Maintenant, nous allons décrémenter la variable.

Code: Pawn
  1.  
  2. <?php
  3.  
  4. new test = 10; // On crée une variable et on lui met 10 comme valeur.
  5. do // Initialisation de la boucle
  6. {
  7.         test--; // Incrémentation de la variable
  8.         print("Boucle Do...while effectuee"); // Envoie un message dans la console du serveur.
  9. }
  10. while (test < 10); // Tant que test est plus petit que 10
  11.  

La condition à l'entrée de la boucle est fausse, cependant elle sera effectuée une fois, et la variable sera décrémentée (-1)
La condition deviendra vraie (9 < 10) et la boucle continuera indéfiniement jusqu'à l'irrémédiable crash !  :ninja

For
For fait la même action que While, mais elle regroupe la création de la variable, la condition et l'incrémentation directement.
Exemple :

Code: Pawn
  1. <?php
  2. for (new player = 0; player <= MAX_PLAYERS; player++) // Ligne où tout se passe, je vais la décrire après
  3. {
  4.         GivePlayerMoney(player,20000); // Attention ! Remplacer "playerid" par le nom de votre variable !
  5. }
  6.  

Ce code donnera 20000$ à tous les joueurs connectés.

Revoyons la 1ère ligne :
new player = 0; : Déclaration de la variable.
player <= MAX_PLAYERS : La condition (MAX_PLAYERS est une valeur automatique, elle signifie "L'ID le plus grand d'un joueur" : Cela revient à dire : Tant que tous les joueurs ne se sont pas servis ^^)
player++ : L'incrémentation de la variable.

A vous de voir quelle boucle vous souhaitez utiliser, sachant qu'elles sont quasiment identiques, "for" prend juste moins de place :)

4) Conclusion
Voila, c'est la fin de cette 2e partie !
Vous avez appris beaucoup de choses, avec ce que vous avez appris là vous avez ce qu'il faut pour commencer à avoir un serveur correct, néanmoins il vous faudra être curieux (parcourir le wiki, télécharger un GM de base pour voir sa constitution, etc.)
Une 3e partie viendra prochainement conclure ce tutoriel.

Sur ce, bon courage à tous ;)
++

Suite : Conclusion


Reproduction autorisée, sous conditions Creative Commons.
« Modifié: 02 Octobre 2012, 22:57:19 par GtaManiac »
Je ne donne pas d'aide en MP ou skype, le forum est là pour ça :wink:


Hors ligne Watash

  • Administrateur IG
  • *
  • Messages: 5933
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #1 le: 22 Septembre 2010, 15:45:00 »
Et en plus les chapitres arrivent vite ! Merci :D

"Say good night, Mr. Diaz" (GTA VC)

Hors ligne S!m

  • *
  • Messages: 2354
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #2 le: 22 Septembre 2010, 15:46:39 »
Salut,

beau tuto.

Tu devrais peu-être insister sur 2 ou 3 petits points:

la boucle while ne prend pas de ; alors que la do...while en prend un à la fin (après le while(...)), ça évitera bien des erreurs aux gens inattentifs

Les variables en PAWN font 32 bits (4 octets) chaque, pas 1 bit (qui serait un booléen mais en pawn on utilise quand même 32 bits).
Pour les variables locale, on dira qu'elle n'est valide que pour le bloc d'instruction où elle est déclarée.
En ce qui concerne les tags, si on veut ne pas en mettre _:Variable permet de ne pas tenir compte du tag de la variable.
On peut créer des nouveaux tags autant qu'on le désire, suffit de l'utiliser (ex: new player:playerid; on a un tag player et aucun problème, suffit de toujours utiliser le même tag sur la même chose (comme les Float avec les Float, les text avec les text....).

Je ne suis pas sur que ton premier code de points dans le chat (celui avec la variable) fonctionnera correctement, en général avec le ++ à la fin, l'incrémentation est faite après le reste. Utilise ++variable; pour être sûr (ou encore GetPlayerScore(playerid)+1 ou ton incrémentation sur une autre ligne intermédiaire).

Dernier commentaire pour le moment: attention à ton incrémentation. Un tuto ça doit être propre :P

sur ce, je déplace, bienvenue dans la section tutoriel

++Sim++





Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2210
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #3 le: 22 Septembre 2010, 16:57:31 »
Merci pour les commentaires, j'ai corrigé quelques trucs.

Citer
attention à ton incrémentation
Tu voulais pas dire indentation ?  :laugh je vais régler cela également.
++
Je ne donne pas d'aide en MP ou skype, le forum est là pour ça :wink:


Karting06

  • Invité
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #4 le: 10 Octobre 2010, 08:11:08 »
Salut,
Tu pourrais poster la troisième parti stp??
Merci,
Karting06

Hors ligne Aegoss

  • I'm gonna kick dat' ass !
  • *
  • • « a3goss - иsɢ Lєadєʀ » •
  • Messages: 4786
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #5 le: 10 Octobre 2010, 10:48:50 »
C'est déjà sympa qu'il vous fasse un gros tutoriel sympatoch de ce qu'il connait, alors tu vas lui dire de se presser.

Au pire, tu le payes si tu veux qu'il aille plus.

Très bonne initiative Guy Lux, ça va permettre à GtaOnline d'avoir encore de nouveaux tutoriaux pour ce qui veulent s'intéresser à ça.

Bonne continuation :)
HP Envy 15-K222NF - Argent
15,6'' Full HD - Intel Core i5-4200U - HDD 1 To - RAM 8 Go - NVIDIA GeForce GTX 850M 4 Go - LG E2251 - Logitech G105 - R.A.T 7 Contagion - Siberia V2 ''Orange''




Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2210
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #6 le: 10 Octobre 2010, 11:25:28 »
La troisième partie serait presque inutile, si tu jette un coup d'oeil au wiki (Intérieurs, Mondes Virtuels) tu as presque tout ce que je voulais mettre dans cette partie 3...
Je vais essayer de la faire prochainement, mais ayant un projet SA:MP en cours je suis juste au niveau du temps :/
++
« Modifié: 10 Octobre 2010, 12:24:22 par Gilux »
Je ne donne pas d'aide en MP ou skype, le forum est là pour ça :wink:


Karting06

  • Invité
C'est déjà sympa qu'il vous fasse un gros tutoriel sympatoch de ce qu'il connait, alors tu vas lui dire de se presser.

Au pire, tu le payes si tu veux qu'il aille plus.

Très bonne initiative Guy Lux, ça va permettre à GtaOnline d'avoir encore de nouveaux tutoriaux pour ce qui veulent s'intéresser à ça.

Bonne continuation :)

C'était juste une question j'ai jamais voulu le presser.

Hors ligne Aegoss

  • I'm gonna kick dat' ass !
  • *
  • • « a3goss - иsɢ Lєadєʀ » •
  • Messages: 4786
    • Voir le profil
C'est déjà sympa qu'il vous fasse un gros tutoriel sympatoch de ce qu'il connait, alors tu vas lui dire de se presser.

Au pire, tu le payes si tu veux qu'il aille plus.

Très bonne initiative Guy Lux, ça va permettre à GtaOnline d'avoir encore de nouveaux tutoriaux pour ce qui veulent s'intéresser à ça.

Bonne continuation :)

C'était juste une question j'ai jamais voulu le presser.

C'était juste une réponse.
HP Envy 15-K222NF - Argent
15,6'' Full HD - Intel Core i5-4200U - HDD 1 To - RAM 8 Go - NVIDIA GeForce GTX 850M 4 Go - LG E2251 - Logitech G105 - R.A.T 7 Contagion - Siberia V2 ''Orange''




Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2210
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #9 le: 10 Octobre 2010, 14:10:19 »
3e partie postée !
Je ne donne pas d'aide en MP ou skype, le forum est là pour ça :wink:


Hors ligne herq

  • *
  • Tueur en série
  • Messages: 116
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #10 le: 12 Octobre 2010, 12:56:27 »
Tuto qui apprend beaucoup ;). ( Même si je savais a peut prêt tout faire. ) C'est utile pour les trous de mémoire ;D.
A la recherche d'un moviemaker

Hors ligne Raptor

  • Scripteur Débutant :)
  • *
  • Tueur
  • Messages: 54
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #11 le: 11 Février 2011, 19:59:22 »
Salut Gilux ... J'ai lus t'es 3 TUTO et je te dis bravo, mais je n'arrive pas a comprendre les conditions ... Tu pourrais m'expliquer en détail ? Car je sèche dessus ... Désole  :-[


Ne demande que de l'aide pour devenir Apprentie.

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2210
    • Voir le profil
Re : [TUTO] Apprenons le Pawn avec Gilux ! [Partie 2 : Structures utiles]
« Réponse #12 le: 11 Février 2011, 20:46:31 »
Salut,

http://www.siteduzero.com/tutoriel-3-13956-les-conditions.html
C'est le tutoriel de C du Site du Zéro. (Il n'y a pas grand chose qui change  :happy), peut être que ça te semblera mieux expliqué ^^
++
« Modifié: 10 Avril 2011, 15:31:44 par Gilux »
Je ne donne pas d'aide en MP ou skype, le forum est là pour ça :wink:


Hors ligne BuBuNo

  • Radio Guingamp - Bien plus qu'une radio !
  • *
  • Grand Banditisme
  • La radio bien plus qu'une passion !
  • Messages: 845
    • Voir le profil
    • Radio Guingamp - Bien plus qu'une radio !
Salut Gilux ... J'ai lus t'es 3 TUTO et je te dis bravo, mais je n'arrive pas a comprendre les conditions ... Tu pourrais m'expliquer en détail ? Car je sèche dessus ... Désole  :-[

Bah pour les condition ces simple

Enfaite par exemple tu dit
if(course[playerid] == 0) // Si le statut course du joueur = 0
{
Tu met ici ce qu'il ce passe
}
else if(course[playerid] == 1) //Ou bien si le statut course du joueur = 1
{
Ce qu'il ce passe
}
else //Si le statut course n'ai n'y de 0 ou de 1
{
Tu met ici ce qu'il ce passe
}

Voila en esperant d'avoir eclairer

PS : Si quelqu'un pourais confirmer ma reponse car sa fait longtemp que j'ai pas scripter
ıllıllı вυвυησ ıllıllı


Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2210
    • Voir le profil
Petite mise à jour avec l'ajout de détails sur les arrays. (Pas très clair je vous l'accorde, désolé)
Je ne donne pas d'aide en MP ou skype, le forum est là pour ça :wink: