Skip to main content

pokdeng is a package for simulating rounds of pokdeng games!

Project description

pokdeng

pokdeng is a Python package for simulating rounds of pokdeng games!

Visit repository on Github


Quick Guide

Create player Kanye where he will

  • place bet amount = 2 if his pocket has a minimum balance of 3 after deducting the bet amount
  • draw the third card if his two cards on hand are not two deng or score less than 4
from pokdeng.cardholder import Dealer, Player
from pokdeng.hand import Hand
from pokdeng.game import Game
from pokdeng.pocket import Pocket
from decimal import Decimal

class Kanye(Player):
    def place_bet(self, round: int, pocket: Pocket) -> Decimal:
        bet = Decimal("2")
        if pocket.total_amount - bet >= Decimal("3"):
            return bet
        return None
    def draw_card(self, round: int, pocket: Pocket, hand: Hand) -> bool:
        return hand.deng() != 2 or hand.score() < 4
kanye = Kanye()

Create player Ben where he will

  • place bet amount = 1 if his pocket has a minimum balance of 0 after deducting the bet amount
  • draw the third card if his two cards on hand score lesss than 5
ben = Player()

Create dealer Anita where she will

  • fight her two cards on hand with three cards on other player's hands if two deng and score more than 4
  • draw the third card if her two cards on hand score less than 3
class Anita(Dealer):
    def two_fight_three(self, round: int, pocket: Pocket, hand: Hand) -> bool:
        return hand.deng() == 2 and hand.score() > 4
    def draw_card(self, round: int, pocket: Pocket, hand: Hand) -> bool:
        return hand.score() < 3
anita = Anita()

Create dealer Dixon where he will

  • fight his two cards on hand with three cards on other player's hands if score more than 5
  • draw the third card if his two cards on hand score less than 5
dixon = Dealer()

Create pocket for each dealer/player with some amount where dealer's pocket usually starts with 0 amount while player's pocket starts with positive amount

kanye_pocket = Pocket(kanye.card_holder_id, Decimal(10))
ben_pocket = Pocket(ben.card_holder_id, Decimal(10))
anita_pocket = Pocket(anita.card_holder_id, Decimal(0))

Create a collection of pockets by dealer/player

pockets = {kanye.card_holder_id: kanye_pocket, ben.card_holder_id: ben_pocket, anita.card_holder_id: anita_pocket}

Create a game of 1 dealer, a list of players, and a collection of pockets by dealer/player

game = Game(dealer = anita, players = [kanye, ben], pockets = pockets)

Play the game for 200 rounds

game.play(200)

Check total amount in each pocket afterwards

[(str(card_holder_id.value), pocket.total_amount) for card_holder_id, pocket in pockets.items()]

Pokdeng is a zero sum game, meaning the total amount in each pocket should sum to zero


Understanding hand comparison rules

from pokdeng.card import Card, Rank, Suit

Case #1: JQK same suit (straight flush) ties with TJQ same suit (straight flush)

hand1 = Hand(cards = [Card(Rank.JACK, Suit.CLUB), Card(Rank.KING, Suit.CLUB), Card(Rank.QUEEN, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.TEN, Suit.HEART), Card(Rank.JACK, Suit.HEART), Card(Rank.QUEEN, Suit.HEART)])
print(hand1.straight_flush(), hand2.straight_flush()) # True True
print(hand1.score(), hand2.score()) # 0 0
print(hand1.deng(), hand2.deng()) # 5 5
print(hand1 == hand2) # True

Case #2: 555 (tong) wins 567 same suit (straight flush)

hand1 = Hand(cards = [Card(Rank.FIVE, Suit.CLUB), Card(Rank.FIVE, Suit.SPADE), Card(Rank.FIVE, Suit.DIAMOND)])
hand2 = Hand(cards = [Card(Rank.FIVE, Suit.HEART), Card(Rank.SIX, Suit.HEART), Card(Rank.SEVEN, Suit.HEART)])
print(hand1.tong(), hand2.tong()) # True False
print(hand1.straight_flush(), hand2.straight_flush()) # False True
print(hand1 > hand2) # True

Case #3: KKK (tong) loses 222 (tong)

hand1 = Hand(cards = [Card(Rank.KING, Suit.CLUB), Card(Rank.KING, Suit.SPADE), Card(Rank.KING, Suit.DIAMOND)])
hand2 = Hand(cards = [Card(Rank.TWO, Suit.CLUB), Card(Rank.TWO, Suit.SPADE), Card(Rank.TWO, Suit.HEART)])
print(hand1.tong(), hand2.tong()) # True True
print(hand1.score(), hand2.score()) # 0 6
print(hand1 < hand2) # True

Case #4: 345 different suit (straight) wins JJQ (three yellow)

hand1 = Hand(cards = [Card(Rank.THREE, Suit.CLUB), Card(Rank.FOUR, Suit.SPADE), Card(Rank.FIVE, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.JACK, Suit.CLUB), Card(Rank.JACK, Suit.SPADE), Card(Rank.QUEEN, Suit.HEART)])
print(hand1.straight(), hand2.straight()) # True False
print(hand1.three_yellow(), hand2.three_yellow()) # False True
print(hand1 > hand2) # True

Case #5: KA2 same suit (normal 3 3 deng) loses JJQ (three yellow)

hand1 = Hand(cards = [Card(Rank.KING, Suit.CLUB), Card(Rank.ACE, Suit.CLUB), Card(Rank.TWO, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.JACK, Suit.CLUB), Card(Rank.JACK, Suit.SPADE), Card(Rank.QUEEN, Suit.HEART)])
print(hand1.three_yellow(), hand2.three_yellow()) # False True
print(hand1 < hand2) # True

Case #6: JQK same suit (straight flush) wins 234 different suit (straight)

hand1 = Hand(cards = [Card(Rank.JACK, Suit.CLUB), Card(Rank.QUEEN, Suit.CLUB), Card(Rank.KING, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.TWO, Suit.CLUB), Card(Rank.THREE, Suit.SPADE), Card(Rank.FOUR, Suit.HEART)])
print(hand1.straight_flush(), hand2.straight_flush()) # True False
print(hand1.straight(), hand2.straight()) # True True
print(hand1 > hand2) # True

Case #7: KA2 same suit (normal 3 3 deng) loses A25 different suit (normal 8 1 deng)

hand1 = Hand(cards = [Card(Rank.KING, Suit.CLUB), Card(Rank.ACE, Suit.CLUB), Card(Rank.TWO, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.ACE, Suit.CLUB), Card(Rank.TWO, Suit.SPADE), Card(Rank.FIVE, Suit.HEART)])
print(hand1.score(), hand2.score()) # 3 8
print(hand1 < hand2) # True

Case #8: A2 same suit (normal 3 2 deng) ties with A2T same suit (normal 3 3 deng)

hand1 = Hand(cards = [Card(Rank.ACE, Suit.SPADE), Card(Rank.TWO, Suit.SPADE)])
hand2 = Hand(cards = [Card(Rank.ACE, Suit.HEART), Card(Rank.TEN, Suit.HEART), Card(Rank.TWO, Suit.HEART)])
print(hand1.score(), hand2.score()) # 3 3
print(hand1.deng(), hand2.deng()) # 2 3
print(hand1 == hand2) # True

Case #9: A2 different suit (normal 1 deng) wins ATJ different suit (normal 1 deng)

hand1 = Hand(cards = [Card(Rank.ACE, Suit.SPADE), Card(Rank.TWO, Suit.HEART)])
hand2 = Hand(cards = [Card(Rank.ACE, Suit.HEART), Card(Rank.TEN, Suit.HEART), Card(Rank.JACK, Suit.DIAMOND)])
print(hand1.score(), hand2.score()) # 3 1
print(hand1 > hand2) # True

Case #10: 45 different suit (pok nine 1 deng) wins 99 (pok eight 2 deng)

hand1 = Hand(cards = [Card(Rank.FIVE, Suit.SPADE), Card(Rank.FOUR, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.NINE, Suit.SPADE), Card(Rank.NINE, Suit.DIAMOND)])
print(hand1.pok_nine(), hand2.pok_nine()) # True False
print(hand1.pok_eight(), hand2.pok_eight()) # False True
print(hand1 > hand2) # True

Case #11: A67 same suit (normal 4 3 deng) ties with 22 (normal 4 2 deng)

hand1 = Hand(cards = [Card(Rank.ACE, Suit.CLUB), Card(Rank.SIX, Suit.CLUB), Card(Rank.SEVEN, Suit.CLUB)])
hand2 = Hand(cards = [Card(Rank.TWO, Suit.SPADE), Card(Rank.TWO, Suit.HEART)])
print(hand1.score(), hand2.score()) # 4 4
print(hand1.deng(), hand2.deng()) # 3 2
print(hand1 == hand2) # True

More cases under tests/test_hand.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pokdeng-0.0.2.tar.gz (14.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pokdeng-0.0.2-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

Details for the file pokdeng-0.0.2.tar.gz.

File metadata

  • Download URL: pokdeng-0.0.2.tar.gz
  • Upload date:
  • Size: 14.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.3

File hashes

Hashes for pokdeng-0.0.2.tar.gz
Algorithm Hash digest
SHA256 c4f5dff219be3f7f64df87014e47538fe4ee0ab9650e31f887fd753e951e8558
MD5 59a41fc2871a66c7ab00d6423d31ad40
BLAKE2b-256 e4ee4ad3453d802fba1786f75d899addeae8954f6dfbceba1e24c20dd1b6bc2e

See more details on using hashes here.

File details

Details for the file pokdeng-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: pokdeng-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 8.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.0.1 CPython/3.12.3

File hashes

Hashes for pokdeng-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 88960bc89b3afe5bd76002e35b543773ae901bfa7577474a9599fa4184ff8183
MD5 9d2dc9f43e675d9be330bdde91c74374
BLAKE2b-256 135816c126f16d87638c0b5a8079f5db04b0dad05c9b73bf8956a85d9ccec96c

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page