Le istruzioni condizionali sono strutture di controllo che permettono di prendere decisioni ed eseguire diverse porzioni di codice in base al verificarsi o meno di determinate condizioni. Servono a controllare il flusso di esecuzione: se una condizione è vera, viene eseguito un certo blocco di codice; se è falsa, ne viene eseguito un altro (oppure nessuno).
Senza di esse, un programma eseguirebbe tutte le istruzioni che lo compongono solo in modo lineare, nell'ordine in cui sono scritte. La loro funzione principale è gestire la logica del programma, permettendogli di adattarsi a input variabili o a cambiamenti di stato. Il loro funzionamento si basa sulla valutazione di un'esperessione booleana.
Alcuni usi nei videogiochi includono (l'elenco non è esaustivo):
- gestire l'input, ad esempio verificare se il giocatore ha premuto un tasto;
- controllare lo stato, ad esempio determinare se un nemico può attaccare o inseguire in base alla distanza dal giocatore;
- gestire le risorse, ad esempio controllare se i punti vita sono scesi a zero per attivare il game over, o se il giocatore ha abbastanza monete per un acquisto;
- fisica e collisioni, ad esempio verificare se un personaggio è a terra prima di permettergli di saltare.
In pratica, le istruzioni condizionali rendono il gioco flessibile e "intelligente", capace di adattarsi a situazioni diverse invece di eseguire sempre le stesse istruzioni.
Nel seguito con <bool_expr> indichiamo un'esperessione booleana, il cui valore di verità è ovviamente o vero (true) oppure falso (false).
La struttura if/elif/else
In GDScript, l'istruzione condizionale completa è la struttura if/elif/else, dove ogni componente ha un ruolo specifico:
- if è la clausola obbligatoria che avvia il controllo e valuta la condizione principale;
- elif è costituita da una o più clausule opzionali che aggiungono (una o più) condizioni intermedie se le precedenti falliscono;
- else è la clausola finale opzionale eseguita solo se tutte le condizioni precedenti risultano false.
Istruzione if
L'istruzione if è la struttura di controllo fondamentale per prendere decisioni; funziona secondo la logica "se la condizione è vera allora fai qualcosa". Nello sviluppo di un videogioco si trova ovunque, ad esempio:
- se il giocatore preme un certo tasto, allora spara;
- se il giocatore colpisce un nemico, allora infligge danno;
- se il parametro "salute" del giocatore arriva a zero, allora il giocatore muore.
La sintassi di if è la seguente:
blocco-istruzioni if
...
La logica di funzionamento è la seguente:
- viene innazitutto controllato il valore di verità di <bool_expr>;
- se (e solo se) <bool_expr> è true vengono eseguite le istruzioni del blocco if;
GDScript usa l'indentazione (generalmente 4 spazi o un "tab" - il carattere di tabulazione) per definire le istruzioni appartenenti al blocco (hanno tutte almeno lo stesso livello di indentazione). Se invece <bool_expr> è false le istruzioni del blocco if non vengono eseguite; - vengono eseguite le istruzioni successive all'if.
ESEMPIO: si definiscono 2 variabili, x=10 e y=5 e si confrontano per vedere se x>y oppure se x<y. Dato che x>y, viene stampato il messaggio "x è maggiore di y" perché l'espressione booleana x>y vale true. Se nel codice si invertono i valori delle variabili ponendo x=5 e y=10 verrebbe stampato il secondo messaggio ("x è minore di y").
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
if-else
La clausula else definisce le istruzioni da eseguire nel caso che la condizione di controllo <bool_expr> fallisca. Funziona secondo la logica "se la condizione è vera allora fai qualcosa, altrimenti (else) fai qualcos'altro".
La sintassi di if-else è la seguente:
blocco-istruzioni if
blocco-istruzioni else
...
La logica di funzionamento è la seguente:
- viene controllato il valore di <bool_expr>;
- se <bool_expr> è true si eseguono le istruzioni del blocco if altrimenti (significa che <bool_expr> è false) si eseguono le istruzioni del blocco else;
- vengono eseguite le istruzioni successive.
ESEMPIO: si definiscono 2 variabili, x=10 e y=123 e si confrontano per vedere se x>y oppure se x<y. Dato che x>y, viene stampato il messaggio "x è minore di y" perché l'espressione booleana x>y vale false.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
if-elif
La clausula elif aggiunge una condizione (definita da una nuova espressione booleana) da controllare nel caso che la condizione di controllo <bool_expr> fallisca, e definisce le istruzioni da eseguire nel caso la nuova condizione introdotta sia verificata. Funziona secondo la logica "se la condizione dell'if è vera allora fai qualcosa altrimenti, se la nuova condizione specificata nell'elif è vera, allora fai quest'altra cosa". In effetti elif è un'abbreviazione per else if ("altrimenti se").
La sintassi di if-elif è la seguente:
blocco-istruzioni if
blocco-istruzioni elif
...
La logica di funzionamento è la seguente:
- viene controllato il valore di <bool_expr>;
- se <bool_expr> è true si eseguono le istruzioni del blocco if,
altrimenti si controlla se <bool_expr_1> è true e se lo è, si eseguono le istruzioni del blocco elif. Se anche <bool_expr_1> è false non vengono eseguite neanche le istruzioni del blocco elif; - vengono eseguite le istruzioni successive.
Da notare la differenza tra elif ed else: se l'espressione booleana principale fallisce, le istruzioni del blocco elif sono eseguite se e solo se la nuova espressione booleana è verificata, mentre le istruzioni del blocco else vengono eseguite in ogni caso.
ESEMPIO: si definisce una variabile salute=80 per controllare lo stato di salute di un giocatore e si manda un messaggio a video in base al suo valore (in questo caso sarà "discreta"). Impostando salute=95 è verrà stampato "ottima", ma con un numero inferiore a 70 non verrà stampato nulla.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
La clausula elif permette di evitare ulteriori livelli di indentazione e/o annidamento che aggiugono righe di codice che lo renderebbero meno leggibie. Infatti, in mancanza di elif il codice precedente si scriverebbe in questo modo (l'output è ovviamente lo stesso):
Si possono inserire molteplici clausule elif concatenate per considerare l'eventualità di più possibilità. Le relative espressioni booleane di controllo di ciascuna clausula vengono controllate una dopo l'altra nell'ordine in cui sono scritte: verranno eseguite solo le istruzioni della prima clausula che è verificata e tutte le altre verifiche verranno saltate. Se nessuna clausula è verificata non verrà eseguito nessun blocco istruzioni:
blocco-istruzioni if
blocco-istruzioni-1
blocco-istruzioni-2
elif <bool_expr_n>:
blocco-istruzioni-n
...
La logica di funzionamento è la seguente:
- viene controllato il valore di <bool_expr>;
- se <bool_expr> è true si eseguono le istruzioni del blocco if,
altrimenti si controlla se <bool_expr_1> è true e se lo è, si eseguono le istruzioni del blocco-istruzioni-1,
altrimenti (<bool_expr_1> è false) si controlla se <bool_expr_2> è true e se lo è, si eseguono le istruzioni del blocco istruzioni-2, e così via.
La sequenza di controlli sulle espressioni booleane si interrompe non appena viene trovata una condizione elif-k che sia verificata (true), vengono eseguite le istruzioni del relativo blocco k, mentre tutte le successive verifiche non vengono effettuate.
Se nessuna condizione viene verificata nessun blocco istruzioni verrà eseguito; - vengono eseguite le istruzioni successive.
ESEMPIO: si definisce una variabile salute=75 per controllare lo stato di salute di un giocatore e si manda un messaggio a video in base al suo valore (in questo caso sarà "discreta"). Da notare che anche l'espressione booleana salute>=60 è vera, tuttavia la clausula del precedente elif salute>=70 è verificata per prima, quindi la verifica di tutte le clausule successive viene saltata.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
if-elif-else
La clausula else inserita dopo una serie di controlli if-elif, definisce le istruzioni da eseguire quando tutte le condizioni booleane non sono verificate (sia quella principale dell'if che quelle secondarie dei vari elif), cioè sono tutte false. In tal caso l'else funziona come ultima alternativa ("fallback"), istruzioni da eseguire se non è possibile eseguirne altre che ricadono nei casi precedenti.
La sintassi di if-elif-else è la seguente:
blocco-istruzioni if
blocco-istruzioni-1
blocco-istruzioni-2
elif <bool_expr_n>:
blocco-istruzioni-n
blocco-istruzioni else
...
La logica di funzionamento è identica a quella definita per la catena if-elif vista in precedenza, con l'unica aggiunta che, se tutte le condizioni booleane specificate in tale catena non sono verificate, allora viene sicuramente eseguito il blocco istruzioni definito nell'else, ed infine vengono eseguite eventuali altre istruzioni codificate dopo l'istruzione if-elif-else.
ESEMPIO: stampare un messaggio che informa sullo stato di salute di un giocatore.
OUTPUT dell'esecuzione (estendi l'area di testo se necessario):
Qaundo i valori da controllare sono numerosi, non è conveniente usare lunghe sequenze in una catena if-elif-else: GDScriot offre un'alternativa più snella e facilmente mantenibile con l'istruzione match.
Per ulteriori informazioni su if/elif/else riferirsi alla documentazione ufficiale: https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html#if-else-elif
| Precedente | Indice | Successivo |





