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 = {pocket.card_holder_id: pocket for pocket in [kanye_pocket, ben_pocket, 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

[(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 of every pockets after each play always sums to the initial total amount of every pockets


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.3.tar.gz (15.6 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.3-py3-none-any.whl (8.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: pokdeng-0.0.3.tar.gz
  • Upload date:
  • Size: 15.6 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.3.tar.gz
Algorithm Hash digest
SHA256 fbb8719389d56f2d4b91afc5a1abb92b98dd1ea9aa9ea4c46076f9dcff1e8595
MD5 511b796713635f69efa4b9747d01523e
BLAKE2b-256 c15d53e89dac7d45fceff322c7210a0ddb1b7303c05f6a9059080793ebe6c2f1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pokdeng-0.0.3-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.3-py3-none-any.whl
Algorithm Hash digest
SHA256 23dfea2a8cb94394442033a79e4c3576d5cd5847ef16d455b334edd0acf875ba
MD5 9987dfc61f26f224c04f98c476d7526d
BLAKE2b-256 54eb0dbe2e52540a541fe6e41a532a346f66388d033c8e98786bb654b4319711

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