Cele lekcji
Po zakończeniu tej lekcji…
- Będziesz potrafić korzystać z instrukcji If.
Jednym z najczęstszych działań programistycznych jest korzystanie z instrukcji If.
Jeśli (If) jakiś warunek jest prawdziwy, to (Then) należy uruchomić określony fragment kodu. Jeśli nie jest on prawdziwy, to dany kod ma nie być uruchamiany.
Jeśli przykładowo podczas walki punkty wytrzymałości postaci spadną do zera, walkę należy zakończyć. Jeśli gracz ma więcej niż zero punktów wytrzymałości, walka powinna trwać dalej.
Można także tworzyć bardziej złożone instrukcje If, które nie tylko sprawdzają jedną wartość, jak również obsługiwać więcej niż dwa warunki dla jednej wartości.
Poniżej przedstawiam przykładowy kod i opis 4 najpopularniejszych sposobów zastosowania instrukcji If.
Prosta instrukcja If
public bool IsPlayerStillAlive1(int currentHitPoints) { if(currentHitPoints > 0) { return true; } return false; }
Sprawdzamy, czy podana wartość currentHitPoints jest większa od zera. Jeśli tak, zostanie uruchomiony kod zawarty między nawiasami klamrowymi po instrukcji If (wiersze 4-6). Po dojściu do wiersza 5. przetwarzanie kodu w tej funkcji zostanie zatrzymane i zwrócona zostanie wartość true (prawda).
Jeśli wartość currentHitPoints jest równa zero (lub mniejsza), dalsza część kodu w tej funkcji zostanie przetworzona. W tym przypadku program dojdzie do wiersza 8. i zwróci wartość false do elementu, który wywołał tę funkcję.
Instrukcje If oraz Else
public bool IsPlayerStillAlive2(int currentHitPoints) { if(currentHitPoints > 0) { return true; } else { return false; } }
Ta funkcja wykonuje tę samą operację, co poprzednia, jednak teraz użyliśmy jawnej instrukcji Else.
Jeśli więc wyrażenie ujęte w nawiasach okrągłych w instrukcji If jest prawdziwe, kod zawarty w nawiasach klamrowych (wiersze 4-6) zostanie uruchomiony. W przeciwnym razie (Else), uruchomiony zostanie kod zawarty w następnej parze nawiasów klamrowych.
Jest to prosta funkcja zawierająca tylko jeden wiersz kodu w każdej gałęzi instrukcji If (gałąź true i gałąź false). Jednak między nawiasami można dodać dłuższe fragmenty kodu, co pokażemy w kolejnych lekcjach.
Złożone warunki If
public bool IsPlayerStillAlive3(int currentHitPoints, bool hasResurrectionRing) { if((currentHitPoints > 0) || ((currentHitPoints == 0) && hasResurrectionRing)) { return true; } else { return false; } }
W instrukcji If można sprawdzić wiele warunków. Można określić, że wymagane jest spełnienie wszystkich warunków (znaki &&) lub co najmniej jednego z nich (znaki ||).
W tym momencie można się pogubić, zwłaszcza jeśli kod zawiera wiele warunków do sprawdzenia.
Aby prawidłowo prześledzić kod, należy skupiać się na nawiasach wokół warunków i przechodzić od „najgłębszego” zestawu nawiasów do „najbardziej ogólnego” (tak jak w matematyce).
Przyjmijmy, że ta funkcja jest wywoływana za pomocą następujących parametrów:
currentHitPoints = 5 hasResurrectionRing = false
Jeśli zastąpimy zmienne w nawiasach wartościami, otrzymamy taki kod:
if((5 > 0) || ((5 == 0) && false))
Który staje się:
if((true) || ((false) && false))
Teraz przyjrzyjmy się nowym symbolom: || oraz &&.
Korzystamy z nich, kiedy chcemy zastosować wartości logiczne. Znaki || oznaczają LUB, a znaki && oznaczają ORAZ.
W przypadku && wartość po ich obu stronach musi być prawdziwa, aby całe porównanie było prawdziwe.
Teraz wyrażenie ((false) && false) możemy zredukować do postaci (false), ponieważ wartości po obu stronach nie są prawdziwe. Otrzymujemy:
if((true) || (false))
W przypadku || jeśli wartość po dowolnej stronie jest prawdziwa, cała instrukcja jest prawdziwa. Jeśli naszą instrukcję If „przetłumaczymy” na język polski, to będzie ona brzmieć: jeśli aktualne punkty wytrzymałości gracza są większe od zera lub aktualne punkty wytrzymałości równają się zero, a gracz ma pierścień odrodzenia, to wykonaj działanie…
Wartość prawda występuje co najmniej po jednej stronie operatora ||, więc cała operacja jest prawdziwa.
Czyli dla tych wartości parametru zostanie uruchomiony kod zawarty w pierwszym zestawie nawiasów klamrowych.
Jeśli te parametry zostaną przekazane, program wykona odpowiednie działania i na koniec uruchomi kod Else:
currentHitPoints = 0 hasResurrectionRing = false
Powoduje, że instrukcja If wygląda następująco:
if((0 > 0) || ((0 == 0) && false))
Redukuje się do:
if((false) || ((true) && false))
Redukuje się do:
if((false) || (false))
Redukuje się do:
if(false)
Więc uruchomiony zostanie kod zawarty w nawiasach klamrowych po instrukcji Else.
Instrukcje If oraz Else if
Niekiedy dany element należy skontrolować wielokrotnie.
Poniżej pokazuję sposób pozwalający określić poziom gracza na podstawie liczby punktów doświadczenia:
public int ComputePlayerLevel(int experiencePoints) { if(experiencePoints < 100) { return 1; // Player is level 1 } else if(experiencePoints < 250) { return 2; // Player is level 2 } else if(experiencePoints < 500) { return 3; // Player is level 3 } else if(experiencePoints < 1000) { return 4; // Player is level 4 } return 5; // The maximum level is 5, in this sample }
W tym przypadku jeśli wartość parametru experiencePoints jest mniejsza niż 100, funkcja zwraca wartość jeden.
W przypadku wartości 100 (i więcej) nadal trzeba wykonać dodatkowe porównania. Teraz właśnie do instrukcji If dodajemy Else if.
W tej funkcji jeśli gracz ma 672 punkty doświadczenia (experiencePoints), to odpowiedzią na pierwszą instrukcje If (gdzie sprawdzane jest, czy wartość jest mniejsza od 100) jest fałsz, a program przechodzi dalej, do instrukcji Else if. Wartość 672 nie jest mniejsza niż 250, więc program przechodzi do kolejnej instrukcji Else if. W niej okazuje się, że nasza wartość nadal nie jest mniejsza od 500 i program przechodzi do następnej instrukcji Else if. W końcu okazuje się, że 672 jest mniejsze od 1000, więc program uruchamia kod i zwraca wartość 4.
Jeśli żadne wyrażenie If nie byłoby prawdziwe, program sprawdzałby funkcje do momentu osiągnięcia wiersza powodującego zwrot wartości 5.
Podsumowanie
Teraz już wiesz, jak można uruchamiać lub nie uruchamiać fragmentów kodu w oparciu o warunki zawarte w programie.
Kiedy dodamy kod źródłowy logiki gry (poruszanie się postaci między lokacjami, walka z potworami, wykonywanie zadań itd.), to skorzystamy z wielu różnych instrukcji If.
UWAGA: W przypadku instrukcji If korzystającej z operatorów || oraz && użyłem wielu nawiasów, aby ułatwić zrozumienie sposobu obliczania logiki porównawczej. Ułatw pracę sobie lub innemu programiście, który będzie rozwijał program po tobie, i również używaj wielu nawiasów.
Kod mogłem zapisać w takiej postaci:
if(currentHitPoints > 0 || (currentHitPoints == 0 && hasResurrectionRing))
Jednak jest on wtedy odrobinę trudniejszy do zrozumienia.