mirror of
https://codeberg.org/andyscott/exercism.git
synced 2024-11-14 23:30:48 -05:00
111 lines
3.1 KiB
Python
111 lines
3.1 KiB
Python
|
"""Functions to help play and score a game of blackjack.
|
||
|
|
||
|
How to play blackjack: https://bicyclecards.com/how-to-play/blackjack/
|
||
|
"Standard" playing cards: https://en.wikipedia.org/wiki/Standard_52-card_deck
|
||
|
"""
|
||
|
|
||
|
|
||
|
def value_of_card(card):
|
||
|
"""Determine the scoring value of a card.
|
||
|
|
||
|
:param card: str - given card.
|
||
|
:return: int - value of a given card. See below for values.
|
||
|
|
||
|
1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10
|
||
|
2. 'A' (ace card) = 1
|
||
|
3. '2' - '10' = numerical value.
|
||
|
"""
|
||
|
|
||
|
res = 0
|
||
|
if card >= "J":
|
||
|
res = 10
|
||
|
elif card == "A":
|
||
|
res = 1
|
||
|
else:
|
||
|
res = int(card)
|
||
|
|
||
|
return res
|
||
|
|
||
|
|
||
|
def higher_card(card_one, card_two):
|
||
|
"""Determine which card has a higher value in the hand.
|
||
|
|
||
|
:param card_one, card_two: str - cards dealt in hand. See below for values.
|
||
|
:return: str or tuple - resulting Tuple contains both cards if they are of equal value.
|
||
|
|
||
|
1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10
|
||
|
2. 'A' (ace card) = 1
|
||
|
3. '2' - '10' = numerical value.
|
||
|
"""
|
||
|
|
||
|
card_one_val = value_of_card(card_one)
|
||
|
card_two_val = value_of_card(card_two)
|
||
|
|
||
|
if card_one_val == card_two_val:
|
||
|
return (card_one, card_two)
|
||
|
|
||
|
if card_one_val > card_two_val:
|
||
|
return card_one
|
||
|
|
||
|
return card_two
|
||
|
|
||
|
|
||
|
def value_of_ace(card_one, card_two):
|
||
|
"""Calculate the most advantageous value for the ace card.
|
||
|
|
||
|
:param card_one, card_two: str - card dealt. See below for values.
|
||
|
:return: int - either 1 or 11 value of the upcoming ace card.
|
||
|
|
||
|
1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10
|
||
|
2. 'A' (ace card) = 11 (if already in hand)
|
||
|
3. '2' - '10' = numerical value.
|
||
|
"""
|
||
|
|
||
|
if (value_of_card(card_one) + value_of_card(card_two) >= 11) or "A" in (
|
||
|
card_one,
|
||
|
card_two,
|
||
|
):
|
||
|
return 1
|
||
|
|
||
|
return 11
|
||
|
|
||
|
|
||
|
def is_blackjack(card_one, card_two):
|
||
|
"""Determine if the hand is a 'natural' or 'blackjack'.
|
||
|
|
||
|
:param card_one, card_two: str - card dealt. See below for values.
|
||
|
:return: bool - is the hand is a blackjack (two cards worth 21).
|
||
|
|
||
|
1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10
|
||
|
2. 'A' (ace card) = 11 (if already in hand)
|
||
|
3. '2' - '10' = numerical value.
|
||
|
"""
|
||
|
|
||
|
if card_one != "A" and card_two != "A":
|
||
|
return False
|
||
|
|
||
|
if card_one == "A":
|
||
|
return value_of_card(card_two) + 11 == 21
|
||
|
|
||
|
return value_of_card(card_one) + 11 == 21
|
||
|
|
||
|
|
||
|
def can_split_pairs(card_one, card_two):
|
||
|
"""Determine if a player can split their hand into two hands.
|
||
|
|
||
|
:param card_one, card_two: str - cards dealt.
|
||
|
:return: bool - can the hand be split into two pairs? (i.e. cards are of the same value).
|
||
|
"""
|
||
|
|
||
|
return value_of_card(card_one) == value_of_card(card_two)
|
||
|
|
||
|
|
||
|
def can_double_down(card_one, card_two):
|
||
|
"""Determine if a blackjack player can place a double down bet.
|
||
|
|
||
|
:param card_one, card_two: str - first and second cards in hand.
|
||
|
:return: bool - can the hand can be doubled down? (i.e. totals 9, 10 or 11 points).
|
||
|
"""
|
||
|
|
||
|
return 9 <= value_of_card(card_one) + value_of_card(card_two) <= 11
|