今天 有幸在这里做一下关于斗地主AI的 JS实现讲解
在处理AI的过程中 首先 我们要对模拟人类赞牌的过程 实现机器人算出最合理的出牌路线!
在这个过程中 我们需要用到的函数
1:排序函数:PxFux 返回一个经过对牌组排序的数组 不要干涉原来的数组
2:抽牌函数:MChouPai 返回一个被抽出的片段 和 抽出后剩余的部分
3:查找存在的牌型函数:SerCh 返回查找到的单牌 火箭 对子 3张 顺子 只要它有可能存在 就加入到队列去!
4:计算Pn值函数:GetTaMax 这里的Pn值 是计算出遍历出来的牌的好坏程度 用来筛选最好的牌
5:遍历除炸弹火箭2以外的所有剩余路径:GetAllPai
6:在GetAllPai 中使用到 GetAllLast函数 该函数是计算遍历出顺子组合后 剩下的牌在进行 3张 对子 和 单牌的加入
7:GetAllSun 遍历出所有 3张 单顺 双顺 3顺的组合 (记住为机器人赞牌,我们不必要去理会 3带1 3带2 或者飞机 等情况 因为这个情况我们可以再出牌的时候依据剩余的单牌 或对牌去决定要出飞机还是3带1 我们只需要找出 3张一样的 或者顺子啊等等)
8:GetAllSunLess 遍历出所有的顺子
9:GetAll2SunLess 遍历出所有的双顺
10:GetAll3SunLess 遍历所有的3顺
以上 遍历的值 都是以阶梯式的 并不等级
好比如 有两个顺子 两个 双顺
GetAllSunLess 得到的阶梯是这样的
顺子1--杂牌
顺子1-顺子2-杂牌
双顺1--杂牌
双顺1-双顺2-杂牌
那么在GetAllSun 的函数中 剩余的杂牌 可以依照3种情况在进行排列 格式如下
|顺子2--杂牌
| 取顺子部分-+
| | 顺子2-顺子3-杂牌
| |双顺2--杂牌
顺子1--+取双顺部分 ---+
| |双顺2-双顺3-杂牌
顺子1-顺子2-杂牌
双顺1--杂牌
双顺1-双顺2-杂牌
如此类推 得到所有 顺子中的配对形式
每个末端节点 都取得一条完整的 顺子片段+没有顺子的杂牌
然后在用GetAllLast 对没有顺子的末端节点 的没有顺子的杂牌 再去取 3张 2张 1张
这样 最后返回一组没有杂牌的完整路径片段 Splt 的Array()
在用 GetTaMax 去计算PN值 取出一条合适的路径----------
以下给出 一些函数算法 ---
抽牌的函数----
查找存在牌型的函数---
在这里 处理机器人赞牌的函数
下面是遍历的所有函数========
筛选函数=========
SetTlIofo 是为该筛选路径添加而外的属性信息 这里先不介绍---
筛选的Pn值对整个AI起着很关键的作用 在这里可以用来选出一副好牌,而在后期 他还可以用来判断是否压别人 或者是否拆牌来打
是否该出大牌了 或者依靠这个值 能大概知道自己能不能打完这手牌
比如基本上Pn值在<=10的时候 估计这个牌已经很好了 甚至可以打完
或者 如果拆牌后 再对拆牌后剩下的牌进行一次赞牌 发现拆牌后的Pn 大过 没有拆的Pn 证明此次拆牌是有损失的
可以依靠损失度 适当出牌!!
调整 这个函数的一些 调水值 用合理的思路去分析调整 可以更接近真人判断~~
今天 先介绍这么多~ 以后接着介绍 主动出牌 与被动出牌~
附带一个 赞牌后的输出--
Array ( [0]=>Object Object ( [data]=>Array ( [0]=>Object Object ( [num]=>15 [txt]=>2 [key]=>1 [name]=>草花2 ) [1]=>Object Object ( [num]=>15 [txt]=>2 [key]=>1 [name]=>草花2 ) [2]=>Object Object ( [num]=>15 [txt]=>2 [key]=>1 [name]=>草花2 ) ) [type]=>3 [max]=>15 [len]=>3 ) [1]=>Object Object ( [data]=>Array ( [0]=>Object Object ( [num]=>11 [txt]=>11 [key]=>1 [name]=>草花11 ) [1]=>Object Object ( [num]=>10 [txt]=>10 [key]=>1 [name]=>草花10 ) [2]=>Object Object ( [num]=>9 [txt]=>9 [key]=>1 [name]=>草花9 ) [3]=>Object Object ( [num]=>8 [txt]=>8 [key]=>1 [name]=>草花8 ) [4]=>Object Object ( [num]=>7 [txt]=>7 [key]=>1 [name]=>草花7 ) ) [type]=>8 [max]=>11 [len]=>5 ) [2]=>Object Object ( [data]=>Array ( [0]=>Object Object ( [num]=>6 [txt]=>6 [key]=>1 [name]=>草花6 ) [1]=>Object Object ( [num]=>6 [txt]=>6 [key]=>1 [name]=>草花6 ) [2]=>Object Object ( [num]=>5 [txt]=>5 [key]=>1 [name]=>草花5 ) [3]=>Object Object ( [num]=>5 [txt]=>5 [key]=>1 [name]=>草花5 ) [4]=>Object Object ( [num]=>4 [txt]=>4 [key]=>1 [name]=>草花4 ) [5]=>Object Object ( [num]=>4 [txt]=>4 [key]=>1 [name]=>草花4 ) [6]=>Object Object ( [num]=>3 [txt]=>3 [key]=>1 [name]=>草花3 ) [7]=>Object Object ( [num]=>3 [txt]=>3 [key]=>1 [name]=>草花3 ) ) [type]=>9 [max]=>6 [len]=>8 ) [3]=>Object Object ( [data]=>Array ( [0]=>Object Object ( [num]=>14 [txt]=>1 [key]=>1 [name]=>草花1 ) [1]=>Object Object ( [num]=>14 [txt]=>1 [key]=>1 [name]=>草花1 ) [2]=>Object Object ( [num]=>14 [txt]=>1 [key]=>1 [name]=>草花1 ) [3]=>Object Object ( [num]=>13 [txt]=>13 [key]=>1 [name]=>草花13 ) [4]=>Object Object ( [num]=>13 [txt]=>13 [key]=>1 [name]=>草花13 ) [5]=>Object Object ( [num]=>13 [txt]=>13 [key]=>1 [name]=>草花13 ) ) [type]=>10 [max]=>14 [len]=>6 ) [4]=>Object Object ( [data]=>Array ( [0]=>Object Object ( [num]=>11 [txt]=>11 [key]=>1 [name]=>草花11 ) ) [type]=>1 [max]=>11 [len]=>1 ) [Pn]=>2 [Step]=>5 [nDan]=>1 [xDan]=>1 [nDui]=>0 [xDui]=>0 [dDui]=>0 [nSan]=>1 [nZha]=>0 [nSun1]=>1 [nSun2]=>1 [nSun3]=>1 [nHuo]=>0 [wDan]=>-2 [nTow]=>3 )