s n h m r u

Minimallogo des digitalen Schulbuchs inf-schule.de. Schriftzug in Zustandsübergangsdiagramm eines endlichen Automaten.

s n h m r u
i

Stapel per Code

Stapel-Objekte im Hauptprogramm nutzen

Genau wie bei den Karten-Objekten ist es auch bei Stapel-Objekten oft praktischer, diese mit Kotlin-Code zu erzeugen und zu verwenden, anstatt sie per Mausklick zu erstellen.

Im Klassendiagramm findest du das Attribut, den Konstruktor und die wichtigsten Methoden der Klasse Stapel auf einen Blick:

Klassendiagramm der Klasse Stapel

Das Attribut karten speichert eine Liste von Karten. Der genaue Datentyp ist hier nicht relevant, da du ohnehin nur die Methoden der Klasse benutzt.

Ein einfaches Hauptprogramm könnte so aussehen:

fun main() {
    val stapel = Stapel()
    stapel.erzeugeBlaetter(1)
}

Aufgabe 1

Mache dir mit Hilfe der per Mausklick erstellten Stapel-Objekte die Methoden der Klasse Stapel noch einmal bewusst. Ergänze das Programm so, dass ...
  • ... der Stapel gemischt wird
  • ... die Zahl der Karten im Stapel ausgegeben wird
  • ... ein paar Karten gezogen und angezeigt werden
  • ... die verbleibende Zahl der Karten im Stapel ausgegeben wird
Hilfe

Bringe die zusätzlichen Zeilen für eine mögliche Lösung in die richtige Reihenfolge. Eine Zeile gehört nicht zum geforderten Ablauf.

fun main() {                               §§fest
    val stapel = Stapel()                  §§fest
    stapel.erzeugeBlaetter(1)              §§fest
    stapel.mischen()
    println(stapel.zaehleKarten())
    stapel.zieheUndZeige()
    stapel.zieheUndZeige()
    println(stapel.zaehleKarten())
    stapel.zeigeObersteKarte()              §§extra
}                                          §§fest

Du kannst dein Programm alternativ zu BlueJ auch hier online testen:

class Stapel {

    private val karten: MutableList<Karte> = mutableListOf()
   
    fun zaehleKarten(): Int = karten.size
   
    fun erzeugeBlaetter(anzahlBlaetter: Int) {
        val raenge = listOf(
            "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "B", "D", "K", "A"
        )
        val farben = listOf("Herz", "Karo", "Pik", "Kreuz")

        repeat(anzahlBlaetter) {
            for (farbe in farben) {
                for (rang in raenge) {
                    karten.add(Karte(farbe, rang))
                }
            }
        }
    }

    fun mischen() = karten.shuffle()

    private fun zieheKarte(): Karte? {
        if (karten.isEmpty())
            return null
        else
            return karten.removeAt(0)
    }
    
    fun zieheUndZeige() {
        if (karten.isEmpty()) {
            println("Es ist keine Karte mehr übrig")
        }
        else {
            zeigeObersteKarte()
            zieheKarte()
        }
    }

    fun zeigeObersteKarte() {
        if (karten.isEmpty()) 
            println("Stapel ist leer")
        else
            karten.first().druckeKarte()
    }

    fun druckeAlle() {
        for (karte in karten) {
            karte.druckeKarte()
        }
    }
}


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() {
    val stapel = Stapel()
    stapel.erzeugeBlaetter(1)
}

Suche

v
100.123.1.1.6 Stapel per Code
Kopieren durch Anklicken

Rückmeldung geben