In diesem Kotlin-Codelab erstellen Sie ein weiteres Würfelspiel, Lucky Dice Roll, bei dem Sie versuchen, eine Glückszahl zu würfeln. Ihr Programm legt eine Glückszahl fest und würfelt. Anschließend wird der Wurf mit der Glückszahl verglichen und eine entsprechende Meldung ausgegeben. Dazu lernen Sie, wie Sie Werte vergleichen und verschiedene Entscheidungen in Ihrem Kotlin-Programm treffen.
Damit Sie sich auf die Programmierkonzepte konzentrieren können, ohne sich um die Benutzeroberfläche der App kümmern zu müssen, verwenden Sie das browserbasierte Kotlin-Programmiertool und geben Ihre Ergebnisse in der Konsole aus.
Vorbereitung
- Code in https://try.kotlinlang.org/ öffnen, bearbeiten und ausführen
- Ein Kotlin-Programm erstellen und ausführen, das Variablen und Funktionen mit Argumenten sowie Klassen mit Methoden verwendet und ein Ergebnis in der Konsole ausgibt.
Lerninhalte
if
- undelse
-Anweisungen verwenden- Vergleich von Werten mit Operatoren wie „größer als“ (
>
), „kleiner als“ (<
) und „gleich“ (==
). - So verwenden Sie
when
-Anweisungen, um eine Option basierend auf einem bestimmten Wert auszuwählen. - Was der Datentyp
Boolean
ist und wie Sie seine Wertetrue
undfalse
für die Entscheidungsfindung verwenden.
Aufgaben
- Ein Kotlin-basiertes Würfelspiel namens „Lucky Dice Roll“, in dem Sie eine Glückszahl angeben können. Ein Spieler gewinnt, wenn er die Glückszahl würfelt.
Voraussetzungen
- Einen Computer mit Internetverbindung.
Ihr Programm „Lucky Dice Roller“ muss ermitteln, ob der Nutzer eine Glückszahl gewürfelt hat und eine Glückwunschnachricht erhält oder stattdessen eine Nachricht, in der er aufgefordert wird, es noch einmal zu versuchen.
Als App-Entwickler müssen Sie entscheiden, wie sich die App verhalten soll, und verschiedene Ergebnisse für Ihre Nutzer erstellen.
Wenn Sie eine Shopping-App entwickeln, können Sie je nach den vom Nutzer ausgewählten Versandoptionen unterschiedliche Bildschirme anzeigen. Bei einem Quizspiel würden Sie je nachdem, ob die Antwort des Spielers richtig ist, unterschiedliche Bildschirme anzeigen. Je nach App kann es viele mögliche Ergebnisse geben, die Sie in Ihrem Code berücksichtigen müssen.
In Ihrem Programm „Lucky Dice Roller“ sollte die App verschiedene Fälle abdecken, z. B.:
- Wenn die gewürfelte Zahl die Glückszahl ist, soll eine Glückwunschmeldung angezeigt werden.
- Andernfalls , wenn der Würfelwurf nicht die Glückszahl ist, wird eine Meldung angezeigt, dass der Nutzer es noch einmal versuchen soll.
Um diese Logik in Ihren Code einzufügen, verwenden Sie spezielle Kotlin-Schlüsselwörter wie if
, else
und when
.
Sehen wir uns einige Beispiele an.
Mit einer if
-Anweisung eine Bedingung einrichten, die erfüllt ist
- Sehen Sie sich den folgenden Code an. Kannst du erraten, was die Ausgabe sein wird?
fun main() {
val num = 5
if (num > 4) {
println("The variable is greater than 4")
}
}
- Kopieren Sie den Code, fügen Sie ihn in den Kotlin-Programmeditor ein und führen Sie das Programm aus, um die Ausgabe zu sehen.
The variable is greater than 4
Der Entscheidungsprozess für dieses Programm sieht so aus:
- Erstellen Sie eine Variable
num
und legen Sie sie auf5.
fest. - Wenn
num
größer (>
) als 4,
ist, gib"The variable is greater than 4"
aus. - In allen anderen Situationen müssen Sie nichts tun.
Im obigen Beispiel ist num
auf 5 gesetzt. Mit der Anweisung if
wird verglichen, ob die Variable größer als 4 ist. Da das zutrifft, führt das System als Nächstes die Anweisungen in den geschweiften Klammern aus und gibt die Meldung aus.
Beachten Sie das allgemeine Format für die if
-Anweisung:
- Beginnen Sie mit dem Keyword
if
. - Setzen Sie zwei Klammern dahinter:
()
. In die Klammern kommt die Bedingung. Die Bedingung kann alles sein, wastrue
oderfalse
sein kann. Beispielsweise, ob eine Zahl größer als eine andere ist. - Fügen Sie zwei geschweifte Klammern
{}
hinzu. In die geschweiften Klammern setzen Sie den Code, der ausgeführt werden soll, wenn die Bedingungtrue
ist.
if (condition-is-true) { execute-this-code }
Verwenden Sie eine if
-Anweisung, um eine Bedingung einzurichten, die nicht erfüllt ist.
- Ändern Sie den Wert von
num
in 3, wie unten dargestellt. Was erwartest du, wenn du diesen Code ausführst?
fun main() {
val num = 3
if (num > 4) {
println("The variable is greater than 4")
}
}
- Kopieren Sie den Code, fügen Sie ihn in den Kotlin-Programmeditor ein und führen Sie das Programm aus, um die Ausgabe zu sehen.
Wenn num
auf 3 gesetzt ist, wird nichts ausgegeben, da der Wert von num
kleiner als 4 ist. Die Bedingung, dass num
größer als 4 sein muss, ist also false
. Der Code zwischen den geschweiften Klammern wird nicht ausgeführt und es wird nichts ausgegeben.
Mit else
eine Alternative für fehlgeschlagene Bedingungen erstellen
Anstatt nichts zu tun, können Sie Ihren Nutzern eine Alternative anbieten, wenn eine Bedingung nicht erfüllt ist. Genau wie bei regulärer Sprache können Sie das mit einer else
-Anweisung tun.
- Fügen Sie eine
else
-Anweisung hinzu, um eine Meldung auszugeben, wennnum
nicht größer als 4 ist, wie unten dargestellt. Was erwartest du, wenn du diesen Code ausführst?
fun main() {
val num = 3
if (num > 4) {
println("The variable is greater than 4")
} else {
println("The variable is less than 4")
}
}
- Kopieren Sie den Code, fügen Sie ihn in den Kotlin-Programmeditor ein und führen Sie das Programm aus, um die Ausgabe zu sehen.
The variable is less than 4
- Wenn
num
den Wert 3 hat, wird die Meldung"The variable is less than 4"
ausgegeben, die mit derelse
-Anweisung verknüpft ist, danum
nicht größer als 4 ist . - Ändern Sie
num
in 5 und führen Sie das Programm noch einmal aus. Jetzt ist es wahr, dassnum
größer als 4 ist, und das Programm gibt „The variable is greater than 4
“ aus. - Ändern Sie
num
in 4 und führen Sie das Programm aus. 4 ist nicht größer als 4. Das Programm gibt also „The variable is less than 4
“ aus.
„The variable is less than 4
“ ist zwar die richtige Ausgabe für die von Ihnen im Code festgelegten Bedingungen, die ausgegebene Anweisung ist jedoch nicht korrekt, da 4 nicht kleiner als 4 ist. Sie können eine weitere Bedingung hinzufügen, die prüft, ob num
genau 4 ist, und eine korrekte Anweisung ausgibt, wenn diese Bedingung erfüllt ist.
Mit der Kombination else
+ if
können Sie alternative Bedingungen hinzufügen.
Sie können mehrere Bedingungen haben. So können Sie in Ihrem Beispiel alle Möglichkeiten für num
abdecken:
- Wenn
num
größer als 4 ist, gib „The variable is greater than 4
“ aus. - Andernfalls, wenn
num
gleich 4 ist, gib"The variable is equal to 4"
aus. - Andernfalls gib
"The variable is less than 4"
aus.
Diese werden in der if-else-Anweisung als unterschiedliche Fälle bezeichnet. Es sind drei Fälle aufgeführt.
Der aktualisierte Code sieht so aus:
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")
}
}
Beachten Sie die folgenden Änderungen:
- Der Wert von
num
ist jetzt auf 4 festgelegt, sodass Sie die neue Bedingung testen können. - Zwischen den ursprünglichen
if
- undelse
-Anweisungen befindet sich eine neueelse if
-Anweisung für den Fall, in demnum
genau 4 ist.
- Kopieren Sie den obigen Code, fügen Sie ihn in den Kotlin-Programmeditor ein und führen Sie das Programm aus, um die Ausgabe zu sehen.
The variable is equal to 4
- Experimentieren Sie mit verschiedenen Werten für
num
und sehen Sie, wie sich das auf die Ausgabe auswirkt. Ändern Sienum
in 2 und 6, damit jede der Bedingungentrue
wird.
Kontrollfluss
Wenn Sie sich die oben genannten if-else-Anweisungen ansehen, wird der Code entsprechend den Bedingungen ausgeführt. Die Art und Weise, wie Sie die Ausführung mit diesen Bedingungen steuern, wird als „Kontrollfluss“ des Programms bezeichnet.
- Angenommen, Sie würfeln eine 3.
num
Das Programm prüft die erste Bedingung (num > 4). Das ist falsch, also wird die nächste Bedingung (num == 4) geprüft, die ebenfalls falsch ist. Anschließend wird der Code der else-Anweisung ausgeführt, was die letzte Option ist. - Wenn die gewürfelte Zahl 6 ist, ist die erste Bedingung (num > 4) erfüllt. Das Programm gibt die Meldung
"The variable is greater than 4"
aus. Da diese Bedingung zutrifft, muss der Rest nicht geprüft werden. Die if-else-Anweisung ist abgeschlossen. - Mit einer Kombination aus „else“ und „if“ können Sie alternative Bedingungen hinzufügen.
In diesem Abschnitt aktualisieren Sie das Programm „Dice Roller“ (Würfel) anhand der Informationen aus der vorherigen Aufgabe, um zu prüfen, ob Sie eine voreingestellte Glückszahl gewürfelt haben. Wenn ja, hast du gewonnen!
Startcode einrichten
Sie starten den Lucky Dice Roller mit Code, der dem Lösungscode des vorherigen Kotlin-Programms „Dice Roller“ ähnelt. Sie können die main()
-Funktion in Ihrem vorherigen Code entsprechend bearbeiten oder den Code unten kopieren und einfügen, um loszulegen.
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()
}
}
Prüfen, ob die Glückszahl gezogen wurde
Erstelle zuerst eine Glückszahl und vergleiche dann den Würfelwurf mit dieser Zahl.
.
- Löschen Sie in
main()
die Anweisungprintln()
. - Fügen Sie in
main()
eineval
mit dem NamenluckyNumber
hinzu und legen Sie sie auf 4 fest. Ihr Code sollte so aussehen.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
}
- Fügen Sie unten eine
if
-Anweisung mit einer Bedingung in den Klammern()
hinzu, die prüft, obrollResult
gleich (==
)luckyNumber
ist. Lassen Sie etwas Platz zwischen den geschweiften Klammern{}
, damit Sie weiteren Code hinzufügen können.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
}
}
- Fügen Sie in die geschweiften Klammern
{}
eineprintln
-Anweisung ein, um"You win!"
auszugeben.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
if (rollResult == luckyNumber) {
println("You win!")
}
}
- Führen Sie das Programm aus. Möglicherweise müssen Sie den Befehl mehrmals ausführen, bis Sie Glück haben und die Gewinnbenachrichtigung in der Ausgabe sehen.
You win!
Antworten, wenn die Glückszahl nicht gewürfelt wurde
Wenn der Nutzer nicht gewonnen hat, erhält er kein Feedback vom Programm. Er könnte sich dann fragen, ob das Programm nicht funktioniert. Es hat sich bewährt, immer eine Antwort zu geben, wenn der Nutzer etwas tut. Im Programm „Lucky Dice Roller“ können Sie den Nutzern mit einer else
-Anweisung mitteilen, dass sie nicht gewonnen haben.
- Fügen Sie eine
else
-Anweisung hinzu, um"You didn't win, try again!"
auszugeben.
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!")
}
}
- Das Programm wird ausgeführt und Ihre Nutzer werden immer benachrichtigt, unabhängig vom Ergebnis.
An diesem Punkt wissen die Nutzer, ob sie gewonnen haben oder nicht, aber nicht warum. Geben Sie Nutzern immer Informationen, damit sie das Ergebnis ihrer Aktionen nachvollziehen können. Stellen Sie sich vor, Ihr Programm wäre ein Kreditantrag. „Sie wurden nicht genehmigt, weil Ihre Bonität schlecht ist“ ist viel informativer als „Leider kein Darlehen für Sie. Versuchen Sie es noch einmal.“ Bei Lucky Dice Roller können Sie Nutzern für jeden Wurf, bei dem sie verloren haben, eine andere informative Nachricht anzeigen. Verwenden Sie dazu mehrere else if
-Anweisungen.
- Fügen Sie
else if
-Anweisungen hinzu, um für jeden Roll eine andere Nachricht auszugeben. Sehen Sie sich bei Bedarf das Format an, das Sie in der vorherigen Aufgabe gelernt haben.
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!")
}
}
Im obigen Code
- Prüfen Sie, ob
rollResult
dieluckyNumber
ist. - Wenn
rollResult
luckyNumber
ist, gib die Gewinnbenachrichtigung aus. - Andernfalls prüfen Sie, ob
rollResult
= 1 ist. Wenn ja, geben Sie eine Meldung aus, dass der Nutzer es noch einmal versuchen soll. - Andernfalls prüfen Sie, ob
rollResult
= 2 ist. Wenn ja, geben Sie eine andere Meldung aus, in der der Nutzer aufgefordert wird, es noch einmal zu versuchen. - Andernfalls fahren Sie mit der Überprüfung der Nummer 5 fort.
- Wenn die Zahl nicht zwischen 1 und 5 liegt, bleibt nur noch die Option 6 übrig. Daher ist kein weiterer Test mit
else if
erforderlich. Sie können diese letzte Option einfach mit der abschließendenelse
-Anweisung abfangen.
Da mehrere else if
-Fälle sehr häufig vorkommen, bietet Kotlin eine einfachere Möglichkeit, sie zu schreiben.
In der Programmierung ist es sehr üblich, viele verschiedene Ergebnisse oder Fälle zu testen. Manchmal kann die Liste der möglichen Ergebnisse sehr lang sein. Wenn Sie beispielsweise einen 12-seitigen Würfel werfen, haben Sie 11 else if
-Anweisungen zwischen dem Erfolg und dem endgültigen else
. Damit solche Anweisungen einfacher zu schreiben und zu lesen sind und Fehler vermieden werden, stellt Kotlin eine when
-Anweisung zur Verfügung.
Sie ändern Ihr Programm so, dass es eine when
-Anweisung verwendet. Eine when
-Anweisung beginnt mit dem Schlüsselwort when
, gefolgt von runden Klammern ()
. In die Klammern kommt der zu testende Wert. Danach folgen geschweifte Klammern {}
für den Code, der für verschiedene Bedingungen ausgeführt werden soll.
- Wählen Sie in Ihrem Programm in
main()
den Code von der erstenif
-Anweisung bis zur geschweiften Klammer}
aus, die die letzteelse
-Anweisung schließt, und löschen Sie ihn.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
}
- Erstellen Sie in
main()
unter der Deklaration vonluckyNumber
einewhen
-Anweisung. Dawhen
mit dem zusammengefassten Ergebnis verglichen werden muss, setzen SierollResult
zwischen die Klammern()
. Fügen Sie geschweifte Klammern{}
mit etwas zusätzlichem Abstand ein, wie unten dargestellt.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
}
}
Prüfen Sie wie bisher zuerst, ob rollResult
mit luckyNumber
übereinstimmt.
- Fügen Sie in die geschweiften Klammern
{}
derwhen
-Anweisung eine Anweisung ein, dierollResult
mitluckyNumber
vergleicht. Wenn sie identisch sind, wird die Gewinnerbenachrichtigung ausgegeben. Die Anweisung sieht so aus:
luckyNumber -> println("You win!")
Das bedeutet:
- Zuerst geben Sie den Wert ein, den Sie mit
rollResult
vergleichen möchten. Das sindluckyNumber
. - Fügen Sie dann einen Pfeil (
->
) ein. - Fügen Sie dann die Aktion hinzu, die ausgeführt werden soll, wenn eine Übereinstimmung vorliegt.
Das bedeutet: „Wenn rollResult
gleich luckyNumber
ist, dann gib die Meldung "You win!"
aus.“
Ihr main()
-Code sieht so aus.
fun main() {
val myFirstDice = Dice(6)
val rollResult = myFirstDice.roll()
val luckyNumber = 4
when (rollResult) {
luckyNumber -> println("You win!")
}
}
- Fügen Sie mit demselben Muster Zeilen und Nachrichten für die möglichen Würfelergebnisse 1 bis 6 hinzu, wie unten dargestellt. Die fertige
main()
-Funktion sollte so aussehen.
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!")
}
}
- Führen Sie das Programm aus. Die Ausgabe ist identisch, aber Ihr Code ist viel kompakter und leichter zu lesen.
Glückwunsch! Sie haben zwei Möglichkeiten kennengelernt, Nachrichten abhängig von einer Bedingung auszugeben. Das ist ein leistungsstarkes Tool zum Schreiben interessanter Programme.
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()
}
}
- Mit einer
if
-Anweisung können Sie eine Bedingung für die Ausführung bestimmter Anweisungen festlegen. Wenn der Nutzer beispielsweise die Glückszahl würfelt, wird eine Gewinnbenachrichtigung ausgegeben. - Der Datentyp
Boolean
hat die Wertetrue
undfalse
und kann für die Entscheidungsfindung verwendet werden. - Vergleichen Sie Werte mit Operatoren wie „größer als“ (
>
), „kleiner als“ (<
) und „gleich“ (==
). - Verwenden Sie eine Kette von
else if
-Anweisungen, um mehrere Bedingungen festzulegen. Geben Sie beispielsweise für jeden möglichen Würfelwurf eine andere Nachricht aus. - Verwenden Sie am Ende einer Kette von Bedingungen eine
else
-Anweisung, um alle Fälle abzudecken, die möglicherweise nicht explizit behandelt werden. Wenn Sie die Fälle für sechsseitige Würfel abdecken, würde eineelse
-Anweisung die mit einem achtseitigen Würfel gewürfelten Zahlen 7 und 8 erfassen. - Verwenden Sie eine
when
-Anweisung als kompakte Form der Codeausführung basierend auf dem Vergleich eines Werts.
Gehen Sie so vor:
- Ändern Sie
myFirstDice
so, dass es 8 Seiten hat, und führen Sie den Code aus. Was ändert sich?
Hinweis:Wenn Sie die Anzahl der Seiten erhöhen, deckt die when
-Anweisung nicht mehr alle Fälle ab. Für nicht abgedeckte Fälle wird nichts ausgegeben.
- Korrigieren Sie die
when
-Anweisung, damit alle 8 Seiten berücksichtigt werden. Dazu können Sie Fälle für die zusätzlichen Zahlen hinzufügen. Herausforderung:Anstatt für jede Zahl einen neuen Fall hinzuzufügen, verwenden Sie eineelse
-Anweisung, um alle Fälle abzudecken, die nicht explizit behandelt werden.
Hinweis:Sie können weitere Fälle hinzufügen, um mehr Seiten abzudecken. Das ist eine gute Methode, wenn Sie für jede Zahl, die gewürfelt werden kann, eine andere Nachricht wünschen. Alternativ können Sie eine else
-Anweisung verwenden und dieselbe Meldung für alle Seiten ausgeben, die größer als die sechs Seiten sind, die vom aktuellen Code abgedeckt werden.
- Ändere
myFirstDice
so, dass es nur 4 Seiten hat. Was ändert sich?
Hinweis : Wenn Sie die Anzahl der Seiten des Würfels auf einen Wert unterhalb des in der when
-Anweisung angegebenen Werts ändern, hat das keine spürbaren Auswirkungen, da alle möglichen Fälle abgedeckt sind.