Source code for maverick.players.archetypes.abc
from typing import TYPE_CHECKING
from ...player import Player
from ...enums import ActionType
from ...playeraction import PlayerAction
from ...utils import estimate_holding_strength
if TYPE_CHECKING: # pragma: no cover
from ...game import Game
__all__ = ["ABCBot"]
[docs]
class ABCBot(Player):
"""A straightforward, textbook poker bot with little deviation.
Uses hand strength evaluation and pot odds to make solid, textbook decisions.
Makes decisions based on hand equity and proper bet sizing according to
standard poker theory.
- **Key Traits:** Plays by the book, predictable patterns, solid fundamentals.
- **Strengths:** Consistent, avoids major mistakes, uses proper hand evaluation.
- **Weaknesses:** Predictable, exploitable by advanced players.
- **Common At:** Low to mid-stakes games.
"""
cls_uid = "f0c69546d5c54e7d8d3f3b1e1aa21ba7"
[docs]
def decide_action(
self,
*,
game: "Game",
valid_actions: list[ActionType],
min_raise_amount: int,
call_amount: int,
min_bet_amount: int,
) -> PlayerAction:
"""Play straightforward, textbook poker using hand strength evaluation."""
# Evaluate hand strength
private_cards = self.state.holding.cards
community_cards = game.state.community_cards
# Get hand equity if there are community cards
if community_cards:
hand_equity = estimate_holding_strength(
private_cards,
community_cards=community_cards,
n_private=game.rules.showdown.hole_cards_required,
n_simulations=500,
n_players=len(game.state.get_players_in_hand()),
)
else:
# Pre-flop estimation
hand_equity = estimate_holding_strength(
private_cards,
n_private=game.rules.showdown.hole_cards_required,
n_simulations=200,
n_players=len(game.state.get_players_in_hand()),
)
# Textbook thresholds for ABC play
strong_hand = hand_equity > 0.65
decent_hand = hand_equity > 0.45
# Standard value bet with strong hands
if ActionType.BET in valid_actions and strong_hand:
# Textbook bet: 2-3x BB
bet_amount = min(min_bet_amount, self.state.stack)
return PlayerAction(
player_uid=self.uid, action_type=ActionType.BET, amount=bet_amount
)
# Standard raise with strong hands
if ActionType.RAISE in valid_actions and strong_hand:
# Textbook raise: minimum raise
raise_amount = min(min_raise_amount, self.state.stack)
return PlayerAction(
player_uid=self.uid, action_type=ActionType.RAISE, amount=raise_amount
)
# Call with proper pot odds and decent hands
if ActionType.CALL in valid_actions:
call_amount = call_amount
# ABC calls with 3:1 pot odds or better and decent hand
if (
call_amount <= self.state.stack
and call_amount * 3 <= game.state.pot
and decent_hand
):
return PlayerAction(player_uid=self.uid, action_type=ActionType.CALL)
# Check when it's free
if ActionType.CHECK in valid_actions:
return PlayerAction(player_uid=self.uid, action_type=ActionType.CHECK)
# Fold when not getting proper odds or weak hand
return PlayerAction(player_uid=self.uid, action_type=ActionType.FOLD)