Karten per Code
Karten-Objekte im Hauptprogramm nutzen
Wir wollen nun Karten-Objekte nicht mehr per Mausklick erzeugen, sondern im Hauptprogramm per Code. Hier findest du einige Vorschläge für ein Hauptprogramm. Manche davon lassen sich ausführen, andere führen zu Fehlern.
// Programm 1
var karte = Karte("Herz", "A")
karte.druckeKarte()
// Programm 2
var meinekarte = Karte("Pik", "10")
meinekarte.druckeKarte()
// Programm 3
var karte = Spielkarte("Karo", "K")
karte.druckeKarte()
// Programm 4
var karte = Karte("Kreuz", "4")
karte.druckeKarte()
karte = Karte("Herz", "B")
karte.druckeKarte()
// Programm 5
val karte = Karte("Kreuz", "4")
karte.druckeKarte()
// Programm 6
val karte = Karte("Kreuz", "4")
karte.druckeKarte()
karte = Karte("Herz", "B")
karte.druckeKarte()
// Programm 7
var karte = Karte(Herz, 2)
karte.druckeKarte()
// Programm 8
Karte("Karo", "D")
druckeKarte()
// Programm 9
var karte = Karte("Pik", 5)
val wert = karte.berechneWert()
println(wert)
// Programm 10
var karte = Karte("Pik", "5")
println(karte.berechneWert())
// Programm 11
var karte = Karte("Pik", "5")
var rang = karte.rang
println(rang)
println(karte.farbe)
Um Platz zu sparen ist in den obigen Programmen nur der Teil
innerhalb der main-Funktion angegeben.
Für das erste Beispiel sähe das komplette Hauptprogramm dann so aus:
fun main() {
// Programm 1
var karte = Karte("Herz", "A")
karte.druckeKarte()
}
Kommentare in Kotlin beginnen mit den Zeichen //.
Alles, was hinter diesen Zeichen steht, wird beim Ausführen des Programms ignoriert.
Aufgabe
Probiere die verschiedenen Hauptprogramme aus.
Beschreibe deren Wirkung und erkläre die auftretenden Fehler.
Gehe dabei insbesondere auf folgende Fragen ein:
- Wie ruft man in Kotlin einen Konstruktor auf?
- Wie greift man auf Attribute und Methoden eines Objekts zu?
- Was bedeuten
valundvar? Was sind die Gemeinsamkeiten und Unterschiede? - Welche Wirkung hat die Anweisung
println()im Code? Vergleiche auch mit der Anweisungprint().
Alternativ zur Ausführung in BlueJ kannst du auch die Online-Version zum Testen der Programme nutzen.
class Karte(
farbe: String, // "Herz", "Karo", "Pik", "Kreuz" (ausgeschrieben, Groß/Kleinschreibung egal)
rang: String // "2"–"10", "B"/"Bube", "D"/"Dame", "K"/"Koenig", "A"/"Ass"
) {
val rang: String = kuerzeRang(rang)
val farbe: String = normalisiereFarbe(farbe)
fun berechneWert(): Int {
return when (rang) {
"A" -> 11
"B", "D", "K" -> 10
else -> rang.toInt()
}
}
fun druckeKarte() {
val symbol = when (farbe) {
"herz" -> "♥"
"karo" -> "♦"
"pik" -> "♠"
"kreuz" -> "♣"
else -> "?"
}
val right = rang.padStart(2, ' ')
val left = rang.padEnd(2, ' ')
println("┌─────┐")
println("│$left │")
println("│ $symbol │")
println("│ $right│")
println("└─────┘")
}
private fun kuerzeRang(roherRang: String): String {
val normalisiert = roherRang.trim().lowercase()
return when (normalisiert) {
"a", "ass" -> "A"
"k", "koenig", "könig" -> "K"
"d", "dame" -> "D"
"b", "bube" -> "B"
else -> {
val zahl = normalisiert.toIntOrNull()
?: throw IllegalArgumentException("Unbekannter Rang: $roherRang")
if (zahl in 2..10) zahl.toString()
else throw IllegalArgumentException("Rang ausserhalb des Bereichs: $roherRang")
}
}
}
private fun normalisiereFarbe(roheFarbe: String): String {
return when (val normalisiert = roheFarbe.trim().lowercase()) {
"herz", "karo", "pik", "kreuz" -> normalisiert
else -> throw IllegalArgumentException("Unbekannte Farbe: $roheFarbe")
}
}
}
fun main() {
// Programm 1
var karte = Karte("Herz", "A")
karte.druckeKarte()
}