Jump to content

foreach inlocuieste loopul


WiDuAlK

Recommended Posts

Salutare , astazi doresc sa discutam despre foreach si cum poate inlocui loopul.

Pentru inceput , loop-ul sau bucla se gaseste astfel:

 

 

 

for(new i = 0; i < MAX_PLAYERS; i++)
{
   // linii
}

 

El este folosit pentru a aplica niste functii pe toti playeri prezenti in momentul de fata.Un exemplu ar fi payday-ul(salariul zilei).
Publicul suna cam asa:

 

public Payday()
{
    for(new i = 0; i < MAX_PLAYERS; i++)
    {
        if(IsPlayerConnected(i))// verifica playerii care sunt conectati in acel moment
        {
        //liniile voastre
        }
    }
    return 1;
}

 

Bun , sa incepem sa explicam, publicul este un callback pe care l-am denumit payday, dar daca ne uitam la acel loop si incercam sa il traducem va suna cam asa:
pentru(noul i = 0;atunci cand i < Toti playeri;i sa creasca pana ajunge la toti playeri si le returneaza ce vrem noi sa oferim)
Loop-ul este defapt o functie care apeleaza la toti playeri , nu doar 1 singur. Payday-ul se da tuturor playerilor, nu doar unora.Ati auzit cu toti de comanda /givemoney pe care v-am prezentat-o in tutorialul sscanf-zcmd

 

CMD:givemoney(playerid,params[])
{
    new targetid, suma;
    if(sscanf(params,"ud",targetid,suma))
            return SendClientMessage(playerid,culoarea_dorita,"Se foloseste: /givemoney [Nume_Player/ID] [Suma]");
            
    if(!IsPlayerConnected(playerid))
            return SendClientMessage(playerid,culoarea_dorita,"Playerul nu este conectat!");

    GivePlayerMoney(targetid,suma);

    return 1;
}

Folosind loopul , vom face aceasta comanda sa se aplice tuturor playerilor conectati cand folosim comanda si va suna cam asa

 

CMD:givemoneyall(playerid,params[])
{
    new sumaall = 0;
    for(new i = 0; i < MAX_PLAYERS; i++)// punem loop-ul sa verifice toti playeri conectati.
    {
        if(IsPlayerConnected(i)) // aplicam comanda tuturor playerilor conectati(restu , sa le para rau ca nu au fost conectati nu  
        {
            if(sscanf(params,"d",sumaall))// verificam sa fie scrisa bine
            return SendClientMessage(playerid,culoare,"Sintaxa: /givemoneyall [suma]");

            GivePlayerMoney(i,suma);// daca e scrisa corect returneaza i=(la)toti playeri suma dorita
        }

    }

    return 1;
}

Loop-ul poate mai fi de genu:

 

for(new i = 0; i < 10; i++)

 

in acest caz, noi vom returna functiile/functia numai primilor 10 playeri.


Acum , ca am vorbit putin si despre loop, sa trecem la foreach.
link foreach.inc http://pastebin.com/Seseuh2x
Forech-ul a fost creat de renumitul Yless. Foreach-ul a fost structurat ca un loop dar mult mai rapid, folosind functiile complexe din el.
Foreach , inlocuieste loopul + verificarea "if(isPlayerConnected(i). Forech-ul inlocuieste loop-ul sub 2 forme:

 

foreach (new i : Player)

 

si

 

foreach(Player, i)

eu prefer a 2 varianta, pentru ca e mai simla
deci in comanda va fi cam asa

 

CMD:givemoneyall(playerid,params[])
{
    new sumaall = 0;
    foreach(Player, i)
    {
        if(sscanf(params,"d",sumaall))// verificam sa fie scrisa bine
        return SendClientMessage(playerid,culoare,"Sintaxa: /givemoneyall [suma]");

        GivePlayerMoney(i,suma);// daca e scrisa corect returneaza i=(la)toti playeri suma dorita
    }

    return 1;
}

iar payday-ul va fi asa:

public Payday()
{
    foreach(Player, i)
    {
        //liniile
    }
    return 1;
}

Ca o concluzie la tot ce am prezentat, foreah-ul este un mod de a optimiza un GM, si al face mult mai rapid si ca + e mult mai simplu de folosit si usor de scris.

 

tutorialul scris 100% de mana mea!

 Pace!

  • Upvote 5
Link to comment
Share on other sites

  • 1 month later...
  • 8 months later...
La 12/3/2015, 1:07:10, SoNNy.sys a spus:

Depinde ce loop vrei sa inlocuieste deoarece unele chestii raman tot cu for( )

Poți folosi y_iterate pentru a crea iteratori pe care să-i folosești în foreach, și nu mai ai nevoie de for(), dacă te referi la lucruri gen case, business-uri și altele.

Link to comment
Share on other sites

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.