Created
February 22, 2012 20:40
-
-
Save greeness/1887114 to your computer and use it in GitHub Desktop.
dou di zhu
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
斗地主人工智能 [2007-3-7] | |
http://www.ylog.net/blog_show.asp?log_id=2148 | |
近一周在制作斗地主纸牌游戏的人工智能 | |
算法主要是用宽度优先生成一棵搜索树 | |
再根据玩牌的技巧进行剪枝与判权.... | |
节点权值判断主要由有限状态机构成 | |
剪枝是非常重要的,刚写成时生成的树居然有几百万个结点 | |
经过一天的剪枝后,平均只有十万左右了 | |
======= | |
汇报一下,AI的部分基本做完了. | |
这个AI比较好的实现是进行广度优先搜索,然后估价,如果搜索足够的层,就能找出最优解 | |
因为我是做手机游戏,资源有限,所以一开始就放弃了硬搜索的方法. | |
经高人指点,最后采用了一种类似贪婪法的方法对牌进行估价,效果还可以 | |
实现思路是这样 | |
给每种牌型一个权重基数,然后用这个基数和该牌型的张数算一手牌的权重值. | |
每次从手中所有牌中找出一手权重最大的牌 | |
一直到所有牌被划分为若干手,能得到一个手中牌的权重值的和 | |
==== | |
主动判断是更为复杂的逻辑性判断,即从当前存在的数据中分析,做多次对比后进行状态机的跳转。如“斗地主”中,对手中牌进行分析,达到最小出牌次数,最大出牌量,减少被压制性出牌的可能性的判断。从炸弹到顺子到单牌的出牌,以及对应的方案进行详细分析。这可能需要另一个机制---模糊逻辑的参加才能达到效果,当我们预先把所有数据进行整理后就能清晰看见大致的出牌顺序。这样就有了主动的状态性。当在游戏中,对方使出了招数进行压制,这时就会出现另一套状态机制,被动状态。这里又需要有一套逻辑进行分析,使之返回到主动状态。。。 | |
无论被动状态还是主动状态,这也只是状态机的一级,进行二级后需要对每次出牌或压制式出牌进行第二论逻辑判断,并需要对每次手中牌再次进行分析。得到最佳出牌方案。当然上述也只是思想中的一种模型,实例化还需进一步的测试得出结果. | |
==== | |
http://blog.csdn.net/wj008/article/details/5061629 | |
======= | |
http://blog.sina.com.cn/s/blog_7855dce90100u1qq.html | |
全新四人斗地主AI实现中 (2011-09-10 15:25:10)转载▼ | |
标签: 杂谈 | |
四人斗地主的规则是由中国象棋棋王胡荣华总结和定型的,主要流行于浙江、江苏和上海,使用两副牌,包括两张大怪和两张小怪共108张。每个玩家发25张牌,留8张底牌给地主,地主独自拿到33张牌,来对抗其他三个农民。 | |
斗地主游戏的计算机实现,已经有很多版本。有很多文章介绍人-机斗地主游戏的人工智能。本博客准备采用全新的算法,实现更加合理的出牌逻辑。这种算法除了考虑牌型外,还考虑牌型的控制力,以及这种控制力的动态变化。这样可以达到,从严格意义讲,计算机的胜率会很高。 | |
http://blog.sina.com.cn/s/blog_7855dce90100u2nb.html | |
斗地主算法逻辑中的天之道 (2011-09-11 20:24:51)转载▼ | |
标签: 杂谈 | |
声明:本博客的文章,主要是探究斗地主游戏算法的计算机实现。顺便介绍其中的本质性内容。如有游客照此操练,输了家当,本博客概不负责。 | |
要在一轮斗地主游戏中获胜,手持的牌,需要具备一定的条件。首先是各中牌型需要有控制力,通常,炸弹、顶级牌型是有控制力的牌;其次,各种牌型的资源消耗要足够小。请看下面的例子,来深入理解这段话。 | |
为简化问题的描述,假设是双人游戏,用红方与黑方来表示。红方手持7、6、5三个单子,而黑方手持8、6、5三个单子,轮到红方出牌。在此残局中,红方先出6能获胜,出5、7都失败。看起来很简单,但为什么出6能获胜,这其中包含的道理是什么? | |
要说清楚其中的道理,先要做点铺垫工作。 | |
首先我们假设,对于最小的单子3,当发出这张单子后,如果要收回控制权,那么手中必须要有顶级大牌,通常,对于单子,顶级大牌就是大王(暂时不考虑炸弹),这时,我们就定义,3消耗了一个完整资源,反过来,也就是说,3的资源产生能力为负值,我们用记号3(-1)来表示。括弧中的-1表示负资源。 | |
以此类推,单子5,6,7,8的资源产生能力简记为 5(-0.9)、6(-0.8)、7(-0.7)、8(-0.6)。这样假设后,通过简单累加括弧中数字,我们就可以得到红方与黑方的资源产生能力,如下, | |
红方资源产生能力 = 5(-0.9) + 6(-0.8) + 7(-0.7) = -0.9 - 0.8 - 0.7 = -2.4 | |
黑方资源产生能力 = 5(-0.9) + 6(-0.8) + 8(-0.6) = -0.9 - 0.8 - 0.6 = -2.3 | |
另外,黑方的8,在此残局中,是顶级大牌,属于具有绝对控制权的一张牌,其资源产生能力是正的,算作+1,这样: | |
红方资源产生能力 = -2.4, 黑方资源产生能力 = -1.3. | |
从上面的两个数字中可以看到,红方牌的资源产生能力比黑方弱,表面上看,红方似乎必败。当然,如果是黑方先手,黑红具有资源优势,只要黑方不先出8,红方是没有赢的可能的。这里,红方具有优先决定权,他需要决策出哪张牌。那么红方的决策依据是什么? | |
我们来观察双方各自出掉一张牌后的,手中持有牌的资源产生能力, | |
红方 | |
出牌/ 剩余牌的资源产生能力 | |
5 -1.5 | |
6 -1.6 | |
7 -1.7 | |
黑方 | |
出牌/ 剩余牌的资源产生能力 | |
5 -1.4 -0.4(加算牌张8的绝对控制力) | |
6 -1.5 -0.5(加算牌张8的绝对控制力) | |
8 -1.7 -2.7(加算牌张8的绝对控制力) | |
上述计算结果,我们用图表来表示,看得更清楚一点 | |
从上图,我们可以看到,当黑方某牌张消失后,黑方剩余牌的资源产生能力将严重恶化,至少不比红方占有,此变化点出现在第二手牌之后。这是黑方的死穴。这样,红方的决策目标就是寻找这样的死穴。 | |
红方先手出5,黑方盖过6后,黑方剩余牌的资源产生能力仍然强于红方。而红方先手出6后,黑方的任何决策都将导致资源产生能力的严重恶化。这充分体现了老子在道德经中所描述的“天之道损有余而补不足”,用在此场合,就是要消耗对方的资源。 | |
实际上,在斗地主过程中,各位游客也都是这样实践的。这篇文章要说的一个规律是,手持三手同种牌型的先手方,出中间张,胜算概率最大。 | |
斗地主中庸之道 (2011-09-12 14:58:13)转载▼ | |
标签: 杂谈 | |
声明:本博客,旨在探究斗地主游戏算法的计算机实现。顺便介绍游戏技巧。如有游客照此操练,输了赌局赔了钱,本博客概不负责。 | |
这篇博文,介绍”三单子出中间张“这一规律的形式证明。作为结论,取中庸之道,游戏获胜的概率大。对证明过程不感兴趣的游客,请跳过此博文。 | |
前文《。。。天之道》引入了两个基本概念,牌张的控制力和牌张的资源消耗力。控制力描述对牌局的控制能力,如手中的大牌;而资源消耗力,描述的是一张牌出手后,重新夺回控制权需要消耗的资源。理论上讲,在不考虑炸弹、牌张顶死情况下(这些情况,放在后续博文讨论),大王具有绝对控制权,我们可以说,大王的资源消耗力为0;对于最小的牌3,它的资源消耗力可以被定义为-1; | |
我们用R(X)来表示牌张X的资源消耗力,那么R(大王) = 0, R(3) = -1; | |
对于大王、小王、2AKQJT9876543顺次排列的各张牌,假定各张牌的消耗力符合线性规律。那么,对于任何牌张X,存在表达式R(X) = ( 17 - X ) * k; 其中 k = -1/14,表示线性分布的斜率。 | |
如果手持X、Y、Z三张单子,那么,资源消耗力是R(X)、R(Y)、R(Z)的和,简记为R(X,Y,Z)。不难证明R(X,Y,Z)=51*k - (X+Y+Z)*k; | |
继续采用前文的残局例子,红方手持5、6、7三张牌,黑方手持5、6、8三张牌,我们用r、R分别表示红方、黑方资源消耗力。这样: | |
r(5,6,7) = -2.36; R(5,6,8)= - 2.29; | |
当红黑各方出手一张牌后,其手持牌的资源消耗力分别为: | |
红方:r(5,6) = -1.64, r(5,7) = -1.57, r(6,7) = -1.50; | |
黑方:R(5,6) = -1.64, R(5,8) = -1.50, R(6,8) = -1.43; | |
上述计算结果,我们用下图来表示。其中横向表示出牌方向,纵向表示资源消耗力。 | |
上图表示,只要黑方的资源消耗力态势与红方存在交叉,红方合理选择出手的第一张牌,红方就有可能获得优于黑方的资源优势。r(5,7)真是体现这种优势的一手牌。关于这张图的更一般性解释,在这里,博客要埋设一个关卡。有兴趣的游客不难通过其他例子来获得中庸之道的秘密。 | |
============ | |
克牌的存储方式 (2011-09-12 15:35:15)转载▼ | |
标签: 杂谈 | |
一张扑克牌的面值及花色用一字节表示,高四位表示花色,低四位表示面值。如高四位1、2、3、4、5分别表示黑桃、红桃、方块、梅花、王牌。低四位从0x00到0x0C,分别表示123456789,10JQK。大王0x5E,小王0x5D。 | |
这样一副牌就可以表示为: | |
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1A,0x1B,0x1C(黑桃) | |
0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C(红桃) | |
0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C(方块) | |
0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x4B,0x4C(梅花) | |
0x5D,0x5E(王牌) | |
这样表示后,游戏AI的编制非常方便。 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment