德州扑克 - Preflop决策
Package: pokerai
[部分代码是从PyPokerEngine(MIT协议)拿来的。]
- preflop: preflop轮决策的主要逻辑。
pokerai.engine
- card: 实现Card类;
- hand_evaluator: 判断牌型输赢。
pokerai.utils
- action_utils: 关于行为的一些辅助方法;
- card_utils: 关于牌的一些辅助方法(生成Card类数据,计算牌力等)。
Preflop决策实现: 表驱动
结构
构建一个环境表ENVS_TABLE来索引具体条件下,要执行的动作对应的手牌范围。索引结构为:
- position: 玩家位置(
SB,BB,EP1, ...); - previous action: 玩家上一个动作(
call,raise nX, 若当前是第一个动作则为none); - opponents action: 对手动作(
kb: kbet第k个bet,BB后第二个raise为3bet;c: call, ... 1caller + 3bet 为1c3b); - pot range: 对手raise范围(raise多少倍,
m-n,n+,m); - {action: card_range}:
动作 - 手牌范围键值对。
数据形式
将表存入文件envs_table.json,在决策时读取。
注:
1. 例中#后为相应解释,但在json格式数据中不存在注释这种说法,实际使用时不要把它写到文件里。
2. 需要检验在多线程使用时是否会发生冲突,如果发生写进python文件。
{
# 玩家位置: EP1
"EP1": {
# 玩家上回合行为: none
"none": {
# 对手行为: none
"none": {
# 底池范围: 1.5BB (只有SB和BB下注)
"1.5": {
# 作出动作 raise 4BB 时的手牌范围
"raise 4BB": ["88+", "ATs+", "KJs+", "QJs",
"JTs", "T9s", "98s", "AQo+"]
}
}
},
# 玩家上回合行为: raise 4BB
"raise 4BB":{
# 对手行为: 3bet
"3b": {
# 底池范围: 8BB-12BB
"8-12": {
# 作出动作 raise 2.5X 时的手牌范围
"raise 2.5X": ["AA", "AQo"],
# 作出动作 call 时的手牌范围
"call": ["KK-99", "AQs+", "AKo"]
},
# 底池范围: 12BB-15BB
"12-15": {
"raise 2.1X": ["AA", "AQo"],
"call": ["KK-TT", "AQs+", "AKo"]
},
...
},
# 玩家上回合行为: raise 2.5X
"raise 2.5X": {
# 对手行为: 5bet
"5b": {
# 底池范围: 任意
"any": {
# 作出动作 all-in 时的手牌仅为 AA
"all-in": ["AA"]
}
}
},
"raise 2.1X": {
"5b": {
"any": {
"all-in": ["AA"]
}
}
},
...
},
# 玩家位置: EP2-3
"EP23" : {},
"MP12" : {},
...
}