diff --git "a/\303\234bungen/Woche-8/Black-Jack-Kommentare.md" "b/\303\234bungen/Woche-8/Black-Jack-Kommentare.md" new file mode 100644 index 0000000000000000000000000000000000000000..937462d71fb57db4287ebbb9d06757b3731da880 --- /dev/null +++ "b/\303\234bungen/Woche-8/Black-Jack-Kommentare.md" @@ -0,0 +1,131 @@ + +# Black Jack Bash-Skript + +Diese Markdown-Datei enthält den Black Jack Bash-Skript-Code mit Kommentaren an den wichtigsten Stellen, um die Funktionsweise zu erklären. + +--- + +```bash +#!/bin/bash + +# Definiere das Kartendeck als assoziatives Array: +# Schlüssel = Name der Karte, Wert = Punktzahl. +declare -A deck=( + ["Zwei"]=2 ["Drei"]=3 ["Vier"]=4 ["Fünf"]=5 ["Sechs"]=6 + ["Sieben"]=7 ["Acht"]=8 ["Neun"]=9 ["Zehn"]=10 + ["Bube"]=10 ["Dame"]=10 ["König"]=10 ["Ass"]=11 +) + +# Initialisierung der Startwerte: +# choice: Entscheidung des Spielers, bilanz: Startguthaben, +# player_cards und dealer_cards: Arrays für die gezogenen Karten. +choice="j" +bilanz=1000 +declare -a player_cards dealer_cards + +# Funktion zum Ziehen einer zufälligen Karte +karte_ziehen() { + local keys=(${!deck[@]}) + local random_index=$((RANDOM % ${#keys[@]})) # Zufälliger Index basierend auf der Anzahl der Karten. + local card_name=${keys[$random_index]} + echo "$card_name" +} + +# Funktion zur Aktualisierung des Punktestands +update_score() { + local -n cards=$1 + local -n score=$2 + local -i var=${deck["$3"]} + cards+=("$3") + ((score += var)) + if [[ $score -gt 21 ]]; then + # Falls der Punktestand über 21 liegt, prüfe ob ein Ass (11) vorhanden ist. + # Falls ja, wandle es in "Ass:1" um und reduziere den Punktestand um 10. + for i in "${!cards[@]}"; do + if [[ ${cards[i]} == Ass ]]; then + cards[i]="Ass:1" + ((score -= 10)) + break + fi + done + fi +} + +# Begrüßungstext +echo -e "\033[34mWillkommen zu Black Jack!\033[0m\n" + +# Hauptspielschleife +while [[ true ]]; do + # Frage den Spieler, ob er eine Runde spielen möchte. + read -p $'\033[1mMöchten Sie eine Runde spielen? j/n\033[0m ' choice + if [[ $choice != "j" ]]; then + break + fi + + # Überprüfe, ob der Spieler genügend Guthaben besitzt. + if [[ $bilanz -lt 0 ]]; then + echo -e "Leider haben Sie nicht genügend Guthaben für diese Runde." + break + fi + + # Setze Punktestände und Kartensammlungen für eine neue Runde zurück. + player_score=0 + dealer_score=0 + player_cards=() + dealer_cards=() + einsatz=0 + + echo -e "\033[34mIhr Kontozustand: $bilanz\033[0m" + # Frage den Spieler, wie viel er setzen möchte. + read -p $'\n\033[1mWie viel möchten Sie setzen?\033[0m ' einsatz + + # Falls der Einsatz den aktuellen Kontostand übersteigt, wird die Runde abgebrochen. + if [[ $einsatz -gt $bilanz ]]; then + echo -e "\n\033[31mLeider haben Sie nicht genügend Guthaben für diese Runde.\033[0m" + continue + fi + + # Spielerzug: Der Spieler kann Karten ziehen, bis er "stopp" sagt oder über 21 kommt. + while [[ player_score -lt 21 ]]; do + read -p $'\033[1mMöchten Sie eine Karte ziehen? j/n\033[0m ' choice + if [[ $choice != "j" ]]; then + break + fi + new_card=$(karte_ziehen) + update_score player_cards player_score "$new_card" + echo -e "\n\033[42mGezogene Karte: $new_card\033[0m" + echo -e "\033[3mIhr Punktestand: \033[31m$player_score\033[0m\n" + if [[ $player_score -gt 21 ]]; then + echo -e "\n\033[41mSie haben überzogen! Dealer gewinnt. :(\033[0m" + ((bilanz -= einsatz)) + exit 0 + fi + done + + # Dealer-Zug: Der Dealer zieht Karten, bis sein Punktestand mindestens 17 erreicht. + while [[ $dealer_score -lt 17 ]]; do + sleep 2 + new_card=$(karte_ziehen) + update_score dealer_cards dealer_score "$new_card" + echo -e "\n\033[35mDealer zieht: $new_card\033[0m" + echo -e "\033[3mPunktestand Dealer: \033[31m$dealer_score\033[0m\n" + done + + # Zeige die Karten und Punktestände von Spieler und Dealer an. + echo -e "\033[32mSpieler\033[0m: ${player_cards[*]} \033[3m(Punkte: $player_score)\033[0m" + echo -e "\033[35mDealer\033[0m: ${dealer_cards[*]} \033[3m(Punkte: $dealer_score)\033[0m" + + # Spielauswertung: Bestimme den Gewinner und passe den Kontostand an. + if [[ $player_score -gt 21 ]]; then + echo -e "\033[41mDealer gewinnt! :(\033[0m" + ((bilanz -= einsatz)) + elif [[ $dealer_score -gt 21 || $player_score -eq 21 && $dealer_score -lt 21 || $player_score -gt $dealer_score ]]; then + echo -e "\033[42mSpieler gewinnt! :)\033[0m" + ((bilanz += einsatz)) + elif [[ $dealer_score -eq $player_score ]]; then + echo -e "\033[46mUnentschieden! :| \033[0m" + else + echo -e "\033[41mDealer gewinnt! :(\033[0m" + ((bilanz -= einsatz)) + fi +done