[TUT] Loop for().

Tutoriale scripting, cod si portiuni de cod.

Moderators: Moderatori ajutatori, Moderatori, Echipa eXtreamCS.com

Post Reply
User avatar
Fuffy
Membru, skill +1
Membru, skill +1
Posts: 299
Joined: 07 Jan 2016, 08:34
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Contact:

27 Nov 2016, 21:49

N-am vazut inca un tutorial detaliat despre asta, si totusi e un lucru simplu nimeni nu scrie chesti de-astea pe aici? Ma-ntreb de ce ...

functia noastra for are 3 parametrii

for ( Declaratia ; Conditia ; Incrementarea ) // Mersi lui luxor pentru asta.


for() e folosit pentru a crea un loop, ce e un loop ?

Ganditiva la un loop ca la un proces de 'crestere' sau 'descrestere' in functi de ce alegi.

Sa va dau un exemplu

Poti folosi operatori ca "=" "< ">"

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

"declaratia" e 'new i = 0'
"Conditia" e "i < 10" (daca i este mai mic decat 10 ).
"Incrementarea" e "i++" (adica incrementan i cu 1 vector ).

In operatia de sus 'i' ajunge pana la numarul 10 ( pentru ca daca i este mai mic decat 10 atunci el creste ( i++ ) ... iar 10 nu este mai mic decat 10, este egal cu el, daca conditia noastra ar fi fost "i <= 10" ( daca este mai mic sau egal cu 10 ) atunci el ar fi ajuns la 11.



Pentru ce este folosit for() mai exact, noi luam numarul i si in functie de conditie il incrementan pana la un anumit punct, dar cea ce este interesant este ca (exemplu in operatia noastra) rezultatul nu va fi '11' direct ( sau 10 ma rog .. ) , noi nu putem vedea asta dar el nu ne da instant 10.

Cand faci un loop calculatorul numara si 'atinge' fiecare numar in parte.

i = 0;

Daca i este mai mic decat 10 atunci i++

i = 0
i = 1
i = 2
i = 3
i = 4
...
...
.
..
i = 10

Si astfel 'atinge' toate numerele pana la 10

Nu este necesar sa faceti variabila inauntru la for dar este recomandat sa o faceti
Puteti face si asa

Code: Select all

new i
for( i = 0 ; ...
Dar ar trebui sa-l faceti inauntru la for, pentru ca de asta se numeste 'declaratie' , declari o variabila noua.

Code: Select all

#include <amxmodx>

public plugin_init( )
{
	register_clcmd( "say /test", "test" );
}

public plugin_init( )
{
	for( new i = 0; i < 3; i++ )
		client_print( id, print_chat, "Valuare lui i: %i", i );
}
In acest cod inauntr loop-ului nostru se va printa un mesaj pana cand 'i' isi atinge valuare necesara, adica de 4 ori ( pentru ca incepe de la 0'

Valuarea lui i: 0
Valuarea lui i: 1
Valuarea lui i: 2
Valuarea lui i: 3 ( se va termina la 3, daca 3 era mai mic decat trei atunci mai crestea un numar, dar cum nu e atunci se va opri aici ).

Ca sa 'decrementati' un numar inauntru la for , in loc de ++ folositi operatorul '--'.
i-- ca exemplu.

Ca sa opriti un loop folositi functia 'break' iar ca sa il continuati folositi 'continue' ( Nu intru in asta, nu le-am folosit niciodata sincer ).

Sa va da un exemplu cu get_players()
SMA | Afiseaza codul
#include <amxmodx>

public plugin_init( )
{
	register_clcmd( "say /test", "test" );
}

public test( )
{
	new Players[32], num;


	// 'Players' array-ul de inserat pentru jucatori
	// 'num' Inseram numarul jucatorilor gasiti ( bazat pe flag-urile care urmeaza )
	// ' "a" '  Flag-ul 'a' e pentru a insera doar jucatorii in viata.

	get_players( Players, num, "a" );

	// Deja am luat 'numarul' playerilor, dar ca sa inseram index-urile 
	// tuturor jucatorilor trebuie sa facem si un loop



	// Deja am inserat toate id-urile jucatorilor in array-ul 'Players'
	// acum le vom 'atinge' pe fiecare in parte inauntru la acest LOOP:

       // Creiem o noua variabila cu dimensiunea 32.
	new szUserName[32];

	// i = 0,  Daca 'i' (care e zero)  e mai mic decat variabila 'num' ( in num' am inserat numarul jucatoril in viata gasiti )
	// Atunc i++ ,  il crestem pe 'i' de la 0 pana la 'num' ( numarul jucatorilor ).
	for( new i = 0; i < num; i++ )
	{
		// Observati Players ?  Players[] e array-ul , 'i' e loop-ul nostru. Pentru ca luam fiecare jucator in parte.
		// Players[0]
		// Players[1]
		// Players[2]
		// .... Pana la Players[num] ( numarul jucatorilor de pe server ).

		// Luam numele la toti jucatorii in parte.			
		get_user_name( Players, szUserName, charsmax( szUserName ) );

		// Printam cate un mesaj pentru fiecare nume gasit cu "Nume: %s" ( %s -> Nume jucator ).
		client_print( id, print_console, "Name: %s", szUserName );
	}
}


In codul de sus, de exemplu daca ai vrea ca jucatorul cu userid-ul numarul 5 ai vrea sa-i faci ceva, nici nai nevoie de loop poti folosi doar get_players, dupa , exemplu:
client_print( Players[5], print_chat, "Tu esti userid cu numarul 5." );



Deci loop nu e doar pentru matematica, e si pentru 'atingere' , e ca sa faci calcule la cat ar fi trebuit sa ajunga, e ca sa atinga fiecare numar in parte si sa-i faca ceva (daca tu vrei ).


Ca sa fie mai simpluu :

for( de la ce numar sa incepi ; Conditia ca sa stii unde sa te opresti ; Crestere/Scadere )
{

}


Si poate fi folosit in diferite cazuri.
Last edited by Fuffy on 18 Dec 2016, 12:38, edited 3 times in total.
AMXX Blue e acum doar pe github.
RoyalServer 2
riderel
Membru, skill +1
Membru, skill +1
Posts: 159
Joined: 20 Aug 2013, 01:24
Detinator Steam: Da
CS Status: Working :)
Location: /dev/null
Contact:

28 Nov 2016, 01:00

Ai reusit tu sa compilezi chestia aia si nu te-a 'injurat' compilerul ?
User avatar
LondoN eXtream
Membru eXtream
Membru eXtream
Posts: 2755
Joined: 10 Oct 2014, 06:21
Detinator Steam: Da
SteamID: /id/london_extreamcs
Reputatie: Fost scripter eXtreamCS
Fost moderator ajutator
Membru Club eXtreamCS (6 luni)
Fond eXtream: 0
Location: Roman, Neamț
Has thanked: 3 times
Been thanked: 12 times

28 Nov 2016, 06:33

Ai uitat ca in loop nu se foloseste RETURN!
Echivalentele return-ului in acest caz sunt break; si continue;

Exemplu:

Code: Select all

for(new i = 0; i < num; i++)
{
     if(!is_user_alive(players[i]))
         continue;

     /// de obicei break folosim cand gasim ceva ce ne trebuie
     if(cs_get_user_team(players[i]) == CS_TEAM_CT)
         break;
}
User avatar
JaiLBreaK
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 1517
Joined: 05 Jan 2016, 18:17
Detinator Steam: Nu
Detinator server CS: Da
Reputatie: Membru Club eXtreamCS (2 luni)
Fost Scripter eXtreamCS
Fond eXtream: 0
Has thanked: 5 times
Been thanked: 10 times
Contact:

28 Nov 2016, 11:21

LondoN eXtream wrote:Ai uitat ca in loop nu se foloseste RETURN!
Echivalentele return-ului in acest caz sunt break; si continue;

Exemplu:

Code: Select all

for(new i = 0; i < num; i++)
{
     if(!is_user_alive(players[i]))
         continue;

     /// de obicei break folosim cand gasim ceva ce ne trebuie
     if(cs_get_user_team(players[i]) == CS_TEAM_CT)
         break;
}
corectare

Code: Select all

for(new i = 0; i < num; i++)
{
     //daca nu e in viata trece mai departe
     if(!is_user_alive(players[i]))
         continue;

     //daca ai gasit ceva si vrei sa opresti loop-ul folosesti break
     if(cs_get_user_team(players[i]) == CS_TEAM_CT)
         break;
}
Image
CSGO Original Module[35%]
User avatar
cyby
Scripter eXtreamCS
Scripter eXtreamCS
Posts: 1777
Joined: 16 Jul 2011, 21:46
Detinator Steam: Da
Detinator server CS: Da
Reputatie: Scripter eXtreamCS
Fost Moderator ajutator
Has thanked: 146 times
Been thanked: 396 times

28 Nov 2016, 11:23

Nu a zis nimeni de return.

Break inchide loop-ul iar continue trece peste blocul de date aferent valorii variabilei stabilite in conditie. [daca ai]
User avatar
Fuffy
Membru, skill +1
Membru, skill +1
Posts: 299
Joined: 07 Jan 2016, 08:34
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Contact:

28 Nov 2016, 12:10

@riderel: Scuze, editat :))
----------------------------------
NU , nu folositi conditii de genul inauntrul Loop-ului, daca folositi is_user_alive inauntru loop-ului, native is_user_alive va fi chemata de "Num" ori ( la variabila 'num' ) adica de cati jucatorii a gasit.

Daca vreti sa faceti astfel de 'deosebiri' 'comparatii' folositi flag-urile de separare din get_players(), uitati un cod ca sa ia toti jucatorii in viata care sunt tero ( bazat pe ce mi-ati cerut mai sus );
SMA | Afiseaza codul
#include <amxmodx>

public plugin_init( )
{
	register_clcmd( "say /test", "test" );
}

public test( id )
{
	new Players[32], Num, szName[32];
	
	// Flag "a" - pentru jucatori in viata
	// FLag "e" - Ca sa putem deosebi jucatorii echipelor

	// "1" sau "TERRORISTS" - Tero team
	// "2" sau "CT" pentru echipa CT.
	get_players( Players, Num, "ae", "1" );


	client_print( id, print_console, "Au fost gasiti '%i' teroristi in viata, acestia sunt:", Num );

	for( new i = 0; i < Num; i++ )
	{
		get_user_name( Players, szName, charsmax( szName ) );

		client_print( id, print_console, "%s", szName );	
	}
}
Last edited by Fuffy on 28 Nov 2016, 14:55, edited 1 time in total.
AMXX Blue e acum doar pe github.
User avatar
Nubo
Fost moderator
Fost moderator
Posts: 2734
Joined: 11 Jul 2012, 18:45
Detinator Steam: Da
CS Status: [əˈnɒn.ɪ.məs]
Reputatie: Fost scripter eXtreamCS
Fost eXtream Mod
Has thanked: 8 times
Been thanked: 27 times

28 Nov 2016, 13:24

Folosirea get_players() e un sfat bun, dar tu creezi array in loop..... :lolno:
Cand nu merge acest forum sunt online aici:
  • * Skype: nubo_cs
    * Y!M ID: nubo_cs
User avatar
Fuffy
Membru, skill +1
Membru, skill +1
Posts: 299
Joined: 07 Jan 2016, 08:34
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Contact:

28 Nov 2016, 14:21

Nubo wrote:Folosirea get_players() e un sfat bun, dar tu creezi array in loop..... :lolno:
Adica?
De fapt eu fac un Loop in array ca sa ating fiecare user in parte.
AMXX Blue e acum doar pe github.
User avatar
Nubo
Fost moderator
Fost moderator
Posts: 2734
Joined: 11 Jul 2012, 18:45
Detinator Steam: Da
CS Status: [əˈnɒn.ɪ.məs]
Reputatie: Fost scripter eXtreamCS
Fost eXtream Mod
Has thanked: 8 times
Been thanked: 27 times

28 Nov 2016, 14:39

szName[32] e array.
Cand nu merge acest forum sunt online aici:
  • * Skype: nubo_cs
    * Y!M ID: nubo_cs
User avatar
Fuffy
Membru, skill +1
Membru, skill +1
Posts: 299
Joined: 07 Jan 2016, 08:34
Detinator Steam: Da
CS Status: Citesc forumul eXtreamCS.com...!
Fond eXtream: 0
Contact:

28 Nov 2016, 14:55

Nubo wrote:szName[32] e array.
Ai dreptate, szName ar trebui sa fie in afara loop-ului.
AMXX Blue e acum doar pe github.
Post Reply

Return to “Scripting”

  • Information
  • Who is online

    Users browsing this forum: No registered users and 11 guests