From e179d71d413099fb938aa005962aa79ac35589bb Mon Sep 17 00:00:00 2001 From: Donald Calloway Date: Wed, 24 Sep 2025 19:14:18 -0700 Subject: [PATCH] Add melds method to class Hand; added find_sets and find_runs functions --- Gin_Rummy_Card_Game.py | 47 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/Gin_Rummy_Card_Game.py b/Gin_Rummy_Card_Game.py index 598ca63..dd49d7a 100644 --- a/Gin_Rummy_Card_Game.py +++ b/Gin_Rummy_Card_Game.py @@ -1,10 +1,12 @@ -import random +import random +from collections import defaultdict + +RANK_ORDER = {str(n): n for n in range(2, 11)} +RANK_ORDER.update({"A": 1, "J": 11, "Q": 12, "K": 13}) class Card: suits = ['♠', '♥', '♦', '♣'] ranks = list(range(1, 11)) + ['J', 'Q', 'K'] - RANK_ORDER = {str(n): n for n in range(2, 11)} - RANK_ORDER.update({"A": 1, "J": 11, "Q": 12, "K": 13}) def __init__(self, rank, suit): self.rank = rank @@ -49,6 +51,9 @@ class Hand: def remove(self, card): self.cards.remove(card) + + def melds(self): + return find_sets(self.cards) + find_runs(self.cards) def deadwood_points(self): return sum(c.value for c in self.cards) # placeholder @@ -94,7 +99,41 @@ class Game: for p in self.players: print(p.name, p.hand) - + +# Function to detect sets +def find_sets(cards): + groups = defaultdict(list) + for c in cards: + groups[c.rank].append(c) + return [group for group in groups.values() if len(group) >= 3] + + +# Function to detect runs +def find_runs(cards): + runs = [] + # group by suit + suits = defaultdict(list) + for c in cards: + suits[c.suit].append(c) + + for suit, suited_cards in suits.items(): + # sort by rank order + sorted_cards = sorted(suited_cards, key=lambda c: RANK_ORDER[str(c.rank)]) + # scan for consecutive sequences + temp = [sorted_cards[0]] + for i in range(1, len(sorted_cards)): + prev = RANK_ORDER[str(sorted_cards[i-1].rank)] + curr = RANK_ORDER[str(sorted_cards[i].rank)] + if curr == prev + 1: + temp.append(sorted_cards[i]) + else: + if len(temp) >= 3: + runs.append(temp) + temp = [sorted_cards[i]] + if len(temp) >= 3: + runs.append(temp) + return runs + \ No newline at end of file