@iamzealotwang
2015-08-26T02:55:44.000000Z
字数 2085
阅读 2875
牛牛德州
AI适用于德州扑克游戏的 初/中 级房间
高级房和私人房不再含有AI逻辑
通过AI来模拟一个真实的游戏玩家,可以根据一定判断来实现,对于一局游戏执行以下逻辑
AI判断的流程用文字来描述 大概为5步
用
赢率判断逻辑
计算出当前有多大的几率会赢牌,比如最终计算结果是0.57 及 57%
比如 当前大盲是
100,剩余筹码是 300 比值则接近于 0.3333 及 33.33%
目的是防止AI在比值很大的情况下做出异常操作,比如 比值接近80% 表明此时玩家已经接近没钱了
可是前期已经跟了一轮了,此时当赢率很低时候比如20% 比较普通的逻辑是All-In
而不是很理性的弃牌(娱乐场),如果不考量这个维度,很有可能让真实玩家在此时觉得这个AI很不真实
用
AI人格特征选取逻辑
计算出当前这轮/这局中 玩家的打牌特征,比如计算结果是保守型
根据前面计算出的数据,带入
AI行为计算逻辑
中 最终得到以下逻辑中的一种
弃牌
跟注
以每次加注 100砝码 的方式加注3轮,当本轮投注砝码高于1000时候 放弃
当一局结束以后,根据
是否离开房间计算逻辑
判断当前AI是否需要离开房间
赢率判断分为手牌阶段(只有2张牌)和正式游戏阶段(玩家的牌>=5)
起手牌共计两张,可能存在的组合为 2652(52x51)
首先不考虑花色,将所有的组合(13*13=169)按类型可以分为:
类型 | 范围 |
---|---|
对子 | AA,KK,QQ --- 44,33,22 |
大连牌 | AK,KQ,QJ,J10 |
大单牌 | AQ,AJ,A10,A7 --- J8,J7 |
小连牌 | 10-9 9-8 8-7 --- 3-2 |
小单牌 | A8,A7,A6 --- 4-2 |
所有牌型分类上按照如下方式排序
对子>大连牌>大单牌>小连牌>小单牌
而类型中也按照牌面大小排序
比如 对子中 排序就是 AA , KK , QQ ...
然后再考虑是否为同花(不单独考虑花色,仅仅考虑是否为同花),则最终类型排序结果为
对子>同花大连牌>大连牌>同花大单牌>大单牌>同花小连牌>小连牌>同花小单牌>小单牌
最终会产生一个长度为 156(13*13-13 因为对子不可能同花)的序列, 用这个序列即可最终决定赢牌的比率
比如 玩家手牌拿到的是 草花J黑桃8, 按照上面的逻辑可以翻译为这个牌型是不同花的大单牌,然后
查表比如得到这个牌型所在位置是 156(由小到大排序)的第78位,则最终的手牌赢率为 78/156 = 50%
程序计算时候可以使用一个32位的int,0xFFFFFFFF
第一第二个F用来表示牌面信息,(牌面值大的放在第二个F)
牌面2-A对应0x0
-0xC
第三位对应相应的牌类型
类型 | 0x值 |
---|---|
对子 | 0x8 |
同花大连牌 | 0x7 |
大连牌 | 0x6 |
同花大单牌 | 0x5 |
大单牌 | 0x4 |
同花小连牌 | 0x3 |
小连牌 | 0x2 |
同花小单牌 | 0x1 |
小单牌 | 0x0 |
举例:
方块J黑桃9 : 0x00000697 (6 表示大连牌 9表示 J , 7表示 9)
黑桃A红桃A : 0x000008C0 (8 表示对子 C表示 A , 两个A 第二个忽略)
产生156个int值以后, push到一个index-value的Dic里面 用的时候可以直接key-value迅速查表 进行判断
就是基于5张牌面进行的判断
当在公共区有3,4,5张牌的时候,此时配合AI自己的手牌就可以凑齐一副最终牌(5张).
5张牌计算的思路大体上和2张牌类似,
所有牌型组合:
也就是一共250多万条数据,在不优化情况下判断如下
注意此时要考虑花色问题,比如4个A+1个K , K会有4中花色
类型 | 组合数量 | 备注 |
---|---|---|
同花顺 | 40 | |
四条 | 624 | |
葫芦 | 3744 | |
同花 | 5108 | |
顺子 | 10240 | |
三条 | 109824 | |
两对 | 247104 | |
一对 | 6589440 | |
高牌 | 158146560 | 4*13*4*12*4*11*4*10*4*9=158146560 |