[关闭]
@iamzealotwang 2015-09-06T06:34:28.000000Z 字数 3870 阅读 5382

AI-德州扑克机器人2(作弊法)

牛牛德州



AI适用范围及达到的预期


适用范围

AI适用于德州扑克游戏的 初/中 级房间
高级房和私人房不再含有AI逻辑


达到的预期

通过AI来模拟一个真实的游戏玩家,可以根据一定判断来实现,对于一局游戏执行以下逻辑


计算流程

概述

Created with Raphaël 2.1.2开始计算输赢及牌型映射特殊牌型是否Play计算输赢比率计算出牌策略Endyesno

用文字描述,步骤为:

首先由上层逻辑通过输赢判断方法确定本局当前AI是输还是赢,且AI是以什么牌型 赢/输的

检测当前牌型,如果是特殊情况则根据 特殊牌型映射关系 将当前牌型进行映射

根据 是否Play计算方法 判断出本局AI是否在拿到手牌后及放弃,如果不放弃则继续

根据输赢金额计算方法计算出本局输赢的金额,
比如最终结果为 本局赢 500金币

根据出牌策略计算方法计算出AI的出牌策略,
比如最终结果为
手牌轮 加注1回合 金额为100
翻牌轮 加注2回合 每回合为100
转牌轮 加注1回合 金额为 200
河牌轮 跟注或过牌


实际举例

根据上面的流程 最终得到 这样一个 结果描述

AI 本局赢 500
操作方式是:
手牌轮 加注1回合 金额为100
翻牌轮 加注2回合 每回合为100
转牌轮 加注1回合 金额为 200
河牌轮 跟注或过牌

举例:

进入手牌轮时候 比如当前其他玩家 都只是跟大盲注 10, 到AI操作,AI会 根据 加注方法 进行加注, 加注金额为90. 此时后续如果有人再次加注 则AI仅跟注
再比如翻牌轮,AI逻辑应该加注100 持续2回合,但是由于之前已经有人把金额提到150了,此时AI就仅加注一回合 加注50

在最最理想的情况下,在AI进行真实计算时候会 根据之前设定好的步骤执行,但是由于其他人的加注,随着根据当前公共牌的成牌不同
AI会受到其他逻辑的制约 详情见 相关逻辑


打牌时假等待

当AI真实进行操作时候,会根据操作的不同有一定的延迟(否则AI都是瞬间反应,很容易让人看出来在作弊)

操作 最少(秒) 最大(秒)
弃牌 1 2
跟注 1 3
加注 2 4

达到预期目标的处理

当AI达到预期目标以后,比如预期 本局赢300,或者输300 . 如果本局是判定AI赢 则AI会采取一直跟注的方式.
如果本局是AI输, AI会在预期金额2倍以内采取 跟注方式,否则弃牌.
比如预期AI 输300,则只要本局所支出的砝码数小于600 则AI会一直跟注,但不会主动加注
反之则会选择弃牌


相关逻辑

输赢判断方法

输赢采用加权随机的方式,比如 5个玩家(不关心是否是AI), 5人权值分别为(10,15,20,5,10) 。
则权值共计 60(10+15+20+5+10)
第一个玩家获胜的几率为 10/60 = 16.6 6%

关于如何定义权值,见 逻辑-玩家权值定义(暂无)


特殊牌型映射关系

牌型 特殊情况 映射牌型 备注
皇家同花顺 公共牌中有五张(平局) 高牌 必平局,少压,不压,放弃
同花顺 公共牌中有五张 高牌 同上
四条 公共牌中有四条 两对 以手中单张高牌赢,少压
葫芦 公共牌中有一个三张一样的(比如KKK) 一对 以手中一对或单张凑对赢
葫芦 公共牌中有葫芦(平局) 高牌 平局或以手中对子大赢,后者情况特殊舍弃
同花 公共牌中五张同花(平局) 高牌 平局或以手牌替换后大赢,后者情况特殊舍弃
三条 公共牌中已经有三条 高牌 以手牌大赢,少压,不压,放弃
两对 公共牌中已经有两对 高牌 以手牌大赢,少压,不压,放弃
两对 公共牌中已经有一对 一对 -
一对 公共牌中已经有一对 高牌 -

比如,当前AI最终判断出来的结果是以葫芦的方式赢,但是这个葫芦的牌型 形成的原因是因为公共牌上面已经存在一个做好的三条
此时就要把葫芦映射为一对,后续的逻辑全部按一对 进行


是否Play计算方法

如果转化后的(特殊牌型映射关系)最终牌型为 高牌或者一对 则 AI有 30% 的几率 在手牌轮放弃.

注意: 当AI剩余砝码数量 <= 5倍盲注时候 则忽略该判断,及本局一定会Play


输赢金额计算方法

牌型 赢(min) 赢(max) 输(min) 输(max)
皇家同花顺 10.0 10.0 10.0 10.0
同花顺 8.0 10.0 8.0 10.0
四条 8.0 10.0 8.0 10.0
葫芦 8.0 10.0 8.0 10.0
同花 5.0 8.0 5.0 8.0
顺子 4.0 6.0 4.0 6.0
三条 3.0 5.0 3.0 5.0
两对 2.0 3.0 1.8 3.0
一对 1.0 1.5 0.7 1.2
高牌 0.2 0.2 0.2 1.0

首先AI先根据当前的牌型(转换后)确定当前输赢的倍率 比如 当前AI拿到的牌是顺子,且判定本局AI赢 则 AI赢的倍率就是 4.0~6.0

第二步从该最大值和最小值之间Random出来一个数值

  1. result = Random.(4.0,6.0)
  2. result = 4.75

第三步 用玩家当前的携带金额和 该倍率 * 当前房间最大携带金额 取最小

  1. result = Math.Min(玩家当前砝码,4.75*房间最大携带)
  2. result = Math.Min(3800,4.75 * 1000)
  3. result = 3800

出牌策略计算方法

确定成牌轮
> 成牌轮指的是 达到目标牌的那轮,比如告知当前AI本局是以葫芦赢的(转化后),那就是确定AI在第几轮取得了葫芦牌(手牌+公共牌)
> 第几轮指的是 (手牌轮,翻牌轮,转牌轮,河牌轮)

确定每轮叫注次数
牌型 零次 一次 两次 三次 四次
皇家同花顺 10 20 5 5 5
同花顺 10 20 5 5 5
四条 10 20 20 5 5
葫芦 10 20 20 5 5
同花 10 20 20 5 5
顺子 10 20 20 5 5
三条 10 20 20 5 5
两对 10 10 10 0 0
一对 10 5 0 0 0
高牌 10 0 0 0 0

每轮叫住次数按加权随机方式,比如 四条的0~4次加注 权值为10,20,20,5,5 共计60. 则本轮0次加注的几率为 10/60,1次加注几率为 20/60
通过上表可以确定每轮加注次数.
注意计算时候是以当前成牌类型判断,比如AI最终成牌类型是 顺子,但是在河牌之前一直都为高牌 则之前所有论的几率 全按高牌计算

最终计算结果有可能为如下:
第一轮(手牌轮): 叫注 1次
第二轮(翻牌轮): 叫注 2次
第三轮(转牌轮): 叫注 0次
第四轮(河牌轮): 叫注 2次


确保成牌轮下注次数至少为1

比如上面的例子 假若AI是在 翻盘轮成牌的,则翻牌轮叫注次数仍旧为2,假若是在转牌轮成牌的,则转牌轮的叫注次数就要有0变成1


确定成牌轮投注的百分比
牌型 最低 最高 备注
皇家同花顺 0.6 0.8 成牌前为高牌
同花顺 0.6 0.8 成牌前为高牌
四条 0.4 0.6 成牌前为葫芦,留金额给葫芦牌
葫芦 0.3 0.5 成牌前为两对
同花 0.6 0.8 成牌前为高牌
顺子 0.6 0.8 成牌前为高牌
三条 0.6 0.8 成牌前为单对
两对 0.8 0.8 成牌前为单对
一对 1.0 1.0 成牌前为高牌
高牌 1.0 1.0 -

根据上表以及对应的牌型,确定成牌的那轮投入的金额百分比, 比如AI以四条(转化后)的方式赢牌,则

  1. 金额百分比 = Math.Random(0.4,0.6)
  2. 金额百分比 = 0.5
  3. 金额 = 0.5 * 3800(一共输赢砝码)

确定每次加注的金额
- 第一次 第二次 第三次 第四次
权重 15~20 8~15 5~10 5~10

先Random出来每次加注金额的权重,比如还是上面的例子

第一轮(手牌轮): 叫注 1次
第二轮(翻牌轮): 叫注 2次
第三轮(转牌轮): 叫注 0次
第四轮(河牌轮): 叫注 2次

第一轮 叫注1次, 则从 15~20 Random出来一个数字 比如 19
第二轮 叫注2次, 则第一次从 15~20 Random出来一个数字, 第二次从8~15 Random出来一个数字
...
以此类推

比如最终结果是

第一轮(手牌轮): 叫注 1次 (19)
第二轮(翻牌轮): 叫注 2次 (18,10)
第三轮(转牌轮): 叫注 0次
第四轮(河牌轮): 叫注 2次 (17,9)

假设 成牌是在第二轮 及 翻牌轮, 且翻牌轮需要加注 1600( 3800 * 0.5 确定成牌轮投注的百分比 ) 那 翻牌轮 每次加注金额为

  1. 第一次 = 3800 * 0.5 * 18/(18+10)
  2. 第二次 = 3800 * 0.5 * 10/(18+10)

其余轮的叫注金额算法同上


加注方法

AI每次加注时候要满足两个需求

AI 最终加注的金额为 真实玩家可以通过客户端所能操作出来的,比如在最高携带1w的房间中
玩家是无法做出 加注 5985 这种很具体的操作(除非All-IN)
或者像携带100w的房间 最后精确到会是几千, 比如 5k,5.2k 再往下的额度是不可以的
(具体的加注规则随后补充)

牌型 最低 最高
皇家同花顺 10 20
同花顺 10 20
四条 10 20
葫芦 10 20
同花 10 20
顺子 5 10
三条 5 10
两对 5 10
一对 1 5
高牌 1 5

AI每次加注时候 要根据当前的牌型

当前牌型: 指的是目前AI已经有的牌型,比如AI最终成型牌型为顺子,但是在手牌和翻牌阶段 牌型只是高牌,则按高牌算

从最低最高中随机一个数值,乘以当前的大盲

随机的目的是防止玩家从AI的加注上看出规律,比如不随机 玩家可能就会觉得 这个人每次一加注就200,而且一加注200准有大牌

然后拿当前本次加注的理论值和这个值做Max

比如当前成牌是三条,则每次加注最低为5~10个大盲,假设大盲是10 及最低加注金额在50~100之间, 用这个值随机 得到一个89
再用这个值和之前AI算出来本局应该加注值 比如是 55 取一个Max, 最终为89
再根据当前说的 需要满足真实玩家可以操作的加注金额,最终加注 90


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注