GTA Közösség - A magyar GTA fórum

San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => Leírások/Útmutatók => A témát indította: Sramm - 2012. Június 29. - 18:05:15

Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: Sramm - 2012. Június 29. - 18:05:15

Sziasztok!
 
 


Ebben a leírásban szeretném megmutatni, hogyan ellenõrizzük le a nem létezõ dolgokat egy ciklusban.


 
 
Van a ciklusunk és egy változónk:
 

for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
if(valtozo == 9) //Ha egy játékosnak a változója 9
{
    SendClientMessage(i,\"A változód értéke 9.\"); //Akkor kiírjuk
}
}

 
Oké, de mi van, ha senkinek sem 9?


Rossz megoldás:
 
for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
if(valtozo == 9) //Ha egy játékosnak a változója 9
{
    SendClientMessage(i,\"A változód értéke 9.\"); //Akkor kiírjuk
}
else return SendClientMessage(playerid,\"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
}

 
Ez azért rossz, mert ha akár csak egy embernek nem 9 a változó értéke, kiírja, hogy nincs ilyen változós. Ez azért van, mert az összes játékoson futunk végig, nem egyen.


Jó megoldás:
 
for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
new c = 0;
if(valtozo == 9) //Ha egy játékosnak a változója 9
{
    c++;
    SendClientMessage(i,\"A változód értéke 9.\"); //Akkor kiírjuk
}
if(c == 0) return SendClientMessage(playerid,\"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
}

 
Létrehozunk egy másik változót, aminek az értéke 0. Ha van 9-es változójú játékos, akkor növeljük egy-el. Viszont ha nincs, nincs, ami növelje a változónkat, így 0 marad, ami azt jelenti, hogy nincs olyan játékos, akinek a váltózójának rtéke 0 lenne.


Remélem érthetõ volt.
További jó fórumozást,
Sramm
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: DrAkE - 2012. Június 30. - 12:15:08
Alapból rossz mindegyik példád, ahogy elnézem.
Ha megnézed a SendClientMessage függvényt hibásan használod, valamint:
 

for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
    {
            new c = 0;
            if(valtozo == 9) //Ha egy játékosnak a változója 9
            {
                c++;
                SendClientMessage(i, 0xFFFFFFFF, \"A változód értéke 9.\"); //Akkor kiírjuk
            }
            if(c == 0) return SendClientMessage(playerid, 0xFFFFFFFF, \"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
    }

 
Soha nem fog neked növekedni az a \"c\" változó 1-nél nagyobbra, ezen felül, te 500x létrehozod a változót. Illetve, tegyük fel, ha már a második játékosnak nem 9-es értékû a változója, akkor már egybõl megáll a ciklusod, mivel visszatér egy szöveggel, ezt egyszerûen megfogod, és így:
 

for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
if(valtozo == 9) //Ha egy játékosnak a változója 9
   SendClientMessage(i,\"A változód értéke 9.\"); //Akkor kiírjuk
else
   SendClientMessage(playerid,\"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
}
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: dexi - 2012. Június 30. - 12:18:15
if(c == 0) return SendClientMessage(playerid,\"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs

 
Ez a cikluson kívülre kell..
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: kurta999 - 2012. Június 30. - 12:19:45
Nemrossz, de én inkább így oldalám meg:
 

new
bool:bFound;
for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
if(valtozo == 9) //Ha egy játékosnak a változója 9
{
bFound = true; // Van találat
break; // Megállítjuk a ciklust
}
}
   
if(bFound)
{
//Van találat
}
else
{
//Nincs találat
}

 
Ha pedig nem ezt a módszert akarod, hogy megáljon egy találatnál a ciklus, akkor leírta az elõttem hozzászóló a megoldást rá.
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: DrAkE - 2012. Június 30. - 12:21:07
De gondolom õ mindenkinek ki akarja íratni az eredményt, és nem csak 1-ig elmenni.
 

new
    i = -1,
    talalat = 0;
   
for(;++i < MAX_PLAYERS;) //Végigfutás az összes játékoson
{
if(valtozo == 9) //Ha egy játékosnak a változója 9
{
   talalat++;
   SendClientMessage(i, 0xFFFFFFFF, \"A változód értéke 9.\"); //Akkor kiírjuk
}
}
if(!talalat) return SendClientMessage(playerid, 0xFFFFFFFF, \"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: lackos888 - 2012. Június 30. - 13:24:55
Idézetet írta: DrAkE date=1341051308\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"23510\" data-ipsquote-contentclass=\"forums_Topic
Alapból rossz mindegyik példád, ahogy elnézem.
Ha megnézed a SendClientMessage függvényt hibásan használod, valamint:
 

for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
    {
            new c = 0;
            if(valtozo == 9) //Ha egy játékosnak a változója 9
            {
                c++;
                SendClientMessage(i, 0xFFFFFFFF, \"A változód értéke 9.\"); //Akkor kiírjuk
            }
            if(c == 0) return SendClientMessage(playerid, 0xFFFFFFFF, \"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
    }

 
Soha nem fog neked növekedni az a \"c\" változó 1-nél nagyobbra, ezen felül, te 500x létrehozod a változót. Illetve, tegyük fel, ha már a második játékosnak nem 9-es értékû a változója, akkor már egybõl megáll a ciklusod, mivel visszatér egy szöveggel, ezt egyszerûen megfogod, és így:
 

for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
if(valtozo == 9) //Ha egy játékosnak a változója 9
   SendClientMessage(i,\"A változód értéke 9.\"); //Akkor kiírjuk
else
   SendClientMessage(playerid,\"Nincs 9-es változós játékos.\"); //Ha nem, akkor kiírjuk, hogy nincs
}

 

DrAkE, és ha péld 300 játékosnak nincs 9-es változója, akkor 300x kiiírja.:D
ugyhogy igy kéne:
 
   
        new count=0;
        for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
{
if(valtozo == 9)
                {
                        count++;
   SendClientMessage(i,-1,\"A változód értéke 9.\"); //Akkor kiírjuk
        }
         }
         if(count==0){ SendClientMessage(playerid,-1,\"Nincs 9-es változós játékos.\"); }
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: TengeriMalac - 2012. Június 30. - 13:49:17
és persze minek fusson le feleslegesen?
 
new count=0;
        for(new i; i<MAX_PLAYERS; i++) //Végigfutás az összes játékoson
        {
                if(!IsPlayerConnected(i)) continue;
                if(valtozo == 9)
                {
                        count++;
                        SendClientMessage(i,-1,\"A változód értéke 9.\"); //Akkor kiírjuk
                }
         }
         if(count==0) return SendClientMessage(playerid,-1,\"Nincs 9-es változós játékos.\");
Cím: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban
Írta: kurta999 - 2012. Június 30. - 13:51:26
Akkor már foreach  ;D