[关闭]
@iamzealotwang 2015-08-26T02:55:44.000000Z 字数 2085 阅读 2875

AI-德州扑克机器人

牛牛德州



AI适用范围及达到的预期


适用范围

AI适用于德州扑克游戏的 初/中 级房间
高级房和私人房不再含有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是否需要离开房间


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张牌类似,

所有牌型组合: C(552)=2,598,960

也就是一共250多万条数据,在不优化情况下判断如下

注意此时要考虑花色问题,比如4个A+1个K , K会有4中花色

优化逻辑
类型 组合数量 备注
同花顺 40 410=36 (4种颜色*9种可能)
四条 624 13412=624
葫芦 3744 413612=3744
同花 5108 4C(513)40=5108
顺子 10240 1044444=10240
三条 109824 413412411=109824
两对 247104 613612411=247104
一对 6589440 613412411410=6589440
高牌 158146560 4*13*4*12*4*11*4*10*4*9=158146560
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注