Szerző Téma: [TUT]bool típusú változó érték felcserélése.  (Megtekintve 2060 alkalommal)

[TUT]bool típusú változó érték felcserélése.
« Dátum: 2012. augusztus 20. - 14:18:23 »
+3 Show voters
Mivel épp egy harmadik megoldást is láttam pár napja, immáron ezt 3 féle képpen meglehet valósítani.
Legyen a változó mondjuk:
 
new bool:dmbenvan[MAX_PLAYERS]; // Ezt a változót azért sokan megértik azért esett rá a választás.

 
Egy bool típusú változónak kettõ értéke lehet melyet sok nyelvben false(0), true(1), elnevezésekkel látnak el, zárójelben az értéküket is oda írtam.
Alap értékként pawn nyelvben egy több cellás bool változó minden cellája false értéket kap.
Az if else megoldás, ennek a változónak játékosonkénti adatfelcserélése a következõ:
 
if(dmbenvan[playerid] == true)// itt egy játékosnak ellenõrizzük hogy true az érték (játékban most dmben van)
{
    dmbenvan[playerid] = false; // érték csere
    // kitesszük a játékost dmbõl SetPlayerPos(..
} else { // mely lehetne \"else if(dmbenvan[playerid] == false)\" is, de minek, ha feljebb nem \"true\" értéket kapunk akkor else csak is \"false\" érték lehet
    dmbenvan[payerid] = true; // érték csere
    // betesszük a játékost a dmbe SetPlayerPos(..
}

 
A második megoldás ennek a változónak az érték megváltoztatására egy kis matekkal történhet:
 
if(dmbenvan[playerid])
{
    // kitesszük a játékost dmbõl SetPlayerPos(..
} else {
    // betesszük a játékost a dmbe SetPlayerPos(..
}
dmbenvan[playerid] = true - dmbenvan[playerid];

 
Mit is látunk itt? Van egy változó melynek az értéke ha true(1)  akkor a
 

dmbenvan[playerid] = true; // 1
dmbenvan[playerid] = true - dmbenvan[playerid];// <- ez behelyettesítve az érték felcserélés:
// dmbenvan[playerid] = true - true; // eredményül nullát kapunk tehát false(0) értéket kap a változó. (mivel 1 - 1 = 0-val)

 
Ugyanez fordítva ha false(0) értékkel kezdünk:
 

dmbenvan[playerid] = false; // 1
dmbenvan[playerid] = true - dmbenvan[playerid];// <- ez behelyettesítve az érték felcserélés:
// dmbenvan[playerid] = true - false; // eredményül egyet kapunk tehát true(1) értéket kap a változó. (mivel 1 - 0 = 1-el)

 
Lemagyarítva kicsit érthetõbben: 
Ha 1-bõl kivonunk 1-et akkor 0-át kapunk eredményül,
ha 1-bõl kivonunk 0-át akkor 1-et kapunk eredményül.
 

A harmadik megoldás egy változó érték felcserélésének a pawnban használatos tagadás jellel is megvalósítható, ami a felkiáltó jel (!).
 
if(dmbenvan[playerid])
{
    // kitesszük a játékost dmbõl SetPlayerPos(..
} else {
    // betesszük a játékost a dmbe SetPlayerPos(..
}
dmbenvan[playerid] = !dmbenvan[playerid]; // érték felcserélése

 
Ehhez sok magyarázat talán nem szükséges, ha (true(1)) az értéke akkor azt letagadva (false(0)) értéket kapunk, ugyanez fordítva is igaz.
Sebesség tesztet nem végeztem melyik gyorsabb, de méretileg a harmadik megoldás foglal kevesebb helyet.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal