2.0版本的斗地主AI算法在这里就算告一段落了。
**********************完结撒花**********************
不过后续应该还会开发更智能的版本,毕竟当前版本还有很多策略没有加入。
比如说角色位置(地主上家下家打法)、比如说记牌算牌、又比如对于一些残局的分析等等。
斗地主规则看似简单,实际变幻莫测,可胜可负的局面非常多,不但涉及到基本的策略,还有配合、判断,甚至涉及到暗示与反暗示的心理战。而我想做的AI,不一定要做到最牛逼,天下无敌。因为斗地主和象棋围棋不一样,首先是非完全信息博弈。其次是非公平局势博弈。所以胜负是把控不了的,那么我想达到的效果就是符合正常人的思维,给出正常人选择的操作。从现在的2.0版本来看,和我想象中的还有很长的距离,革命尚未成功,同♂志仍需努力。
【关于枚举牌型】牌型蛮多的,所以看起来代码量很大,不过很多牌型的逻辑都是共通的,比如单牌、对牌、三不带等。像这种分支枚举不是low逼,而是让逻辑更简单,让代码更规矩。对人对机器都是好事。但是下文中飞机逻辑里我做的分支,就是100%的low逼了。
【关于飞机策略】我最恶心的就是飞机,这个东西真的烦死。首先就是长度不确定,带出去牌的个数不确定而无法统一构造出带出牌的序列。其次就是飞机打破了很多种策略上本应可以筛选的情况。比如说飞机里面可能存在炸弹,又比如说3连飞机带了3张相同的牌。看起来蛮怪的,但是实际对局中这种策略确实有可能成为最佳选择,所以不能忽视。
【关于权值设计】权值的设计我想了很久,也改了很多次,因为确实有些地方价值赋予的不是很公平。尤其是考虑拆分价值的时候,因为原来我的想法是考虑该牌型拆分后与不拆分的双重价值。举个例子,AAAKKK其实拆成两手出威力也很大。但是因为后期必须要考虑到轮次参数,计算权值的时候就不能再把拆分价值算进去了,不然四带二什么的权值爆炸。但是不考虑拆分价值又感觉有点对不起222等牌型。这也是我时至今日也很苦恼的一点。
【关于地主叫分】地主叫分策略里我只考虑了权值而不考虑轮次,因为实际打牌中其他两个人确实会针对你进行出牌,地主必须保证要有绝对的控手能力。确实我们实际玩牌时是否叫地主还是取决于你大牌的数量的。
【关于嵌入交互】交互相关的代码就不放出来了,根据自身实际的需求而定吧。我个人比较喜欢的方式是生成一个服务当做一个伪客户端。当然也可以封装成类库供调用,像我现在使用的方式是skynet里lua脚本调用类库,数据以json串形式传递。或许哪天闲着了我也会封装一个lua特有的库。这样通过struct lua_State交互数据会更可视化一些。
最后强调一下,策略中带有我自己本人主观因素太多,比如说炸弹拆分处理等。我给出的策略并非斗地主游戏最佳策略,所以希望大家如果引用的话最好根据自己的想法稍作修改。
就先这样吧,非常感谢你的观看,同时也非常希望可以给我一些建议或针对一些问题进行讨论。
可以加QQ 1397097104 微信 nine_sun666或者评论留言。