pokdeng is a package for simulating rounds of pokdeng games!
Project description
pokdeng
pokdeng is a Python package for simulating rounds of pokdeng games!
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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4f5dff219be3f7f64df87014e47538fe4ee0ab9650e31f887fd753e951e8558
|
|
| MD5 |
59a41fc2871a66c7ab00d6423d31ad40
|
|
| BLAKE2b-256 |
e4ee4ad3453d802fba1786f75d899addeae8954f6dfbceba1e24c20dd1b6bc2e
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88960bc89b3afe5bd76002e35b543773ae901bfa7577474a9599fa4184ff8183
|
|
| MD5 |
9d2dc9f43e675d9be330bdde91c74374
|
|
| BLAKE2b-256 |
135816c126f16d87638c0b5a8079f5db04b0dad05c9b73bf8956a85d9ccec96c
|