Jump to content

Notiuni De Baza


WopsS

Recommended Posts

Noțiuni de bază pentru limbajul PAWN

 

Cuprins

 

Despre PAWN

PAWN este un limbaj specific serverelor de San Andreas Multiplayer. Acesta a fost derivat din limbajul de programare C.

 

Atenţie! Mulţi confundă PAWN cu PAWNO care sunt două lucruri diferite. PAWN este limbajul în care se programează serverele de San Andreas Multiplayer, iar PAWNO este programul în care se realizează (se scriu) scripturile / game mode-urile pentru aceste servere, mai pe scurt un IDE (integrated development environment sau interactive development environment).

 

Desigur, în directorul pawno din folderul serverului se află un executabil numit pawncc. Aceste este compilatorul, adică programul care transformă textul care poate să fie citit de om în cod binar (codul binar reprezintă numerele 0 şi 1, datorită tranzistorului) care este înţeles de calculator.

 

Despre algoritmi

Algoritmul este o metodă de rezolvare a unei probleme.

 

Algoritmii au 3 proprietăţi importante:

  • Finititudine
  • Generalitate
  • Corectitudine
  • Optimalitate

 

1. Finititudinea

Finititudinea reprezintă proprietatea algoritmului de a se termină într-un număr finit de paşi.

 

2. Generalitate

Generalitatea reprezintă proprietatea algoritmului de a rezolva o întreagă clasă de probleme.

 

3. Corectitudine

Corectitudinea reprezintă proprietatea algoritmului de a oferi o rezolvare corectă în urmă executari acestuia.

 

4. Optimalitate

Optimalitatea reprezintă proprietatea algoritmului de se execută într-un număr de minim de paşi.

 

Exemplu:

Să zicem că avem un altgorim pentru a verifică dacă Player-ul X se află în jurul Player-ului Y. Player-ul Y are rază 8.0 (pentru IsPlayerInRangeOfPoint).

stock IsPlayerInRangeOfPointEx(playerid, targetid, Float:Radius)
{
    new Float:X, Float:Y, Float:Z;

    GetPlayerPos(playerid, X, Y, Z);

    if(IsPlayerInRangeOfPoint(targetid, Radius, X, Y, Z))
        return 1;

    return 0;
}

Acest algoritm are toate proprietăţiile, adică:

1. Finititudine - Se execută într-un număr finit de paşi.

2. Generalitate - Se poate execută pentru orice player de pe server, nu doar pentru player-ul X.

3. Corectitudine - Este corect scris din punct de vedere al limbajului PAWN.

4. Optimalitate - Se execută o singură dată, nu merge de la 0 până la MAX_PLAYERS (499).

 

Acest algoritm este făcut de mine, el va retura valoarea 1 în cazul în care Player-ul X se află în rază Player-ului Y sau 0 în caz contrar.

 

Despre iniţializatori

1. const

const nu este modificată pe parcursul algoritmului.

 

Exemplu:

new const Float:PI =  3.14;

 

2. enum

Enumeratiile sunt un sistem bun de reprezentare a grupurilor mari de date şi modificări rapide.

 

Exemplu:

enum pInfo
{
    pLevel, pAdmin
};

new PlayerInfo[MAX_PLAYERS][pInfo];

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][pLevel] = 1;
    PlayerInfo[playerid][pAdmin] = 6;
}

 

3. forward

forward îi spune compilatorului că o funcţie o să urmeze mai târziu, fie că are sau nu parametrii.

 

Exemplu:

forward FunctiaMea(playerid, const string[]);

public FunctiaMea(playerid, const string[])
{
}

 

4. native

native defineşte o funcţie în maşină abstractă / calculator, dar NU în script. Se poate defini o funcţie native doar dacă ea este inclusă în SA:MP sau într-un plugin.

 

Exemplu:

native printf(const format[], {Float,_}:...);

 

5. new

new iniţializează o variabilă globală sau locală, indiferent de fişier (în caz că este globală).

 

Exemplu:

new Variabila = 5;

 

6. public

public face o funcţie visibila pentru maşină abstractă / calculator, poate să fie chemată direct într-un script.

 

Exemplu:

forward FunctiaMea();

main()
{
    CallLocalFunction("FunctiaMea", "");
}

public FunctiaMea()
{
    printf("Asta e functia mea.");
}

 

7. static

static face variabilă să fie globală doar în fişierul respectiv.

 

Exemplu:

fisier1.pwn:

FunctiaMea1()
{
    // Eroare, Variabila_Globala nu este definită.
    printf("%d", Variabila_Globala);
}

// Variabila_Globala este definită aici.
new Variabila_Globala = 10;

FunctiaMea2()
{
    // Nu se întâmplă nimic, Variabila_Globala a fost definită anterior
    printf("%d", Variabila_Globala);
}

// Includem un alt fişier
#include "fisier2.pwn"

fisier2.pwn:

FunctiaMea3()
{
    // Aici iar nu este o eroare pentru că fişier2 este inclus după ce am definit Variabila_Globala.
    printf("%d", Variabila_Globala);
}

Acum să modificăm Variabila_Globala în static.

 

Exemplu:

FunctiaMea1()
{
    // Eroare, Variabila_Globala nu este definită.
    printf("%d", Variabila_Globala);
}

// Variabila_Globala este definită aici.
static Variabila_Globala = 10;

FunctiaMea2()
{
    // Nu se întâmplă nimic, Variabila_Globala a fost definită anterior
    printf("%d", Variabila_Globala);
}

// Includem un alt fişier
#include "fisier2.pwn"

fisier2.pwn:

FunctiaMea3()
{
    // Eroare, deoarece Variabila_Globala a fost limitată doar la fişierul 1.
    printf("%d", Variabila_Globala);
}

 

8. stock

stock se foloseşte pentru a initializa variabile, dar dacă nu e folosită nu va apărea warningul că variabilă respectivă nu este folosită.

 

Exemplu:

main()
{
    Functia1();
}

Functia1()
{
    printf("Functia1 bună");
}

Functia2()
{
    printf("Functia2 salut");
}

Aici o să fie un warning cum că Functia2 nu este folosită.

main()
{
    Functia1();
}

stock Functia1()
{
    printf("Functia1 bună");
}

stock Functia2()
{
    printf("Functia2 salut");
}

Aici NU o să fie un warning cum că Functia2 nu este folosită.

 

Despre tipuri de date

Datele sunt clasificate după:

  • Natură lor
    • constante
    • variabile
  • După tip
    • numerice
    • întregi
    • reale
  • Logice
  • Caractere

 

Datele constante

Datele constante nu îşi modifică valoare pe tot parcursul algoritmului. Se initializeaza cu const.

 

Datele variabile

Datele variabile îşi pot modifică valoare pe parcursul algoritmului. Acestea se caracterizează prin nume, tip de dată şi locaţia de memorie. Se initializeaza cu new.

 

Datele de tip numeric

Datele de tip numeric sunt numerele. Acestea sunt întregi (exemplu 3 sau 5, zise şi integer) şi reale (exemplu 4.25 şi 9.16, zise şi float). Se initializeaza cu new nume_variabila sau new Float:nume_variabila.

 

Datele de tip logic

Datele de tip logic pot avea doar două valori (Adevărat / True / 1 sau Fals / False / 0).Se initializeaza cu new Bool:.

 

Datele de tip caracter

Datele de tip caracter (string) sunt datele cuprinse între ghilimele (" ", exemplu "Date de tip caracter sau string"). Se initializeaza cu new nume_variabila[lungime_string]

 

Despre formatori

După cum am spus mai sus, PAWN este derivat de la C, deci a moştenit şi câte ceva de la el.

Formatori sunt argumente adiţionale urmate de format, în locul acestora sunt inserate string-ul rezultat în funcţie de tipul formatorului.

 

Tipuri de formatori:

  • %i - afişază un număr întreg (tot numărul).
  • %d - afişază un număr întreg (tot numărul).
  • %s - afişază un string.
  • %f - afişază un număr real / float. (trebuie să aibă tagul Float:)
  • %c - afişază caracter ASCII.
  • %x - afişază un număr Hexadecima.
  • %b - afişază un număr binar.
  • %% - afişază caracterul "%"

 

Exemplu:

Întreg:

new a = 54;
format(string, sizeof(string), "Număr a este %i.", a);
SendClientMessage(playerid, 0xFFFFFFAA, string);

Se va afişa:

Număr a este 54.

Exemplu #2:

new string[64];
format(string, sizeof(string), "Ai scorul: %d", GetPlayerScore(playerid));
SendClientMessage(playerid, 0xFFFFFFAA, string);

Se va afişa:

Ai scorul: 1 (depinde ce scor are playerul)

 

String:

new string[20];
format(string, sizeof(string), "Învăţ despre %s.", "formatori");
SendClientMessage(playerid, 0xFFFFFFAA, string);

Se va afişa:

Învăţ despre formatori.

 

Float:

new string[20];
format(string, sizeof(string), "4 împărţit la 3 este %f.",  4.0 / 3.0);
SendClientMessage(playerid, 0xFFFFFFAA, string);

Se va afişa:

4 împărţit la 3 este 1.333333.

 

Despre expresii

O expresie este o succesiune de operanzi legaţi între ei de operator. Sunt grupaţi cu ajutorul parantezelor după reguli bine stabilite.

 

Sunt mai multe tipuri de operatori:

  • Aritmetici
    • "+" - adunare
    • "-" - scădere
    • "*" - înmulţire
    • "/" - împărţire
    • "%" - restul împărţiri
  • Logici
    • "!" - negaţie / not
    • "&&" - şi / and
    • "||" - sau / or
  • Raţionali
    • "<" - mai mic
    • ">" - mai mare
    • "<=" - mai mic sau egal
    • ">=" - mai mare sau egal
    • "!=" - diferit de

 

Exemplu:

new a = 15, b = 10; // Initializam variabilele a şi b, care o să aibă valorile 15 şi 10. (a o să aibă valoare 15 şi b o să aibă valoare 10, pe baza "Primul venit, primul servit") Puteţi să luaţi orice numere vreţi.
   
printf("Suma: %i", a + b; // Calculăm suma şi o afişăm
printf("Scădere: %i", a - b; // Calculăm scăderea şi o afişăm
printf("Înmulţire: %i", a * b; // Calculăm înmulţirea şi o afişăm
printf("Împărţire: %i", a / b; // Calculăm împărţirea şi o afişăm
printf("Rest: %i", a % b; // Calculăm restul împărţiri lui a la b şi o afişăm

Se va afişa:

Suma: 25
Scădere: 5
Înmulţire: 150
Împărţire: 1
Rest: 5

Putem să nu facem variabilele a şi b.

printf("Suma: %i", 15 + 10); // Calculăm suma şi o afişăm
printf("Scădere: %i", 15 - 10); // Calculăm scăderea şi o afişăm
printf("Înmulţire: %i", 15 * 10); // Calculăm înmulţirea şi o afişăm
printf("Împărţire: %i", 15 / 10); // Calculăm împărţirea şi o afişăm
printf("Rest: %i", 15 % 10); // Calculăm restul împărţiri lui a la b şi o afişăm

Se va afişa:

Suma: 25
Scădere: 5
Înmulţire: 150
Împărţire: 1
Rest: 5

 

Despre prioritatea operaţiilor

În funcţie de prioritatea maximă se calculează expresile în următoarea ordine:

  • Cele în care apar operatorii "&&", "*", "/", "%".
  • Cele în care apar operatorii "+", "-", "||".
  • Cele în care apar operatorii "<", ">", "<;=", ">=", "!=".

 

Despre structuri

1. Structura if / dacă

Structura if, zisă şi dacă în pseudocod. Are rolul de verificare.

 

Formă:

if(condiţie)
{
    Structura1();
}
else if(condiţie2)
{
    Structura2();
}
else
{
    Structura3();
}

Explicaţie:

Se verifică dacă condiţia este adevărată, dacă este adevărată se execută Structura1, dacă prima condiţie este falsă se verifică condiţia2, dacă este adevărată se execută Structura2, în caz contrar (când conditile de mai sus sunt false) se execută Structura3.

Nu se pun paranteze decât atunci când ai decât o linie după structura de mai sus.

 

Exemplu:

if(condiţie)
{
    Structura1();
}
else if(condiţie2)
{
    Structura2();
}
else
{
    Structura3();
}

else este opţional!

 

2. Structura while / cât timp

Structura while, zisă şi cât timp în pseudocod. Are rolul de a execută structura din interior cât timp condiţia este adevărată.

 

Formă:

while(condiţie)
{
     Structura1();
}

Explicaţie:

Se verifică dacă condiţia este adevărată, dacă este adevărată se execută Structura1 până când condiţia este falsă. Când condiţia este falsă se termină de executat structura while şi se trece la structura imediat următoare.

Nu se pun paranteze decât atunci când ai decât o linie după structura de mai sus.

 

Exemplu:

while(condiţie)
{
    Structura1();
}

 

3. Structura for / pentru

Structura for, zisă şi pentru în pseudocod. Are rolul de a execută structura din interior cât timp variabilă noastră îndeplineşte condiţia.

 

Formă:

for(new variabilă = valoare_iniţială; condiţie; pas_de_executare)
{
     Structura1();
}

Explicaţie:

Variabilei i se atribuie valoare iniţială. Se verifică dacă variabilă a depăşit valoarea finală (condiţia), dacă s-a depăşit se termină de executat structura for şi se trece la structura imediat următoare, în caz contrar se execută Structura1 şi se creşte valoarea variabilei cu pasul de executare.

Nu se pun paranteze decât atunci când ai decât o linie după structura de mai sus.

 

Exemplu:

for(new variabilă = valoare_iniţială; condiţie; pas_de_executare)
{
    Structura1();
}

 

4. Exemple

main()
{
    StructuraIf(5, 4); // Chemam functia "StructuraIf" cu parametrii a = 5 si b = 4.
    StructuraIf(9, 9); // Chemam functia "StructuraIf" cu parametrii a = 9 si b = 9.
    StructuraIf(2, 3); // Chemam functia "StructuraIf" cu parametrii a = 2 si b = 3.
   
    StructuraWhile(5); // Chemam functia "StructuraWhile" cu parametrul NumarMaxim = 5.
    StructuraFor(3); // Chemam functia "StructuraFor" cu parametrul NumarMaxim = 3.
}

stock StructuraIf(a, b) // Cream functia "StructuraIf" cu parametrii a si b care sunt obligatorii.
{
    if(a > b) // Verificam daca a este mai mare ca b.
    {
        print("a este mai mare ca b"); // Daca a este mai mare ca b afisam mesajul.
    }
    else if(a == b) // Verificam daca a este egal cu b.
    {
        print("a este egal cu b"); // Daca a este egal cu b afisam mesajul.
    }
    else
    {
        print("b este mai mare ca a"); // Daca nici o conditie de mai sus nu este adevarata afisam mesajul.
    }
}

stock StructuraWhile(NumarMaxim) // Cream functia "StructuraWhile" cu parametriul NumarMaxim care este obligatoriu.
{
    new i = 1; // Initializam variabila locala i, îi atribuim valoare 1.

    while(i < NumarMaxim) // Executam structura print si i++ cât timp conditia este adevarata.
    {
        print("Execut While"); // Afisam mesajul cât timp conditia este adevarata.
        i++; // Crestem i-ul cu 1, cât timp conditia este adevarata.
    }
}

stock StructuraFor(NumarMaxim) // Cream functia "StructuraWhile" cu parametriul NumarMaxim care este obligatoriu.
{
    for(new i = 1; i <= NumarMaxim; i++) // Executam conditia cât timp i este mai mic sau egal cu NumarMaxim si îl creste cu 1 (i++). (se poate creste si cu 2, dar atunci trebuie scris i += 2 sau i = i + 2)
    {
        printf("%i ", i); // Afisam mesajul care este de tip întreg.
    }

    print("FOC!"); // Dupa ce terminam de executat for-ul afisam mesajul "FOC!".
}
  • Upvote 11
Link to comment
Share on other sites

  • 2 weeks later...
  • 1 month later...
  • 9 months later...
  • 2 weeks later...

Foarte util, e foarte bun pentru incepatori si pentru cei care vor sa invete !

"Mulţi programatori buni fac programare nu pentru că se aşteaptă să câştige bani sau să fie lăudaţi de public, ci pentru că e amuzant să programezi." - Linus Torvalds

Link to comment
Share on other sites

  • 8 months later...
  • 1 month later...

OFF TOPIC: Din ce am invatat, am inceput sa inteleg ca daca nu stii C/C++, deageaba te ocupi de SA:MP deoarece jocul trece si cunostintele acumulate, sunt facute doar in SA:MP... Sper sa nu ma insel in aceasta privinta(fiecare cu parerea lui).

ON TOPIC: Foarte bun tutorialul!

 

Link to comment
Share on other sites

  • WopsS unfeatured and unpinned this topic

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. For more details you can also review our Terms of Use and Privacy Policy.