Instructions
Requirements and Specifications
Source Code
from operator import ge
import random
import sys
import csv
from collections import namedtuple
def get_card():
'''This function returns a random value between 1 and 13 '''
return random.randint(1, 13)
def score(hand):
''' This function takes a list of numbers and results in a tuple
where the 1st element is the total value of the blackjack hand.
The second element is the number of soft aces present (if any)
'''
#Begin with 0 as our total - no cards have been dealt out
Score = namedtuple('Score', 'total soft_ace_count')
total = 0
soft_ace_count = 0
#accounts if there are aces present
for card in hand:
if card == 1:
soft_ace_count += 1
total += 11
#For the jacks(11), queens(12), and kings(13) having a value of 10
elif card > 10:
total += 10
else:
total += card
#If aces are drawn can be "soft"
#Ex:value of the Ace can be 1 or 11
while total > 21 and soft_ace_count > 0:
total -= 10
soft_ace_count -= 1
return Score(total, soft_ace_count)
def stand(stand_on_value, stand_on_soft, cards):
''' The function will return a Boolean value indicating
whether the player will stand on
a “soft” hand or just on a “hard” hand,
and a list of integers representing the cards in a Blackjack hand.
True IF the player decides to STAND on their hand.
Otherwise, the function will return False IF the player decides to HIT
'''
Stand = namedtuple('Stand','stand total')
total, soft_ace_count = score(cards)
if total >= stand_on_value:
if soft_ace_count > 0 and total == stand_on_value:
if stand_on_soft == True:
return Stand(True, total) #stand
else:
return Stand(False, total) #hit
else: #total >= stand value and no soft ace
return Stand(True, total) #stand
else:
return Stand(False, total) #hit
def play_hand(stand_on_value, stand_on_soft):
bust_count = 0
; hand = [get_card(), get_card()] #im getting 2 cards!
getscore = score(hand)
while score(hand)[0] < 21:
if stand(stand_on_value, stand_on_soft, hand)[0] == True:
# "STAND"
return score(hand)
else:
hand.append(get_card()) # add a card
if score(hand)[0] > 21:
# "BUST"
bust_count += 1
return score(hand)
elif score(hand)[0] == 21:
# "WIN"
return score(hand)
else:
# "Take it Back Now Y'all"
continue
return score(hand)
def main():
# blackjack.py <num-simulations> <stand-on-value (1-20)> <'soft'|'hard'>
#process inputs
length_of_argv = len(sys.argv)
if length_of_argv < 2:
raise ValueError()
num_simulations = int(sys.argv[1])
if num_simulations < 1:
raise ValueError()
stand_on_value = 21
firmness = 'soft'
if firmness == 'soft':
stand_on_soft = True
elif firmness == 'hard':
stand_on_soft = False
else:
raise ValueError()
#run simulations
totalbust = 0
for simnum in range(num_simulations):
result = simulate(stand_on_value,stand_on_soft)
if not result:
totalbust += 1
#calculate final output bust percentage & print
percentagebust = totalbust / num_simulations
print(percentagebust)
def simulate(stand_on_value,stand_on_soft):
hand = [get_card(), get_card()] #im getting 2 cards!
"""while not stand(stand_on_value, stand_on_soft, hand): #while hit
hand.append(get_card()) #hit
if score(hand)[0] > 21: #checking results
return False #no bueno
else:
return True #you good"""
score = play_hand(stand_on_value, stand_on_soft)
return score[0] <= 21
if __name__ == '__main__':
main()