Загрузка данных


#!/usr/bin/env bash

draw_card() {
    local rank=$((RANDOM % 13 + 1))

    case "$rank" in
        1)  CARD="Туз"; VALUE=11 ;;
        11) CARD="Валет"; VALUE=10 ;;
        12) CARD="Дама"; VALUE=10 ;;
        13) CARD="Король"; VALUE=10 ;;
        *)  CARD="$rank"; VALUE=$rank ;;
    esac
}

total() {
    local sum=0
    local aces=0
    local value

    for value in "$@"; do
        sum=$((sum + value))
        if (( value == 11 )); then
            aces=$((aces + 1))
        fi
    done

    # Если перебрали, считаем тузы за 1 очко вместо 11.
    while (( sum > 21 && aces > 0 )); do
        sum=$((sum - 10))
        aces=$((aces - 1))
    done

    printf '%s' "$sum"
}

show_hand() {
    local name=$1
    shift
    printf '%s: ' "$name"
    printf '%s ' "$@"
    printf '\n'
}

while true; do
    player_cards=()
    player_values=()
    dealer_cards=()
    dealer_values=()

    for _ in 1 2; do
        draw_card
        player_cards+=("$CARD")
        player_values+=("$VALUE")

        draw_card
        dealer_cards+=("$CARD")
        dealer_values+=("$VALUE")
    done

    echo "=== 21 очко ==="
    show_hand "Ваши карты" "${player_cards[@]}"
    printf 'Ваши очки: %s\n' "$(total "${player_values[@]}")"
    printf 'Первая карта дилера: %s\n' "${dealer_cards[0]}"

    while (( $(total "${player_values[@]}") < 21 )); do
        read -r -p "Взять карту? (д/н): " answer

        case "$answer" in
            д|Д|да|Да|ДА|y|Y)
                draw_card
                player_cards+=("$CARD")
                player_values+=("$VALUE")
                show_hand "Ваши карты" "${player_cards[@]}"
                printf 'Ваши очки: %s\n' "$(total "${player_values[@]}")"
                ;;
            н|Н|нет|Нет|НЕТ|n|N)
                break
                ;;
            *)
                echo "Введите «д» или «н»."
                ;;
        esac
    done

    player_total=$(total "${player_values[@]}")

    if (( player_total <= 21 )); then
        while (( $(total "${dealer_values[@]}") < 17 )); do
            draw_card
            dealer_cards+=("$CARD")
            dealer_values+=("$VALUE")
        done
    fi

    dealer_total=$(total "${dealer_values[@]}")

    echo
    show_hand "Ваши карты" "${player_cards[@]}"
    printf 'Ваши очки: %s\n' "$player_total"
    show_hand "Карты дилера" "${dealer_cards[@]}"
    printf 'Очки дилера: %s\n' "$dealer_total"

    if (( player_total > 21 )); then
        echo "Перебор! Вы проиграли."
    elif (( dealer_total > 21 )); then
        echo "У дилера перебор! Вы выиграли."
    elif (( player_total > dealer_total )); then
        echo "Вы выиграли!"
    elif (( player_total < dealer_total )); then
        echo "Вы проиграли."
    else
        echo "Ничья."
    fi

    read -r -p "Сыграть ещё раз? (д/н): " again
    case "$again" in
        д|Д|да|Да|ДА|y|Y) ;;
        *) break ;;
    esac
    echo
done