示例#1
0
 def __init__(self, uuid, initial_stack, name="No Name"):
     self.name = name
     self.uuid = uuid
     self.hole_card = []
     self.stack = initial_stack
     self.round_action_histories = self.__init_round_action_histories()
     self.action_histories = []
     self.pay_info = PayInfo()
示例#2
0
 def __init__(self, uuid, initial_stack, name="No Name"):
     self.name = name
     self.uuid = uuid
     self.hole_card = []
     self.stack = initial_stack
     self.round_action_histories = self.__init_round_action_histories()
     self.action_histories = []
     self.pay_info = PayInfo()
     self.too_poor = False  # If the player is too poor to participate (ie cannot bet the blind amount, then it should be forced to FOLD)
示例#3
0
 def test_serialization(self):
     self.info.update_by_pay(100)
     self.info.update_to_allin()
     serial = self.info.serialize()
     restored = PayInfo.deserialize(serial)
     self.eq(100, restored.amount)
     self.eq(PayInfo.ALLIN, restored.status)
示例#4
0
 def test_serialization(self):
   self.info.update_by_pay(100)
   self.info.update_to_allin()
   serial = self.info.serialize()
   restored = PayInfo.deserialize(serial)
   self.eq(100, restored.amount)
   self.eq(PayInfo.ALLIN, restored.status)
示例#5
0
 def deserialize(self, serial):
     hole = [Card.from_id(cid) for cid in serial[3]]
     player = self(serial[1], serial[2], serial[0])
     if len(hole) != 0: player.add_holecard(hole)
     player.action_histories = serial[4]
     player.pay_info = PayInfo.deserialize(serial[5])
     player.round_action_histories = serial[6]
     return player
示例#6
0
 def deserialize(self, serial):
   hole = [Card.from_id(cid) for cid in serial[3]]
   player = self(serial[1], serial[2], serial[0])
   if len(hole)!=0: player.add_holecard(hole)
   player.action_histories = serial[4]
   player.pay_info = PayInfo.deserialize(serial[5])
   player.round_action_histories = serial[6]
   return player
示例#7
0
 def __init__(self, uuid, initial_stack, name="No Name"):
   self.name = name
   self.uuid = uuid
   self.hole_card = []
   self.stack = initial_stack
   self.round_action_histories = self.__init_round_action_histories()
   self.action_histories = []
   self.pay_info = PayInfo()
示例#8
0
 def deserialize(self, serial):
     hole = [cid for cid in serial[3]]
     player = self(serial[1], serial[2], serial[0])
     if len(hole) != 0: player.add_holecard(hole)
     player.action_histories = serial[4]
     player.pay_info = PayInfo.deserialize(serial[5])
     player.round_action_histories = serial[6]
     player.cashgame_stack = serial[7]
     return player
示例#9
0
 def setUp(self):
     self.info = PayInfo()
示例#10
0
class PayInfoTest(BaseUnitTest):
    def setUp(self):
        self.info = PayInfo()

    def test_update_by_pay(self):
        self.info.update_by_pay(10)
        self.eq(10, self.info.amount)
        self.eq(PayInfo.PAY_TILL_END, self.info.status)

    def test_update_by_allin(self):
        self.info.update_to_allin()
        self.eq(0, self.info.amount)
        self.eq(PayInfo.ALLIN, self.info.status)

    def test_update_to_fold(self):
        self.info.update_to_fold()
        self.eq(0, self.info.amount)
        self.eq(PayInfo.FOLDED, self.info.status)

    def test_serialization(self):
        self.info.update_by_pay(100)
        self.info.update_to_allin()
        serial = self.info.serialize()
        restored = PayInfo.deserialize(serial)
        self.eq(100, restored.amount)
        self.eq(PayInfo.ALLIN, restored.status)
示例#11
0
class Player:

  ACTION_FOLD_STR = "FOLD"
  ACTION_CALL_STR = "CALL"
  ACTION_RAISE_STR = "RAISE"
  ACTION_SMALL_BLIND = "SMALLBLIND"
  ACTION_BIG_BLIND = "BIGBLIND"
  ACTION_ANTE = "ANTE"

  def __init__(self, uuid, initial_stack, name="No Name"):
    self.name = name
    self.uuid = uuid
    self.hole_card = []
    self.stack = initial_stack
    self.round_action_histories = self.__init_round_action_histories()
    self.action_histories = []
    self.pay_info = PayInfo()

  def add_holecard(self, cards):
    if len(self.hole_card) != 0:
      raise ValueError(self.__dup_hole_msg)
    if len(cards) != 2:
      raise ValueError(self.__wrong_num_hole_msg % (len(cards)))
    if not all([isinstance(card, Card) for card in cards]):
      raise ValueError(self.__wrong_type_hole_msg)
    self.hole_card = cards

  def clear_holecard(self):
    self.hole_card = []

  def append_chip(self, amount):
    self.stack += amount

  def collect_bet(self, amount):
    if self.stack < amount:
      raise ValueError(self.__collect_err_msg % (amount, self.stack))
    self.stack -= amount

  def is_active(self):
    return self.pay_info.status != PayInfo.FOLDED

  def is_waiting_ask(self):
    return self.pay_info.status == PayInfo.PAY_TILL_END

  def add_action_history(self, kind, chip_amount=None, add_amount=None, sb_amount=None):
    history = None
    if kind == Const.Action.FOLD:
      history = self.__fold_history()
    elif kind == Const.Action.CALL:
      history = self.__call_history(chip_amount)
    elif kind == Const.Action.RAISE:
      history = self.__raise_history(chip_amount, add_amount)
    elif kind == Const.Action.SMALL_BLIND:
      history = self.__blind_history(True, sb_amount)
    elif kind == Const.Action.BIG_BLIND:
      history = self.__blind_history(False, sb_amount)
    elif kind == Const.Action.ANTE:
      history = self.__ante_history(chip_amount)
    else:
      raise "UnKnown action history is added (kind = %s)" % kind
    history = self.__add_uuid_on_history(history)
    self.action_histories.append(history)

  def save_street_action_histories(self, street_flg):
    self.round_action_histories[street_flg] = self.action_histories
    self.action_histories = []

  def clear_action_histories(self):
    self.round_action_histories = self.__init_round_action_histories()
    self.action_histories = []

  def clear_pay_info(self):
    self.pay_info = PayInfo()

  def paid_sum(self):
    pay_history = [h for h in self.action_histories if h["action"] not in ["FOLD", "ANTE"]]
    last_pay_history = pay_history[-1] if len(pay_history)!=0 else None
    return last_pay_history["amount"] if last_pay_history else 0

  def serialize(self):
    hole = [card.to_id() for card in self.hole_card]
    return [
        self.name, self.uuid, self.stack, hole,\
            self.action_histories[::], self.pay_info.serialize(), self.round_action_histories[::]
    ]

  @classmethod
  def deserialize(self, serial):
    hole = [Card.from_id(cid) for cid in serial[3]]
    player = self(serial[1], serial[2], serial[0])
    if len(hole)!=0: player.add_holecard(hole)
    player.action_histories = serial[4]
    player.pay_info = PayInfo.deserialize(serial[5])
    player.round_action_histories = serial[6]
    return player

  """ private """

  __dup_hole_msg = "Hole card is already set"
  __wrong_num_hole_msg = "You passed  %d hole cards"
  __wrong_type_hole_msg = "You passed not Card object as hole card"
  __collect_err_msg = "Failed to collect %d chips. Because he has only %d chips"

  def __init_round_action_histories(self):
    return [None for _ in range(4)]  # 4 == len(["preflop", "flop", "turn", "river"])

  def __fold_history(self):
    return { "action" : self.ACTION_FOLD_STR }

  def __call_history(self, bet_amount):
    return {
        "action" : self.ACTION_CALL_STR,
        "amount" : bet_amount,
        "paid" : bet_amount - self.paid_sum()
    }

  def __raise_history(self, bet_amount, add_amount):
    return {
        "action" : self.ACTION_RAISE_STR,
        "amount" : bet_amount,
        "paid" : bet_amount - self.paid_sum(),
        "add_amount" : add_amount
        }

  def __blind_history(self, small_blind, sb_amount):
    assert(sb_amount is not None)
    action = self.ACTION_SMALL_BLIND if small_blind else self.ACTION_BIG_BLIND
    amount = sb_amount if small_blind else sb_amount*2
    add_amount = sb_amount
    return {
        "action" : action,
        "amount" : amount,
        "add_amount" : add_amount
        }

  def __ante_history(self, pay_amount):
    assert(pay_amount > 0)
    return {
        "action" : self.ACTION_ANTE,
        "amount" : pay_amount
        }

  def __add_uuid_on_history(self, history):
    history["uuid"] = self.uuid
    return history
示例#12
0
class PayInfoTest(BaseUnitTest):

  def setUp(self):
    self.info = PayInfo()

  def test_update_by_pay(self):
    self.info.update_by_pay(10)
    self.eq(10, self.info.amount)
    self.eq(PayInfo.PAY_TILL_END, self.info.status)

  def test_update_by_allin(self):
    self.info.update_to_allin()
    self.eq(0, self.info.amount)
    self.eq(PayInfo.ALLIN, self.info.status)

  def test_update_to_fold(self):
    self.info.update_to_fold()
    self.eq(0, self.info.amount)
    self.eq(PayInfo.FOLDED, self.info.status)

  def test_serialization(self):
    self.info.update_by_pay(100)
    self.info.update_to_allin()
    serial = self.info.serialize()
    restored = PayInfo.deserialize(serial)
    self.eq(100, restored.amount)
    self.eq(PayInfo.ALLIN, restored.status)
示例#13
0
class Player:

    ACTION_FOLD_STR = 'FOLD'
    ACTION_CALL_STR = 'CALL'
    ACTION_RAISE_STR = 'RAISE'
    ACTION_SMALL_BLIND = 'SMALLBLIND'
    ACTION_BIG_BLIND = 'BIGBLIND'
    ACTION_ANTE = 'ANTE'

    def __init__(self, uuid, initial_stack, name='No Name'):
        self.name = name
        self.uuid = uuid
        self.hole_card = []
        self.stack = initial_stack
        self.round_action_histories = self.__init_round_action_histories()
        self.action_histories = []
        self.pay_info = PayInfo()

    def add_holecard(self, cards):
        if len(self.hole_card) != 0:
            raise ValueError(self.__dup_hole_msg)
        if len(cards) != 2:
            raise ValueError(self.__wrong_num_hole_msg % (len(cards)))
        if not all([isinstance(card, Card) for card in cards]):
            raise ValueError(self.__wrong_type_hole_msg)
        self.hole_card = cards

    def clear_holecard(self):
        self.hole_card = []

    def append_chip(self, amount):
        self.stack += amount

    def collect_bet(self, amount):
        if self.stack < amount:
            raise ValueError(self.__collect_err_msg % (amount, self.stack))
        self.stack -= amount

    def is_active(self):
        return self.pay_info.status != PayInfo.FOLDED

    def is_waiting_ask(self):
        return self.pay_info.status == PayInfo.PLAY_TILL_END

    def add_action_history(self,
                           kind,
                           chip_amount=None,
                           add_amount=None,
                           sb_amount=None):
        history = None
        if kind == Const.Action.FOLD:
            history = self.__fold_history()
        elif kind == Const.Action.CALL:
            history = self.__call_history(chip_amount)
        elif kind == Const.Action.RAISE:
            history = self.__raise_history(chip_amount, add_amount)
        elif kind == Const.Action.SMALL_BLIND:
            history = self.__blind_history(True, sb_amount)
        elif kind == Const.Action.BIG_BLIND:
            history = self.__blind_history(False, sb_amount)
        elif kind == Const.Action.ANTE:
            history = self.__ante_history(chip_amount)
        else:
            raise 'Unknown action history is added (kind = %s)' % kind
        history = self.__add_uuid_on_history(history)
        self.action_histories.append(history)

    def save_street_action_histories(self, street_flg):
        self.round_action_histories[street_flg] = self.action_histories
        self.action_histories = []

    def clear_action_histories(self):
        self.round_action_histories = self.__init_round_action_histories()
        self.action_histories = []

    def clear_pay_info(self):
        self.pay_info = PayInfo()

    def paid_sum(self):
        pay_history = [
            h for h in self.action_histories
            if h['action'] not in ['FOLD', 'ANTE']
        ]
        last_pay_history = pay_history[-1] if len(pay_history) != 0 else None
        return last_pay_history['amount'] if last_pay_history else 0

    def serialize(self):
        hole = [card.to_id() for card in self.hole_card]
        return [
            self.name, self.uuid, self.stack, hole, self.action_histories[::],
            self.pay_info.serialize(), self.round_action_histories[::]
        ]

    @classmethod
    def deserialize(self, serial):
        hole = [Card.from_id(cid) for cid in serial[3]]
        player = self(serial[1], serial[2], serial[0])
        if len(hole) != 0:
            player.add_holecard(hole)
        player.action_histories = serial[4]
        player.pay_info = PayInfo.deserialize(serial[5])
        player.round_action_histories = serial[6]
        return player

    ''' private '''

    __dup_hole_msg = 'Hole card is already set'
    __wrong_num_hole_msg = 'You passed  %d hole cards'
    __wrong_type_hole_msg = 'You passed not Card object as hole card'
    __collect_err_msg = 'Failed to collect %d chips. Because he has only %d chips'

    def __init_round_action_histories(self):
        return [None for _ in range(4)
                ]  # 4 == len(['preflop', 'flop', 'turn', 'river'])

    def __fold_history(self):
        return {'action': self.ACTION_FOLD_STR}

    def __call_history(self, bet_amount):
        return {
            'action': self.ACTION_CALL_STR,
            'amount': bet_amount,
            'paid': bet_amount - self.paid_sum()
        }

    def __raise_history(self, bet_amount, add_amount):
        return {
            'action': self.ACTION_RAISE_STR,
            'amount': bet_amount,
            'paid': bet_amount - self.paid_sum(),
            'add_amount': add_amount
        }

    def __blind_history(self, small_blind, sb_amount):
        assert (sb_amount is not None)
        action = self.ACTION_SMALL_BLIND if small_blind else self.ACTION_BIG_BLIND
        amount = sb_amount if small_blind else sb_amount * 2
        add_amount = sb_amount
        return {'action': action, 'amount': amount, 'add_amount': add_amount}

    def __ante_history(self, pay_amount):
        assert (pay_amount > 0)
        return {'action': self.ACTION_ANTE, 'amount': pay_amount}

    def __add_uuid_on_history(self, history):
        history['uuid'] = self.uuid
        return history
示例#14
0
 def clear_pay_info(self):
   self.pay_info = PayInfo()
示例#15
0
class Player:

    ACTION_FOLD_STR = "FOLD"
    ACTION_CALL_STR = "CALL"
    ACTION_RAISE_STR = "RAISE"
    ACTION_SMALL_BLIND = "SMALLBLIND"
    ACTION_BIG_BLIND = "BIGBLIND"
    ACTION_ANTE = "ANTE"

    def __init__(self, uuid, initial_stack, name="No Name"):
        self.name = name
        self.uuid = uuid
        self.hole_card = []
        self.stack = initial_stack
        self.round_action_histories = self.__init_round_action_histories()
        self.action_histories = []
        self.pay_info = PayInfo()

    def add_holecard(self, cards):
        if len(self.hole_card) != 0:
            raise ValueError(self.__dup_hole_msg)
        if len(cards) != GameCustomization.hole_card_count:
            raise ValueError(self.__wrong_num_hole_msg % (len(cards)))
        if not all([isinstance(card, Card) for card in cards]):
            raise ValueError(self.__wrong_type_hole_msg)
        self.hole_card = cards

    def clear_holecard(self):
        self.hole_card = []

    def append_chip(self, amount):
        self.stack += amount

    def collect_bet(self, amount):
        if self.stack < amount:
            raise ValueError(self.__collect_err_msg % (amount, self.stack))
        self.stack -= amount

    def is_active(self):
        return self.pay_info.status != PayInfo.FOLDED

    def is_waiting_ask(self):
        return self.pay_info.status == PayInfo.PAY_TILL_END

    def add_action_history(self,
                           kind,
                           chip_amount=None,
                           add_amount=None,
                           sb_amount=None):
        history = None
        if kind == Const.Action.FOLD:
            history = self.__fold_history()
        elif kind == Const.Action.CALL:
            history = self.__call_history(chip_amount)
        elif kind == Const.Action.RAISE:
            history = self.__raise_history(chip_amount, add_amount)
        elif kind == Const.Action.SMALL_BLIND:
            history = self.__blind_history(True, sb_amount)
        elif kind == Const.Action.BIG_BLIND:
            history = self.__blind_history(False, sb_amount)
        elif kind == Const.Action.ANTE:
            history = self.__ante_history(chip_amount)
        else:
            raise "UnKnown action history is added (kind = %s)" % kind
        history = self.__add_uuid_on_history(history)
        self.action_histories.append(history)

    def save_street_action_histories(self, street_flg):
        self.round_action_histories[street_flg] = self.action_histories
        self.action_histories = []

    def clear_action_histories(self):
        self.round_action_histories = self.__init_round_action_histories()
        self.action_histories = []

    def clear_pay_info(self):
        self.pay_info = PayInfo()

    def paid_sum(self):
        pay_history = [
            h for h in self.action_histories
            if h["action"] not in ["FOLD", "ANTE"]
        ]
        last_pay_history = pay_history[-1] if len(pay_history) != 0 else None
        return last_pay_history["amount"] if last_pay_history else 0

    def serialize(self):
        hole = [card.to_id() for card in self.hole_card]
        return [
            self.name, self.uuid, self.stack, hole,\
                self.action_histories[::], self.pay_info.serialize(), self.round_action_histories[::]
        ]

    @classmethod
    def deserialize(self, serial):
        hole = [Card.from_id(cid) for cid in serial[3]]
        player = self(serial[1], serial[2], serial[0])
        if len(hole) != 0: player.add_holecard(hole)
        player.action_histories = serial[4]
        player.pay_info = PayInfo.deserialize(serial[5])
        player.round_action_histories = serial[6]
        return player

    """ private """

    __dup_hole_msg = "Hole card is already set"
    __wrong_num_hole_msg = "You passed  %d hole cards"
    __wrong_type_hole_msg = "You passed not Card object as hole card"
    __collect_err_msg = "Failed to collect %d chips. Because he has only %d chips"

    def __init_round_action_histories(self):
        return [None for _ in range(4)
                ]  # 4 == len(["preflop", "flop", "turn", "river"])

    def __fold_history(self):
        return {"action": self.ACTION_FOLD_STR}

    def __call_history(self, bet_amount):
        return {
            "action": self.ACTION_CALL_STR,
            "amount": bet_amount,
            "paid": bet_amount - self.paid_sum()
        }

    def __raise_history(self, bet_amount, add_amount):
        return {
            "action": self.ACTION_RAISE_STR,
            "amount": bet_amount,
            "paid": bet_amount - self.paid_sum(),
            "add_amount": add_amount
        }

    def __blind_history(self, small_blind, sb_amount):
        assert (sb_amount is not None)
        action = self.ACTION_SMALL_BLIND if small_blind else self.ACTION_BIG_BLIND
        amount = sb_amount if small_blind else sb_amount * 2
        add_amount = sb_amount
        return {"action": action, "amount": amount, "add_amount": add_amount}

    def __ante_history(self, pay_amount):
        assert (pay_amount > 0)
        return {"action": self.ACTION_ANTE, "amount": pay_amount}

    def __add_uuid_on_history(self, history):
        history["uuid"] = self.uuid
        return history
示例#16
0
 def clear_pay_info(self):
     self.pay_info = PayInfo()
示例#17
0
 def setUp(self):
   self.info = PayInfo()