Bedingungen in Kotlin – Teil 1

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- und else-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 Werte true und false 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

  1. 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")
   }
}
  1. 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:

  1. Erstellen Sie eine Variable num und legen Sie sie auf 5. fest.
  2. Wenn num größer (>) als 4, ist, gib "The variable is greater than 4" aus.
  3. 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, was true oder false 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 Bedingung true ist.
if (condition-is-true) {
    execute-this-code
}

Verwenden Sie eine if-Anweisung, um eine Bedingung einzurichten, die nicht erfüllt ist.

  1. Ä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")
   }
}
  1. 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.

  1. Fügen Sie eine else-Anweisung hinzu, um eine Meldung auszugeben, wenn num 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")
   }
}
  1. 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
  1. Wenn num den Wert 3 hat, wird die Meldung "The variable is less than 4" ausgegeben, die mit der else-Anweisung verknüpft ist, da num nicht größer als 4 ist .
  2. Ändern Sie num in 5 und führen Sie das Programm noch einmal aus. Jetzt ist es wahr, dass num größer als 4 ist, und das Programm gibt „The variable is greater than 4“ aus.
  3. Ä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- und else-Anweisungen befindet sich eine neue else if-Anweisung für den Fall, in dem num genau 4 ist.
  1. 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
  1. Experimentieren Sie mit verschiedenen Werten für num und sehen Sie, wie sich das auf die Ausgabe auswirkt. Ändern Sie num in 2 und 6, damit jede der Bedingungen true 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.

.

  1. Löschen Sie in main() die Anweisung println().
  2. Fügen Sie in main() eine val mit dem Namen luckyNumber 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
}
  1. Fügen Sie unten eine if-Anweisung mit einer Bedingung in den Klammern () hinzu, die prüft, ob rollResult 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) {

    }
}
  1. Fügen Sie in die geschweiften Klammern {} eine println-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!")
    }
}
  1. 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.

  1. 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!")
   }
}
  1. 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.

  1. 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 die luckyNumber 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ßenden else-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.

  1. Wählen Sie in Ihrem Programm in main() den Code von der ersten if-Anweisung bis zur geschweiften Klammer } aus, die die letzte else-Anweisung schließt, und löschen Sie ihn.
fun main() {
   val myFirstDice = Dice(6)
   val rollResult = myFirstDice.roll()
   val luckyNumber = 4
}
  1. Erstellen Sie in main() unter der Deklaration von luckyNumber eine when-Anweisung. Da when mit dem zusammengefassten Ergebnis verglichen werden muss, setzen Sie rollResult 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.

  1. Fügen Sie in die geschweiften Klammern {} der when-Anweisung eine Anweisung ein, die rollResult mit luckyNumber 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 sind luckyNumber.
  • 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!")
   }
}
  1. 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!")
   }
}
  1. 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 Werte true und false 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 eine else-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:

  1. Ä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.

  1. 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 eine else-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.

  1. Ä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.