Karten per Code
Karten-Objekte im Hauptprogramm nutzen
Wir wollen nun Karten-Objekte nicht mehr per Mausklick erzeugen,
sondern im Hauptprogramm per Code.
Eine Übersicht über den Aufbau der Klasse Karte gibt das
folgende Klassendiagramm:
Ein Klassendiagramm besteht hier aus drei Bereichen. Oben steht der Name der Klasse, darunter stehen die Attribute. Der untere Bereich enthält zuerst den Konstruktor und anschließend die Methoden. Bei Attributen und Parametern steht nach einem Doppelpunkt der Datentyp. Bei Methoden steht hinter der schließenden Klammer der Rückgabetyp. Gibt eine Methode keinen Wert zurück, wird kein Rückgabetyp angegeben.
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 = Karte("Herz", "A")
var meineKarte = Karte("Pik", "10")
karte.druckeKarte()
meineKarte.druckeKarte()
// Programm 2
var karte = Spielkarte("Karo", "K")
karte.druckeKarte()
// Programm 3
var karte = Karte("Kreuz", "4")
karte.druckeKarte()
karte = Karte("Herz", "B")
karte.druckeKarte()
// Programm 4
val karte: String = Karte("Kreuz", "4")
karte.druckeKarte()
karte = Karte("Herz", "B")
karte.druckeKarte()
// Programm 5
var karte = Karte(Herz, 2)
karte.druckeKarte()
// Programm 6
Karte("Karo", "D")
druckeKarte()
// Programm 7
val karte = Karte("Pik", "5")
val wert: String = karte.berechneWert()
val rang: Int = karte.rang
println(wert)
println(rang)
// Programm 8
val karte = Karte("Karo", "D")
var ergebnis = karte.berechneWert()
println(ergebnis)
ergebnis = karte.rang
println(ergebnis)
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 = Karte("Herz", "A")
var meineKarte = Karte("Pik", "10")
karte.druckeKarte()
meineKarte.druckeKarte()
}
Kommentare in Kotlin beginnen
mit den Zeichen //.
Alles, was hinter diesen Zeichen steht, wird beim Ausführen des Programms ignoriert.
Aufgabe 1
- Wie ruft man in Kotlin einen Konstruktor auf?
- Wie greift man auf Attribute und Methoden eines Objekts zu?
- Welche Namen kann man für Variablen verwenden?
- Was bedeuten
valundvar? Was sind die Gemeinsamkeiten und Unterschiede? - Welche Wirkung hat die Anweisung
println()im Code? Vergleiche auch mit der Anweisungprint(). - Kotlin kann in vielen Fällen die benutzten Datentypen automatisch ableiten. Formuliere eine Regel zur automatischen Typableitung (Type inference).
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 = Karte("Herz", "A")
var meineKarte = Karte("Pik", "10")
karte.druckeKarte()
meineKarte.druckeKarte()
}