斗地主之目前的问题

原创 2017年10月11日 08:21:16

在具备了初始的入门级打牌能力,验证了系统的可行性之后,剩下的就应该是努力提高系统打牌的水平了。由于形成初始打牌能力只用了80多条规则,而且都是非常粗略的规则,所以提高打牌能力的思路似乎比较简单:只要提高规则的精细化程度,使之尽量覆盖到各种情况就好了。所以笔者之后就一直在重复:打牌、发现不够精细的地方、增加规则覆盖这种情况。

直到某一天我却很尴尬的从这种循环中发现了个现象:打牌规则从80多条,飞速增加到了160多条,最后增加到三四百条,打牌水平不但没有什么提高,反而出现了非常明显的颠簸现象,即上一手牌好精妙、下一手牌却臭狗屎,尤其是在能看到所有牌的调试模式下,看着明明有更好的选择却打了最烂的牌,简直撞墙的心都有啦:(

可是就算把楼撞塌了也解决不了问题啊!还是老老实实想想这到底是怎么回事吧。静下心来反复思量下,其实原因也很简单:人工智能最常见的组合爆炸而已啦:(

比如,被动出牌时,即其他玩家出了手牌轮到我出了,我们的规则涉及到谁(地主、下家、对家、门板)出了什么类型(单张、对子、三张、三带二、顺子、连对、飞机、飞机带翅膀、炸弹)的什么样的牌(非常大、大、有些大、一般、有些小、小、非常小),然后我是谁(地主、下家、对家、门板)该出什么样的牌来进行应对。

简单估算下,就最简单的覆盖这些情况至少就需要:4(玩家角色)×9(牌型)×7(大小)×3(我的角色)×3(我的选择,需要根据玩家出牌来选,所以按中值估计,这还没考虑是否有炸弹、是否用炸弹)=2268种组合,这还只是被动出牌,还有主动出牌,同时也没有考虑各玩家的出牌历史、也没有考虑各农民之间该如何配合、更没考虑出某手牌是否会出现拆牌、拆炸弹等等情况。

所以,规则越精细,即规则越是针对某些情况,则规则遗漏的情况就越多,相应的一手牌能被规则覆盖住的概率就越少、被覆盖的规则条数就越少,而本质上,我们就是对一手牌用多条规则进行多角度的考察来决定其价值的,这种情况下,当某手牌恰好符合某条规则所针对的情况时,就是好牌,而当某手牌没有被有针对性的规则所覆盖,而由某条作为最终防守性质的规则捕获时,就是臭牌了:(

除了这个问题,还发现了一个非常严重的问题:同样的规则在不同局面下所发挥的作用应该是动态的。也就是说,我们最终到底出什么牌或是不要,就是看各规则对待选牌手的价值评估的大小。可这些规则所指定的价值都是固定的,无法随牌局的不同能自动调整给出的价值判断:如果地主想走,我就要不惜代价的停住他;如果地主只是想顺牌,那就没必要用太大的牌。

问题在于:这些对牌局的判断,如果不引入,显然不可能提升打牌水平,而如果引入,再结合上面说的组合爆炸问题,简直就是一个巨大的灾难啊:(

针对第一个问题,解决办法其实比较简单,就是转变规则的应用方式,使之从单一规则同时对各种状态组合考察转变为多条规则的多角度、各状态分立综合考察。而针对第二个问题,则需要模拟人类思考解决问题的办法,引入短期目标系统:

  • 判断当前局面,比如根据连门板的顶牌都压判断地主有走的企图

  • 根据对当前局面的判断形成策略,比如地主想走,则应停住地主

  • 综合目前的各策略来拟定当前的短期目标,比如根据停住地主这个策略来筛选实施规则,同时根据之前所判断出的地主走的企图的强度,确定实施强度

  • 按拟定的短期目标实施策略,即用确定的实施强度调整所筛选出来的策略实施规则的权重,通过这些规则权重的变化从而影响对牌手的价值判断,最终落实策略的实现

需要理解的是策略是对某种情况的应对,而目标则是对多个策略的综合,比如:地主想走、而对家也想走,所以下家的目标是:既要停住地主又要放走对家。而门板因为无法越过地主放对家,所以门板的目标就是顶住或停住地主。

唉,所有的规则都要重写,又得进入打牌、调整规则的死循环啦:(

====================================================================================================

关注我的公众号及时获取推送的最新文章

公众号

版权声明:本文为博主原创文章,未经博主允许不得转载。

斗地主之洗牌(shuffle)程序的测试程序

在博文http://coolshell.cn/articles/8593.html中, 皓哥已经详细讨论了各种shuffle程序, 并给出了测试的结果, 但博文中没有提供测试代码。 其实, 测试代码也...
  • stpeace
  • stpeace
  • 2015年06月24日 22:16
  • 2780

cocos2dx《单机斗地主》源码解剖之五 叫地主

发完牌,下面就该叫地主了,首先从玩家(人)开始叫地主,下一回合所有玩家(包括电脑玩家)按逆时针顺序叫地主。我们来看一下叫地主的模块: void GameScene::Call(float dt){ ...
  • oiy37215
  • oiy37215
  • 2015年02月13日 16:11
  • 1942

用java编写模拟斗地主洗牌发牌程序

package com.practice_1; import java.util.ArrayList; import java.util.Collections; import java...
  • zhangwen809877665
  • zhangwen809877665
  • 2017年02月16日 21:39
  • 382

集合框架_模拟斗地主洗牌和发牌

package cn.itcast_03; import java.util.ArrayList; import java.util.Collections; /* * 模拟斗地主洗牌发牌 *...
  • L1585931143
  • L1585931143
  • 2017年01月14日 20:46
  • 455

斗地主洗牌+发牌+排序

主要打乱牌顺序 void Shuffle() { for (int i = 0 ; i < iAllCardNum ; i ++)//iAllCardNum=54 { int p = (in...
  • OnInit
  • OnInit
  • 2015年11月03日 09:45
  • 1749

斗地主之用蚁群算法整理牌型-概述

前面我们介绍了提取人类知识然后用模糊推理来进行模糊控制。现在我们尝试下用人工智能来做斗地主。所选择的玩法规则是上海三打一,即两副牌、四个玩家。根据该规则,我们可以将整个打牌过程分为: 洗牌:这个是最简...
  • jxandrew
  • jxandrew
  • 2017年06月21日 11:02
  • 279

斗地主算法的设计与实现(五)--洗牌和发牌

本篇简要介绍如何洗牌和发牌。 这2个算法都很简单,有兴趣的同学可以写得更好一点。 关键点说明 a.洗牌算法的思路就是,构造54张牌,打乱牌N次,这个算法可能不够随机。 b.发牌算法的思路就是,从洗好的...
  • FansUnion
  • FansUnion
  • 2013年10月12日 11:29
  • 6947

深度学习零基础,如何在 9 周内实战 CNN 斗地主机器人?

微信公众号 关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 今年春招,各大公司和一众创业公司,对 AI ...
  • Mbx8X9u
  • Mbx8X9u
  • 2017年10月05日 00:00
  • 907

u3d联机斗地主(1):出牌规则

1出牌类型 enum CardType { None = 0, One = 1, Two = 2, Three = 3,...
  • luoyikun
  • luoyikun
  • 2017年01月09日 22:46
  • 946

Java实现简单的斗地主游戏

package com.westos.chinesePoker;import java.util.ArrayList; import java.util.Collections; import jav...
  • qq_38584262
  • qq_38584262
  • 2017年11月22日 10:34
  • 313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:斗地主之目前的问题
举报原因:
原因补充:

(最多只允许输入30个字)