#!/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