Skip to content

Instantly share code, notes, and snippets.

@gingeleski
Last active December 15, 2016 01:35
Show Gist options
  • Select an option

  • Save gingeleski/3851d6df0fdb1cae3ab37a9f6a4613fb to your computer and use it in GitHub Desktop.

Select an option

Save gingeleski/3851d6df0fdb1cae3ab37a9f6a4613fb to your computer and use it in GitHub Desktop.
A very basic simulator for GoGo 21 / Catch-21
from random import shuffle
class Hand:
def __init__(self):
self.cards = []
self.possible_values = [0]
self.blackjacks = 0
def can_add(self, card):
if (min(self.possible_values) + min(card)) <= 21:
return True
else:
return False
def add(self, card):
self.possible_values = [i + min(card) for i in self.possible_values]
if len(card) > 1:
temp = []
for i in self.possible_values:
temp.append(i + max(card) - min(card))
for x in temp:
self.possible_values.append(x)
if 21 in self.possible_values:
self.blackjack()
def blackjack(self):
self.blackjacks += 1
self.possible_values = [0]
self.cards = []
def get_possible_values(self):
return self.possible_values
def get_blackjacks(self):
return self.blackjacks
def make_deck():
deck = []
for _ in range(1,5):
deck.append([1,11])
for i in range(2,10):
deck.append([i])
for _ in range(1,5):
deck.append([10])
return deck
total_throwaways = 0
total_blackjacks = 0
for r in range(1,100001):
deck = make_deck()
shuffle(deck)
hands = []
for _ in range(1,5):
hands.append(Hand())
while len(deck) > 0:
used_card = False
for hand in hands:
if hand.can_add(deck[-1]):
hand.add(deck[-1])
del deck[-1]
used_card = True
break
if used_card == False:
total_throwaways += 1
del deck[-1]
shuffle(hands)
for hand in hands:
total_blackjacks += hand.get_blackjacks()
print("Total 21s = " + str(total_blackjacks))
print("Total discards = " + str(total_throwaways))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment