1 个不稳定版本
0.1.0 | 2024 年 2 月 5 日 |
---|
#312 在 游戏
用于 poker_server
85KB
2K SLoC
扑克手牌评估器
此软件包包含快速的 德州扑克 手牌权益评估器。
52 张牌中的每张牌都赋予一个整数键。
最低的9位编码牌的花色,其余的23位编码牌的面值。
这种编码,基于软件包 poker_keygen 预先计算出的键,使得可以通过一些简单的操作(求和、位掩码、位移动和表查找)唯一地识别手牌等级。
若要将此软件包用作服务器,请参阅 poker_server。
评估
查找表的构建按顺序进行
5 张牌的手牌
构建 5 张牌的查找表:five::build_tables。
这使函数 get_rank_five 成为可能。
use poker_eval::eval::five::{build_tables, get_rank_five};
// precalculate lookup tables
let t5 = build_tables(false);
// run the evaluation multiple times
let rank = get_rank_five(&t5, [31, 26, 50, 16, 49]);
assert_eq!(rank, 3971)
7 张牌的手牌
构建 7 张牌的查找表:使用函数 eval:7️⃣:get_rank_seven,该函数基于 eval:5️⃣:get_rank_five 构建:seven::build_tables。
这使函数 get_rank 成为可能。
此函数是评估玩家手牌的入口点。
use poker_eval::eval::seven::{build_tables, get_rank};
// precalculate lookup tables
let arc_t7 = build_tables(false);
// run the evaluation multiple times
let rank = get_rank(&arc_t7, [5, 4, 18, 31, 34, 48, 22]);
assert_eq!(rank, 1689)
计算
从函数 get_rank 中,实现了两个计算函数
- 确定性,即穷举的
- 蒙特卡洛
确定性
- 通过穷举模拟计算所有玩家手牌的权益。
- 这需要知道所有玩家的牌。
- 这是可行的,因为在所有情况下,模拟的次数都很小 - 且评估器快速。
use poker_eval::eval::seven::build_tables;
use poker_eval::calc::equity_det::calc_equity_det;
// precalculate lookup tables
let arc_t7 = build_tables(true);
// then you can call calc_equity_det multiple times
let equity = calc_equity_det(
// clone of Arc<TableSeven>
arc_t7.clone(),
// players cards
vec![[7, 8], [22, 27]],
// table cards
vec![51, 30, 41],
// verbose
true
);
println!("equity = {:?}", equity);
//Ok([[0.23131312, 0.10707071], [0.55454546, 0.10707071]])
蒙特卡洛
- 通过蒙特卡洛模拟计算第一位玩家的权益。
- 这不需要知道所有玩家的信息。
- 因为情况的数量可能很大,必须指定一定数量的模拟。
use poker_eval::eval::seven::build_tables;
use poker_eval::calc::equity_mc::calc_equity_monte_carlo;
// precalculate lookup tables
let arc_t7 = build_tables(true);
// then you can call calc_equity_monte_carlo multiple times
let equity = calc_equity_monte_carlo(
// clone of Arc<TableSeven>
arc_t7.clone(),
// player cards
vec![vec![8, 9], vec![11, 28], vec![]],
// table cards
vec![15, 47, 23, 33],
// number of game
100_000_000,
);
println!("equity = {:?}", equity);
// Ok(HandEquity { win: 0.3167, tie: 0.0 })
依赖
~0.9–1.5MB
~34K SLoC