Szerző Téma: [Leírás] Nem létezõ dolgok leellenõrzése ciklusban  (Megtekintve 1805 alkalommal)

Nem elérhető Sramm

  • 596
    • Profil megtekintése
[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Dátum: 2012. június 29. - 18:05:15 »
0 Show voters

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

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #1 Dátum: 2012. június 30. - 12:15:08 »
0 Show voters
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
}
« Utoljára szerkesztve: 2012. június 30. - 12:21:33 írta DrAkE »

dexi

  • Vendég
[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #2 Dátum: 2012. június 30. - 12:18:15 »
0 Show voters
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..

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #3 Dátum: 2012. június 30. - 12:19:45 »
0 Show voters
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á.
« Utoljára szerkesztve: 2012. június 30. - 12:22:48 írta kurta999 »

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #4 Dátum: 2012. június 30. - 12:21:07 »
0 Show voters
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
« Utoljára szerkesztve: 2012. június 30. - 12:24:38 írta DrAkE »

[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #5 Dátum: 2012. június 30. - 13:24:55 »
0 Show voters
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.\"); }

[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #6 Dátum: 2012. június 30. - 13:49:17 »
0 Show voters
é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.\");

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
[Leírás] Nem létezõ dolgok leellenõrzése ciklusban
« Válasz #7 Dátum: 2012. június 30. - 13:51:26 »
0 Show voters
Akkor már foreach  ;D

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal