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
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
}
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..
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á.
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
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.\"); }
é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.\");
Akkor már foreach ;D