In questo codelab Kotlin creerai un altro gioco di dadi, Lucky Dice Roll, in cui dovrai cercare di ottenere un numero fortunato. Il programma imposterà un numero fortunato e tirerà i dadi. Quindi, controlla il tiro rispetto al numero fortunato e stampa un messaggio appropriato nell'output. Per fare ciò, imparerai a confrontare i valori e a prendere decisioni diverse nel tuo programma Kotlin.
Per aiutarti a concentrarti sui concetti di programmazione senza doverti preoccupare dell'interfaccia utente dell'app, utilizzerai lo strumento di programmazione Kotlin basato su browser e visualizzerai i risultati nella console.
Prerequisiti
- Come aprire, modificare ed eseguire il codice in https://try.kotlinlang.org/
- Possibilità di creare ed eseguire un programma Kotlin che utilizza variabili, funzioni con argomenti, classi con metodi e stampa un risultato nella console.
Obiettivi didattici
- Come utilizzare le istruzioni
if
eelse
- Come confrontare i valori utilizzando operatori come maggiore di (
>
), minore di (<
) e uguale a (==
). - Come utilizzare le istruzioni
when
per scegliere un'opzione in base a un determinato valore. - Che cos'è il tipo di dati
Boolean
e come utilizzare i valoritrue
efalse
per prendere decisioni.
Cosa creerai
- Lucky Dice Roll, un gioco di dadi basato su Kotlin che ti consente di specificare un numero fortunato. Un giocatore vince se tira il numero fortunato.
Cosa serve
- Un computer con una connessione a internet.
Il programma Lucky Dice Roller deve determinare se l'utente ha tirato un numero fortunato e riceve un messaggio di congratulazioni oppure un messaggio che lo invita a riprovare.
In qualità di sviluppatore di app, dovrai prendere decisioni sul comportamento dell'app e creare risultati diversi per i tuoi utenti.
Se stai creando un'app di shopping, potresti mostrare schermate diverse in base alle opzioni di consegna scelte da un utente. Per un quiz, mostreresti schermate diverse a seconda che la risposta del giocatore sia corretta. A seconda dell'app, potrebbero esserci molti risultati possibili, che dovrai tenere in considerazione nel tuo codice.
Nel programma Lucky Dice Roller, l'app deve gestire diversi casi, ad esempio:
- Se il risultato del lancio dei dadi è il numero fortunato, mostra un messaggio di congratulazioni.
- Altrimenti , se il risultato del lancio dei dadi non è il numero fortunato, mostra un messaggio per riprovare.
Per aggiungere questa logica al tuo codice, utilizza parole chiave Kotlin speciali come if
, else
e when
.
Vediamo alcuni esempi.
Utilizza un'istruzione if
per impostare una condizione che viene soddisfatta
- Esamina il codice riportato di seguito. Riesci a indovinare quale sarà l'output?
fun main() {
val num = 5
if (num > 4) {
println("The variable is greater than 4")
}
}
- Copia e incolla il codice nell'editor del programma Kotlin ed esegui il programma per osservare l'output.
The variable is greater than 4
La procedura decisionale per questo programma è la seguente:
- Crea una variabile
num
e impostala su5.
- Se è vero che
num
è maggiore (>
) di 4,
stampa"The variable is greater than 4"
. - In tutte le altre situazioni, non fare nulla.
Nell'esempio precedente, num
è impostato su 5. L'istruzione if
confronta se la variabile è maggiore di 4. Poiché è vero, il sistema esegue le istruzioni tra parentesi graffe e stampa il messaggio.
Nota il formato generale dell'istruzione if
:
- Inizia con la parola chiave
if
. - Segui con due parentesi
()
. All'interno delle parentesi va la condizione. La condizione è qualsiasi cosa che possa esseretrue
ofalse
. Ad esempio, se un numero è maggiore di un altro. - Segui con due parentesi graffe
{}
. All'interno delle parentesi graffe inserisci il codice da eseguire se la condizione ètrue
.
if (condition-is-true) { execute-this-code }
Utilizza un'istruzione if
per impostare una condizione che non viene soddisfatta
- Modifica il valore di
num
in 3, come mostrato di seguito. Che cosa ti aspetti che succeda se esegui questo codice?
fun main() {
val num = 3
if (num > 4) {
println("The variable is greater than 4")
}
}
- Copia e incolla il codice nell'editor del programma Kotlin ed esegui il programma per osservare l'output.
Se num
è impostato su 3, non viene stampato nulla perché il valore di num
è inferiore a 4. Quindi, la condizione che num
sia maggiore di 4 è false
, il codice tra le parentesi graffe non viene eseguito e non viene stampato nulla.
Utilizza else
per creare un'alternativa per le condizioni non soddisfatte
Anziché non fare nulla, puoi offrire ai tuoi utenti un'alternativa quando una condizione non viene soddisfatta. Come per il linguaggio normale, puoi farlo con un'istruzione else
.
- Aggiungi un'istruzione
else
per stampare un messaggio quandonum
non è maggiore di 4, come mostrato di seguito. Che cosa ti aspetti che succeda se esegui questo codice?
fun main() {
val num = 3
if (num > 4) {
println("The variable is greater than 4")
} else {
println("The variable is less than 4")
}
}
- Copia e incolla il codice nell'editor del programma Kotlin ed esegui il programma per osservare l'output.
The variable is less than 4
- Tieni presente che quando
num
ha un valore di 3, il programma stampa il messaggio"The variable is less than 4"
associato all'istruzioneelse
perchénum
non è maggiore di 4 . - Modifica
num
in 5 ed esegui di nuovo il programma. Ora è vero chenum
è maggiore di 4 e il programma stampa "The variable is greater than 4
". - Modifica
num
in 4 ed esegui il programma. Ora 4 non è maggiore di 4 e il programma stampa "The variable is less than 4
".
Sebbene "The variable is less than 4
" sia l'output corretto per le condizioni impostate nel codice, l'istruzione stampata non è precisa, poiché 4 non è minore di 4. Puoi aggiungere un'altra condizione che controlli la terza possibilità, ovvero se num
è esattamente 4, e stampi un'istruzione corretta quando la condizione è vera.
Utilizza una combinazione di else
+ if
per aggiungere condizioni alternative.
Puoi avere più di una condizione. Per il tuo esempio, ecco come puoi coprire tutte le possibilità per num
:
- Se
num
è maggiore di 4, stampa "The variable is greater than 4
". - Altrimenti, se
num
è uguale a 4, stampa"The variable is equal to 4"
. - Altrimenti, stampa
"The variable is less than 4"
.
Questi vengono definiti casi diversi nell'istruzione if-else. Sono elencate tre richieste.
Il codice aggiornato ha il seguente aspetto:
fun main() {
val num = 4
if (num > 4) {
println("The variable is greater than 4")
} else if (num == 4) {
println("The variable is equal to 4")
} else {
println("The variable is less than 4")
}
}
Nota le seguenti modifiche:
- Il valore di
num
è ora impostato su 4, in modo da poter testare la nuova condizione. - Tra le istruzioni
if
eelse
originali è presente una nuova istruzioneelse if
per il caso in cuinum
sia esattamente 4.
- Copia e incolla il codice riportato sopra nell'editor del programma Kotlin ed esegui il programma per osservare l'output.
The variable is equal to 4
- Prova a modificare il valore di
num
e a vedere come influisce sull'output. Modificanum
in 2 e 6, in modo da visualizzare ciascuna delle condizionitrue
.
Flusso di controllo
Se esamini le istruzioni if-else riportate sopra, il codice verrà eseguito o scorrerà in base alle condizioni. Il modo in cui guidi l'esecuzione con queste condizioni è chiamato "flusso di controllo" del programma.
- Supponiamo che il tuo tiro di dadi
num
sia 3. Il programma controlla la prima condizione (num > 4). Questa condizione è falsa, quindi il programma controlla la condizione successiva (num == 4), che è anch'essa falsa. Il programma esegue quindi il codice dell'istruzione else, che è l'opzione finale. - Se il numero del tiro di dado è 6, la prima condizione (num > 4) è vera. Il programma stampa il messaggio
"The variable is greater than 4"
. Poiché questa condizione è vera, non deve controllare il resto e l'istruzione if-else è completata. - Utilizza una combinazione else + if per aggiungere condizioni alternative.
In questa sezione, utilizzando ciò che hai imparato nell'attività precedente, aggiornerai il programma Dice Roller per verificare se hai tirato un numero fortunato preimpostato. Se ce l'hai, hai vinto!
Configurare il codice di avvio
Stai avviando Lucky Dice Roller con un codice simile a quello della soluzione del programma Kotlin Dice Roller precedente. Puoi modificare la funzione main()
nel codice precedente in modo che corrisponda oppure puoi copiare e incollare il codice riportato di seguito per iniziare.
fun main() {
val myFirstDice = Dice(6)
val diceRoll = myFirstDice.roll()
println("Your ${myFirstDice.numSides} sided dice rolled ${diceRoll}!")
}
class Dice (val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
Controlla se è uscito il numero fortunato
Crea prima un numero fortunato, quindi confronta il risultato del lancio dei dadi con quel numero.
.
- In
main()
, elimina l'istruzioneprintln()
. - In
main()
, aggiungi unval
chiamatoluckyNumber
e impostalo su 4. Il codice dovrebbe essere simile al seguente.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
}
- Di seguito, aggiungi un'istruzione
if
con una condizione tra parentesi()
che controlla serollResult
è uguale (==
) aluckyNumber
. Lascia un po' di spazio tra le parentesi graffe{}
per poter aggiungere altro codice.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
}
}
- All'interno delle parentesi graffe
{}
, aggiungi un'istruzioneprintln
per stampare"You win!"
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
println("You win!")
}
}
- Esegui il programma. Potrebbe essere necessario eseguirlo più volte prima di avere fortuna e visualizzare il messaggio vincente nell'output.
You win!
Rispondere quando il numero fortunato non è stato estratto
Se l'utente non vince, non riceve alcun feedback dal programma, il che può portarlo a chiedersi se il programma non funzioni. È buona norma fornire sempre una risposta quando l'utente esegue un'azione. Per il programma Lucky Dice Roller, puoi comunicare ai partecipanti che non hanno vinto utilizzando l'istruzione else
.
- Aggiungi una dichiarazione
else
da stampare"You didn't win, try again!"
.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
println("You win!")
} else {
println("You didn't win, try again!")
}
}
- Esegui il programma e, indipendentemente dal risultato, i tuoi utenti vengono sempre informati.
A questo punto, gli utenti sanno se hanno vinto o meno, ma non il motivo. Fornisci sempre agli utenti informazioni in modo che comprendano il risultato delle loro azioni. Immagina che il tuo programma sia una richiesta di prestito. "La tua richiesta non è stata approvata perché la tua affidabilità creditizia è scarsa" è molto più informativa di "Spiacenti, non possiamo concederti il prestito. Riprova." Per Lucky Dice Roller, puoi fornire agli utenti un messaggio informativo diverso per ogni tiro se hanno perso. Utilizza più istruzioni else if
per farlo.
- Aggiungi istruzioni
else if
per stampare un messaggio diverso per ogni rotolo. Se necessario, fai riferimento al formato che hai imparato nell'attività precedente.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
println("You win!")
} else if (rollResult == 1) {
println("So sorry! You rolled a 1. Try again!")
} else if (rollResult == 2) {
println("Sadly, you rolled a 2. Try again!")
} else if (rollResult == 3) {
println("Unfortunately, you rolled a 3. Try again!")
} else if (rollResult == 4) {
println("No luck! You rolled a 4. Try again!")
} else if (rollResult == 5) {
println("Don't cry! You rolled a 5. Try again!")
} else {
println("Apologies! you rolled a 6. Try again!")
}
}
Nel codice riportato sopra,
- Controlla se
rollResult
èluckyNumber
. - Se
rollResult
èluckyNumber
, stampa il messaggio vincente. - In caso contrario, controlla se
rollResult
è 1 e, in caso affermativo, stampa un messaggio di riprova. - In caso contrario, controlla se il valore di
rollResult
è 2 e, in tal caso, stampa un messaggio di riprova diverso. - In caso contrario, continua a controllare fino al numero 5.
- Se il numero non è compreso tra 1 e 5, l'unica opzione rimasta è 6, quindi non è necessario un altro test con
else if
e puoi semplicemente acquisire l'ultima opzione con l'ultima istruzioneelse
.
Poiché avere più casi else if
è molto comune, Kotlin offre un modo più semplice per scriverli.
Il test di molti risultati o casi diversi è molto comune nella programmazione. A volte, l'elenco dei possibili risultati può essere molto lungo. Ad esempio, se lanci un dado a 12 facce, avrai 11 istruzioni else if
tra la riuscita e il else
finale. Per semplificare la scrittura e la lettura di questo tipo di istruzioni, il che aiuta a evitare errori, Kotlin rende disponibile un'istruzione when
.
Stai per modificare il programma in modo che utilizzi un'istruzione when
. Un'istruzione when
inizia con la parola chiave when
, seguita dalle parentesi ()
. All'interno delle parentesi va il valore da testare. Seguono le parentesi graffe {}
per il codice da eseguire per condizioni diverse.
- Nel tuo programma, in
main()
, seleziona il codice dalla prima istruzioneif
alla parentesi graffa}
che chiude l'ultima istruzioneelse
ed eliminalo.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
}
- In
main()
, sotto la dichiarazione diluckyNumber
, crea un'istruzionewhen
. Poichéwhen
deve essere testato rispetto al risultato del lancio, inseriscirollResult
tra le parentesi()
. Aggiungi le parentesi graffe{}
con un po' di spazio aggiuntivo, come mostrato di seguito.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
}
}
Come in precedenza, verifica innanzitutto se rollResult
è uguale a luckyNumber
.
- All'interno delle parentesi graffe
{}
dell'istruzionewhen
, aggiungi un'istruzione che verifica serollResult
è uguale aluckyNumber
e, in caso affermativo, stampa il messaggio vincente. La dichiarazione ha il seguente aspetto:
luckyNumber -> println("You win!")
Ciò significa che:
- Per prima cosa inserisci il valore che stai confrontando con
rollResult
. Corrisponde aluckyNumber
. - Segui con una freccia (
->
). - Poi aggiungi l'azione da eseguire in caso di corrispondenza.
Leggi questa frase come "Se rollResult
è luckyNumber
, stampa il messaggio "You win!"
".
Il codice main()
ha questo aspetto.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
luckyNumber -> println("You win!")
}
}
- Utilizza lo stesso pattern per aggiungere righe e messaggi per i possibili tiri da 1 a 6, come mostrato di seguito. La funzione
main()
completata dovrebbe avere il seguente aspetto.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
luckyNumber -> println("You won!")
1 -> println("So sorry! You rolled a 1. Try again!")
2 -> println("Sadly, you rolled a 2. Try again!")
3 -> println("Unfortunately, you rolled a 3. Try again!")
4 -> println("No luck! You rolled a 4. Try again!")
5 -> println("Don't cry! You rolled a 5. Try again!")
6 -> println("Apologies! you rolled a 6. Try again!")
}
}
- Esegui il programma. L'output non cambia, ma il codice è molto più compatto e facile da leggere.
Complimenti! Hai imparato due modi per stampare i messaggi a seconda di una condizione. Si tratta di uno strumento potente per scrivere programmi interessanti.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
luckyNumber -> println("You won!")
1 -> println("So sorry! You rolled a 1. Try again!")
2 -> println("Sadly, you rolled a 2. Try again!")
3 -> println("Unfortunately, you rolled a 3. Try again!")
4 -> println("No luck! You rolled a 4. Try again!")
5 -> println("Don't cry! You rolled a 5. Try again!")
6 -> println("Apologies! you rolled a 6. Try again!")
}
}
class Dice(val numSides: Int) {
fun roll(): Int {
return (1..numSides).random()
}
}
- Utilizza un'istruzione
if
per impostare una condizione per l'esecuzione di alcune istruzioni. Ad esempio, se l'utente tira il numero fortunato, stampa un messaggio di vincita. - Il tipo di dati
Boolean
ha valoritrue
efalse
e può essere utilizzato per il processo decisionale. - Confronta i valori utilizzando operatori come maggiore di (
>
), minore di (<
) e uguale a (==
). - Utilizza una catena di istruzioni
else if
per impostare più condizioni. Ad esempio, stampa un messaggio diverso per ogni possibile tiro di dado. - Utilizza un'istruzione
else
alla fine di una catena di condizioni per rilevare i casi che potrebbero non essere coperti in modo esplicito. Se copri i casi per i dadi a 6 facce, un'istruzioneelse
rileverebbe i numeri 7 e 8 tirati con un dado a 8 facce. - Utilizza un'istruzione
when
come forma compatta di esecuzione del codice in base al confronto di un valore.
Procedi nel seguente modo:
- Modifica
myFirstDice
in modo che abbia 8 lati ed esegui il codice. Che cosa succede?
Suggerimento:quando aumenti il numero di lati, l'istruzione when
non copre più tutti i casi, quindi per i casi non coperti non viene stampato nulla.
- Correggi l'istruzione
when
in modo che tenga conto di tutti gli 8 lati. Puoi farlo aggiungendo casi per i numeri aggiuntivi. Sfida:anziché aggiungere un nuovo caso per ogni numero, utilizza un'istruzioneelse
per rilevare tutti i casi non coperti esplicitamente.
Suggerimento:puoi aggiungere altre cover per coprire più lati. Questo è un buon modo per farlo, se vuoi un messaggio diverso per ogni numero che può essere estratto. In alternativa, puoi utilizzare un'istruzione else
e stampare lo stesso messaggio per tutti i lati superiori a 6 coperti dal codice attuale.
- Modifica
myFirstDice
in modo che abbia solo 4 lati. Che cosa succede?
Suggerimento : la modifica del numero di lati del dado a un valore inferiore a quello coperto dall'istruzione when
non ha effetti evidenti, poiché tutti i casi che possono verificarsi sono coperti.