Esercizio - Creare una logica decisionale annidata con if, else if ed else
Nell'unità precedente sono state usate più istruzioni if
per implementare le regole di un gioco. Alla fine dell'unità si è tuttavia notato che sono necessarie istruzioni if
più espressive per correggere un piccolo bug nel codice.
In questo esercizio si useranno le istruzioni if
, else
e else if
per migliorare le opzioni di diramazione nel codice e correggere un bug della logica.
Usare le istruzioni if e else invece di due istruzioni if distinte
Invece di eseguire due controlli per visualizzare il messaggio "Hai vinto!" o "Spiacenti, hai perso", si userà la parola chiave else
.
Verificare che il codice di Program.cs corrisponda al seguente:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}"); if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; } if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; } if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
Questo è il codice completato nell'unità precedente.
Esaminare le due istruzioni
if
alla fine del file:if (total >= 15) { Console.WriteLine("You win!"); } if (total < 15) { Console.WriteLine("Sorry, you lose."); }
Si noti che entrambe le istruzioni
if
confrontanototal
con lo stesso valore numerico. Questa è l'opportunità perfetta per usare un'istruzioneelse
.Aggiornare le due istruzioni
if
come indicato di seguito:if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }
In questo caso, se
total >= 15
è false, verrà eseguito il blocco di codice sotto la parola chiaveelse
. Poiché i due risultati sono opposti, si tratta di uno scenario perfetto per la parola chiaveelse
.Il file Program.cs aggiornato deve contenere il codice seguente:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}"); if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; } if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; } if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }
Modificare il codice per rimuovere il doppio bonus per aver ottenuto due e tre volte lo stesso punteggio tramite l'annidamento
Nell'unità precedente è stato rilevato che è stato introdotto un piccolo bug logico nell'applicazione. È possibile risolvere il problema annidando le istruzioni if
.
L'annidamento consente di inserire blocchi di codice all'interno di blocchi di codice. In questo caso si anniderà una combinazione di if
e else
(il controllo dei duplicati) all'interno di un'altra istruzione if
(il controllo dei triplicati) per impedire che entrambi i bonus vengano assegnati.
Modificare il codice in modo che corrisponda al listato di codice seguente:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}"); if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; } else { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; } } if (total >= 15) { Console.WriteLine("You win!"); } else { Console.WriteLine("Sorry, you lose."); }
Esaminare le istruzioni
if
annidate.L'obiettivo è creare un costrutto interno
if-else
in cui i due risultati sono opposti correlati e quindi usare i risultati opposti (se/true ed else/false) per assegnare i punti bonus per triplicati e duplicati. Per raggiungere questo obiettivo, verificare la presenza di duplicati nell'istruzioneif
esterna e quindi di triplicati nell'istruzioneif
interna. Questo criterio garantisce che quando il controllo interno per rilevare triplicati restituiscefalse
, il blocco di codiceelse
può assegnare i punti per i duplicati.In seguito si applicherà la modalità "hardcoded" ai risultati dei tre lanci per testare la logica del codice.
Creare una riga di codice vuota sopra la riga di dichiarazione e inizializzazione di
total
.Per testare un lancio che risulta in duplicati, immettere il codice seguente:
roll1 = 6; roll2 = 6; roll3 = 5;
L'impostazione su hardcoded per le tre variabili
roll
consente di testare il codice senza dover eseguire l'applicazione decine di volte.Fare clic su Salva nel menu File di Visual Studio Code.
Nel pannello ESPLORA RISORSE per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject e quindi scegliere Apri nel terminale integrato.
Verrà aperto un pannello del terminale con un prompt dei comandi che indica che il terminale è aperto al percorso della cartella TestProject.
Nel prompt dei comandi del terminale, digitare dotnet run per eseguire il codice, quindi premere INVIO.
Quando il codice viene eseguito, dovrebbe essere visualizzato quanto riportato di seguito:
Dice roll: 6 + 6 + 5 = 17 You rolled doubles! +2 bonus to total! You win!
Per testare un lancio che risulta in triplicati, aggiornare le variabili di lancio hardcoded come indicato di seguito:
roll1 = 6; roll2 = 6; roll3 = 6;
Fare clic su Salva nel menu File di Visual Studio Code.
Nel pannello ESPLORA RISORSE per aprire un terminale nel percorso della cartella TestProject, fare clic con il pulsante destro del mouse su TestProject e quindi scegliere Apri nel terminale integrato.
Nel prompt dei comandi del terminale, digitare dotnet run per eseguire il codice, quindi premere INVIO.
Quando il codice viene eseguito, dovrebbe essere visualizzato quanto riportato di seguito:
Dice roll: 6 + 6 + 6 = 18 You rolled triples! +6 bonus to total! You win!
Usare le istruzioni if, else ed else if per assegnare un premio anziché un messaggio di vincita o perdita
Per rendere più divertente il gioco, è possibile modificarlo in modo da assegnare premi fittizi per ogni punteggio. È possibile offrire quattro premi. Il giocatore dovrebbe tuttavia vincere un solo premio:
- Se il giocatore ottiene un punteggio maggiore o uguale a 16, avrà in premio una nuova auto.
- Se il giocatore ottiene un punteggio maggiore o uguale a 10, avrà in premio un nuovo portatile.
- Se il giocatore ottiene il punteggio esatto di 7, avrà in premio un viaggio.
- In caso contrario, il giocatore avrà in premio un gattino.
Modificare il codice dei passaggi precedenti in modo che corrisponda al listato di codice seguente:
Random dice = new Random(); int roll1 = dice.Next(1, 7); int roll2 = dice.Next(1, 7); int roll3 = dice.Next(1, 7); int total = roll1 + roll2 + roll3; Console.WriteLine($"Dice roll: {roll1} + {roll2} + {roll3} = {total}"); if ((roll1 == roll2) || (roll2 == roll3) || (roll1 == roll3)) { if ((roll1 == roll2) && (roll2 == roll3)) { Console.WriteLine("You rolled triples! +6 bonus to total!"); total += 6; } else { Console.WriteLine("You rolled doubles! +2 bonus to total!"); total += 2; } Console.WriteLine($"Your total including the bonus: {total}"); } if (total >= 16) { Console.WriteLine("You win a new car!"); } else if (total >= 10) { Console.WriteLine("You win a new laptop!"); } else if (total == 7) { Console.WriteLine("You win a trip for two!"); } else { Console.WriteLine("You win a kitten!"); }
Soffermarsi qualche istante a esaminare il costrutto
if-elseif-else
aggiornato.Le istruzioni
if
,else if
eelse
consentono di creare più condizioni esclusive come espressioni booleane. In altre parole, quando si vuole che si verifichi un solo scenario, ma esistono diversi risultati e condizioni possibili, usare tutte le istruzionielse if
desiderate. Se nessuna delle istruzioniif
eelse if
è applicabile, verrà eseguito il blocco di codiceelse
finale. L'istruzioneelse
è facoltativa ma deve essere eseguita per ultima, se si sceglie di includerla.Usare la tecnica di impostazione temporanea delle variabili
roll
come hardcoded per testare ogni messaggio.
Riepilogo
- La combinazione di istruzioni
if
eelse
consente di testare una condizione e quindi di eseguire uno dei due risultati. Il blocco di codice perif
verrà eseguito quando l'espressione booleana ètrue
e il blocco di codice perelse
verrà eseguito quando l'espressione booleana èfalse
. - È possibile annidare le istruzioni
if
per limitare una condizione possibile. Tuttavia, è consigliabile preferire l'uso delle istruzioniif
,else if
eelse
. - Usare istruzioni
else if
per creare più condizioni esclusive. - Un'istruzione
else
è facoltativa, ma deve essere sempre eseguita per ultima, se inclusa.