Skip to content

Instantly share code, notes, and snippets.

@david-ohmg
Last active October 13, 2024 07:35
Show Gist options
  • Save david-ohmg/9744ca361b9e2e1cac944ff993a67f87 to your computer and use it in GitHub Desktop.
Save david-ohmg/9744ca361b9e2e1cac944ff993a67f87 to your computer and use it in GitHub Desktop.
Create standard 52 card deck of cards; shuffle; deal cards based on num players, max and min hand sizes; refresh and shuffle and re-deal
"""
DECK OF CARDS
DAVE CRANDELL 2024
52-CARD DECK DEFINED AS DICT
IMAGES FROM https://tekeye.uk/playing_cards/svg-playing-cards
"""
class CardSuit:
SPADES = 'Spades'
CLUBS = 'Clubs'
DIAMONDS = 'Diamonds'
HEARTS = 'Hearts'
class CardVal:
A = 11, 'A'
K = 10, 'K'
Q = 10, 'Q'
J = 10, 'J'
TEN = 10, '10'
NINE = 9, '9'
EIGHT = 8, '8'
SEVEN = 7, '7'
SIX = 6, '6'
FIVE = 5, '5'
FOUR = 4, '4'
THREE = 3, '3'
TWO = 2, '2'
CARDS = [
dict(suit=CardSuit.SPADES, value=CardVal.A, img='spades_ace.svg', slug='ace-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.K, img='spades_king.svg', slug='king-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.Q, img='spades_queen.svg', slug='queen-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.J, img='spades_jack.svg', slug='jack-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.TEN, img='spades_10.svg', slug='10-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.NINE, img='spades_9.svg', slug='9-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.EIGHT, img='spades_8.svg', slug='8-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.SEVEN, img='spades_7.svg', slug='7-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.SIX, img='spades_6.svg', slug='6-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.FIVE, img='spades_5.svg', slug='5-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.FOUR, img='spades_4.svg', slug='4-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.THREE, img='spades_3.svg', slug='3-of-spades'),
dict(suit=CardSuit.SPADES, value=CardVal.TWO, img='spades_2.svg', slug='2-of-spades'),
dict(suit=CardSuit.HEARTS, value=CardVal.A, img='hearts_ace.svg', slug='ace-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.K, img='hearts_king.svg', slug='king-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.Q, img='hearts_queen.svg', slug='queen-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.J, img='hearts_jack.svg', slug='jack-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.TEN, img='hearts_10.svg', slug='10-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.NINE, img='hearts_9.svg', slug='9-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.EIGHT, img='hearts_8.svg', slug='8-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.SEVEN, img='hearts_7.svg', slug='7-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.SIX, img='hearts_6.svg', slug='6-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.FIVE, img='hearts_5.svg', slug='5-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.FOUR, img='hearts_4.svg', slug='4-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.THREE, img='hearts_3.svg', slug='3-of-hearts'),
dict(suit=CardSuit.HEARTS, value=CardVal.TWO, img='hearts_2.svg', slug='2-of-hearts'),
dict(suit=CardSuit.CLUBS, value=CardVal.A, img='clubs_ace.svg', slug='ace-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.K, img='clubs_king.svg', slug='king-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.Q, img='clubs_queen.svg', slug='queen-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.J, img='clubs_jack.svg', slug='jack-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.TEN, img='clubs_10.svg', slug='10-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.NINE, img='clubs_9.svg', slug='9-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.EIGHT, img='clubs_8.svg', slug='8-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.SEVEN, img='clubs_7.svg', slug='7-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.SIX, img='clubs_6.svg', slug='6-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.FIVE, img='clubs_5.svg', slug='5-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.FOUR, img='clubs_4.svg', slug='4-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.THREE, img='clubs_3.svg', slug='3-of-clubs'),
dict(suit=CardSuit.CLUBS, value=CardVal.TWO, img='clubs_2.svg', slug='2-of-clubs'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.A, img='diamonds_ace.svg', slug='ace-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.K, img='diamonds_king.svg', slug='king-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.Q, img='diamonds_queen.svg', slug='queen-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.J, img='diamonds_jack.svg', slug='jack-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.TEN, img='diamonds_10.svg', slug='10-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.NINE, img='diamonds_9.svg', slug='9-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.EIGHT, img='diamonds_8.svg', slug='8-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.SEVEN, img='diamonds_7.svg', slug='7-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.SIX, img='diamonds_6.svg', slug='6-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.FIVE, img='diamonds_5.svg', slug='5-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.FOUR, img='diamonds_4.svg', slug='4-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.THREE, img='diamonds_3.svg', slug='3-of-diamonds'),
dict(suit=CardSuit.DIAMONDS, value=CardVal.TWO, img='diamonds_2.svg', slug='2-of-diamonds'),
]
import random
import os
from .deck_of_cards import CARDS
class SimpleCardGame:
CARD_PATH = '/static/svg_playing_cards/'
def __init__(self, max_hand: int, min_hand: int, n_players: int):
self.max_hand = max_hand
self.min_hand = min_hand
self.n_players = n_players
self.cards = CARDS
@staticmethod
def get_card_val(card: dict) -> int:
return int(card['value'][0])
@staticmethod
def get_card_face(card: dict) -> str:
return str(card['value'][1])
def get_player_card_lists(self) -> list:
return [(n, []) for n in range(self.n_players)]
@staticmethod
def draw_card(n: int, deck: list) -> dict:
return deck[n + 1] if n < 52 else {}
def shuffle_deck(self) -> list:
deck = self.cards
random.shuffle(deck)
return deck
def deal_hand(self) -> tuple[list[dict], int, list[dict]]:
deck, card_lists, cards_dealt, i = self.shuffle_deck(), self.get_player_card_lists(), [], 0
while i < self.max_hand * self.n_players:
for j in range(self.n_players):
card = deck[i]
card_lists[j][1].append(self.get_card_val(card))
cards_dealt.append(
dict(
player=f'Player {j + 1}',
card_face=self.get_card_face(card),
card_val=self.get_card_val(card),
card_img=card['img'],
card_slug=card['slug']
)
)
i += 1
# print(card_lists)
return cards_dealt, i, card_lists
@staticmethod
def get_score(c_list: list) -> int:
score = 0
for c in c_list:
score += c
return score
def get_winner(self, card_lists: list):
players = [(n, self.get_score(card_lists[n][1])) for n in range(self.n_players)]
players.sort(key=lambda x: x[1], reverse=True)
return players[0] if players[0][1] <= 21 else players[1]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment