←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Kolejnosc warukow i ich optym...


Najlepsza odpowiedź sebul 15.01.2014 08:24

Tak, kolejność warunków ma znaczenie, w każdym warunku wszystko jest sprawdzane od lewej i jeśli jeszcze przed sprawdzeniem wszystkiego będzie już wiadomo, że dany warunek się spełni lub nie, to kolejne warunki nie będą sprawdzane. Przejdź do postu
Zablokowany

  • +
  • -
Rivit - zdjęcie Rivit 14.01.2014

witam.
Jaka jest najoptymalniejsza kolejnosc warunkow?
Przyklad
public TakeDamage()
{
    if(!is_user_connected(idattacker))
        return HAM_IGNORED;
    
    if(!ma_klase[idattacker])
        return HAM_IGNORED;
    
    if(damagebits & DMG_BULLET)
    {
        new weapon = get_user_weapon(idattacker);
        
        if(weapon == CSW_KNIFE && damage > 20.0 && random_num(1,2) == 1)
    }
}
a moze taka
public TakeDamage()
{
    if(!is_user_connected(idattacker)||!ma_klase[idattacker]||!(damagebits & DMG_BULLET))
        return HAM_IGNORED;
    
        new weapon = get_user_weapon(idattacker);
        
        if(weapon == CSW_KNIFE && damage > 20.0 && random_num(1,2) == 1)
}
lepiej pakowac wszystko do jednego if i jesli jest rozne to ham ignored czy lepiej jest uzyc jednego if i zrobic jeden dlugi warunek za pomoca '&&', a moze podzielic (na poczatku if connected, potem ma klase, potem czy dmg jest z broni (damagebits), a na koncu random itp.). Jak to zrobic optymalnie. proszę o rozwiniecie odpowiedzi bo zzera mnie ciekawosc.
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 14.01.2014

Akurat ten przykład co podałeś, to tam nie ma różnicy w kolejności warunków, tylko kilka warunków zamieniłeś na jeden. Jak jest lepiej? Tak jak Ci wygodniej, bo różnicy w optymalności nie ma lub ona jest na tyle mała, że nie trzeba sobie tym zawracać głowy.
Odpowiedz

  • +
  • -
Droso - zdjęcie Droso 14.01.2014

Oba przypadki, które podałeś są takie same.

 

W drugim przypadku i tak leci po kolei od lewej czyli sprawdzi po kolei jak wyżej :P.

 

+ Jeżeli ogólnie chodzi o kolejność to zawsze na początku sprawdzaj czy jest połączony - potem czy zmienna jest np. true, a potem twoje inne warunki :D.

Odpowiedz

  • +
  • -
DarkGL - zdjęcie DarkGL 14.01.2014

lepiej pakowac wszystko do jednego if i jesli jest rozne to ham ignored czy lepiej jest uzyc jednego if i zrobic jeden dlugi warunek za pomoca '&&', a moze podzielic (na poczatku if connected, potem ma klase, potem czy dmg jest z broni (damagebits), a na koncu random itp.)

 

różnica jest minimalna i pomijalna a długie ify są trudniejsze do czytania przez programistę więc po prostu łącz obie techniki z głową

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 15.01.2014

a to nie jest tak ze jak ze
warunek && warunek
i pierwszy jest falsz to drugi sprawdza wtedy czy nie? Bo wtedy ulozenie warunkow chyba cos daje?
Odpowiedz

  • +
  • -
Najlepsza odpowiedź sebul - zdjęcie sebul 15.01.2014

Tak, kolejność warunków ma znaczenie, w każdym warunku wszystko jest sprawdzane od lewej i jeśli jeszcze przed sprawdzeniem wszystkiego będzie już wiadomo, że dany warunek się spełni lub nie, to kolejne warunki nie będą sprawdzane.
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 15.01.2014

Czyli opłaca się używać warunków w jednej linii.

A jak je ustawić?

dajmy na to mam dane:

ma_perk
is_user_connected(id)
random_num (1, 3) == 1
damagebits & DMG_BULLET

Jak je ustawić od lewej do prawej?


sebul (16.01.2014 15:20):
Tak jak już zostało napisane, czy dasz to w jednym warunku, czy w kilku, nie ma praktycznie różnicy, bo nawet jak dasz kilka warunków, to jak pierwszy się nie spełni, to do reszty nawet nie dojdzie.
Odpowiedz

  • +
  • -
Zabijaka Gryps - zdjęcie Zabijaka Gryps 15.01.2014

is_user_connected(id) && ma_perk && damagebits & DMG_BULLET && random_num (1, 3) == 1
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 15.01.2014

Mogłbyś wyjaśnić dlaczego takie kryterium?

Odpowiedz

  • +
  • -
^Grzyboo - zdjęcie ^Grzyboo 15.01.2014

is_user_connected(id) - oczywiste, sprawdzamy, czy gracz jest połączony - to chyba podstawa

ma_perk[id] - wypadałoby sprawdzić, czy gracz ma ten item, zanim coś zaczniemy działać.

damagebits & DMG_BULLET - gdy już ustalone wszystko, sprawdzamy czy to obrażenia od kul

losowanie - raczej na końcu się daje. Nie ma sensu losować, gdy np. kolejny warunek nie zostanie spełniony. 

Odpowiedz
Zablokowany