【分享】斗地主AI算法

wojiushi3344 2012-08-05 11:21:18
加精
斗地主AI算法实现 一(拆牌)
by wojiushi3344
转载请说明出处

源代码下载
ps: 前面已经写了几篇地主游戏的基本算法实现,今天来讲讲单机地主中最重要的,也是开发中最难得AI算法实现。在此声明,本博文只适合像我一样的菜鸟阅读,高手们请别喷呀,欢迎你们留点宝贵的建议和方案,谢谢! 如果你还对斗地主游戏的其他算法感兴趣欢迎你访问这个地址:棋牌游戏开发专栏
首先我们来看一下AI的定义:

  “人工智能”(Artificial Intelligence)简称AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能研究如何用计算机去模拟、延伸和扩展人的智能;如何把计算机用得更聪明;如何设计和建造具有高智能水平的计算机应用系统;如何设计和制造更聪明的计算机以及智能水平更高的智能计算机等
----------摘自百度百科

在这里我们主要的谈论如何电脑来模拟人的思维出牌,并且实现一种具体的算法。

名词解释:

出牌手数:在假设别人都不要并且满足出牌规则的情况下,最多几次能把所有的牌出完,这几次就叫做出牌手数,你可千万别理解成这个手术哟。

首先我们可以将地主AI算法分成2部分来讨论。

今天我们来讨论第一部分:

拆牌

拆牌是地主AI中比较重要的一部分,拆牌的好坏直接影响着地主AI算法的高效问题。

我们首先还是上一张图片,这样比较直观,有利于我们以后的讨论。




为每一种牌型定义权值的大小:

单张 1

对子 2

三带 3

连牌 4 (每多一张牌权值+1)

连对 5(每多一对牌,权值+2)

飞机 6(每对以飞机,权值在基础上+3)

炸弹 7(包括对王在内)



看到这副牌,我们先按照人的正常思路来拆牌看是怎么样的。

QQQ 222

45678910J

AA

小鬼 6,4

我们现在就来讨论一种方案,看最终能达到这样的拆牌方案吗?

我们把拆牌的过程分几个步骤来讨论。

第一步:找牌

定义对应的牌型vector

vector<three> //3条

vector<lianzi> //连子

vector<duizi>//对子

vector<danzhang> //单张

vector<fly> //飞机



首先 找出一副牌中只能组成一种牌型的牌(3条,对子,单张为一种牌型。)意思就是有一张牌和剩余牌中的任何一张牌没有联系。当然是否和剩余的牌有联系是需要定义一个规则的:是否和剩余的牌能组成连子,连队。如果这2个条件都不满足那么我们称这张牌和剩余的牌没有任何联系。一般情况下通过这个步骤就能找出几张牌,这样能为以后的拆牌减轻任务量。

比如上面我们就能找出:小鬼,2,A,接下来找出牌值和他们一样的牌。即小鬼,222,AA,剩下的牌就是:QQQJ1098766544,可能有人会问为什么没有找出QQQ了,这是因为Q除了能组成3条,对子以外,还能和剩余的牌组合成连牌。这里找出来是对子最终的拆牌方案中就为对子,是连3条就是3条。3条>对>单张 于是有了我们接下来的结论。

vector<three> 222

vector<duizi> AA

vector<danzhang> 小鬼



接下来我们就来拆分剩余的牌:QQQJ1098766544

找出牌中所有的炸弹

找出牌中所有的3个

找出牌中所有的对子

根据剩余的牌我们首先提出 QQQ 66 44



我们这里可以定义对应的vector来存入我们临时找出的牌,注意里定义的vector和上面的vector是不一样的。

vector<three> QQQ

vector<two>66,44

第二步:计算每一种牌的手数和权值问题(拆牌中的难点)

分几种情况来讨论,每次只找出剩余牌中的5张连牌,然后拿这5张连牌和剩余牌依次拼接看能否组合成更长的连牌

提出牌之后,剩余的全部牌全部看做为单牌,不管是炸弹,3条,还是对子。

1 在剩余牌中提出QQQ ,J1098766544 首先找出5张单牌,从最小还是最大由你来决定。我们这里就以最小来讨论。

第一次:45678 剩余牌为 4 6 9 10 J

第二次:45678910J 46

最后拆出来的2组牌都没有联系,拆牌结束。

方案为:45678910J 4 6 QQQ
对应的权值和手数:7+1+1+3 =12 3(因为3个可以带一张或者是1对,当有对子和单张张的时候手数要减去1)

以下的几种方案也是同样的步骤,我就不写过程了,直接写最终的方案。


2在剩余牌中提出 QQQ 66
方案为: QQQ 66 78910j 5 44
对应的权值和手数: 3+2+4+1+2=12 4

3.在剩余牌中提出 QQQ 44
方案为: QQQ 44 678910j 6
对应的权值和手数:3+2+5+1 =11 3

4 .在剩余排中提出 66
方案为: 66 78910jQ QQ 5 44
对应的权值和手数:2+5+2+1+2=10 5


5 .在剩余牌中提出 44
方案为: 44 5678910JQ 6 QQ
对应的权值和手数:2+7+1+2 =12 4


6 .什么牌也不提出
45678910JQ 4 6 Q

对应的权值和手数:9+1+1+1=12 4


第三步:选出最优的一组牌作为最后的拆牌方案

通过以上步骤我们确定出了几种出牌方案,我们最后找出出牌手数最小的方案。

如果手数相同的情况下,找权值最大的一组拆牌方案。

如果2者都相同,就随机选一种就是了。(这种情况很小很小)

通过比较我们确定了下面的这一种拆牌方案。


方案为:45678910J 4 6 QQQ

对应的权值和手数:7+1+1+3 =12 3(因为3个可以带一张或者是1对,当有对子和单张张的时候手数要减去1)

最后加入我们最先找出的牌,最终的拆牌方案为:

vector<three> 222 ,QQQ

vector<duizi> AA

vector<danzhang> 小鬼 ,4,6

vector<lianzi> 45678910J



呵呵,通过这样拆出来的牌是不是很符合正常人的思维呀。

我们拆这样一种拆牌方案出来是当电脑出牌的时候用。

当然我们还需要定义一个结构体来存入每张牌能组成的所有牌型。和每种牌型的最大值,这样供以后的接牌最准备。

...全文
35862 139 打赏 收藏 转发到动态 举报
写回复
用AI写文章
139 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjhcsdn 2014-03-25
  • 打赏
  • 举报
回复
这个ai应该非常简单
ruolins 2014-03-13
  • 打赏
  • 举报
回复
javaiswhat 2014-03-04
  • 打赏
  • 举报
回复
好贴,必须支持
qinxiongxu 2014-03-02
  • 打赏
  • 举报
回复
强帖,顶~~~~~~~
brk1985 2014-01-23
  • 打赏
  • 举报
回复
mark下,很有意思。。。
什么逻辑 2014-01-08
  • 打赏
  • 举报
回复
双王、四个二、报单 怀揣酱油,低头猛走,
yungmode 2012-09-29
  • 打赏
  • 举报
回复
顶一下,不错滴说.
ETCentury 2012-08-25
  • 打赏
  • 举报
回复
学习了,这个问题从来没想过
hfwoaiwfy 2012-08-24
  • 打赏
  • 举报
回复
AI到底是神马呢
CSND_1002977 2012-08-23
  • 打赏
  • 举报
回复
谢谢,还不错的说。
liangxiaowucai___ 2012-08-23
  • 打赏
  • 举报
回复
写的真好,挡在两边的广告着实烦人
冰山之海 2012-08-23
  • 打赏
  • 举报
回复
再高级点就是要记别人的牌 某人出的牌与你的牌可以大概(有拆牌的可能)第三方有什么牌,如果第三方是敌人可以先择性出牌,第三方是自己人,可以让牌可出适当的版本让其过
magicyang87 2012-08-22
  • 打赏
  • 举报
回复
博弈算法最终都会归结到性能和准确率的折衷,以前本科毕业设计做的象棋的,比较好的算法就是能在最短时间内找到N层决策数的最优分支,不过推荐不要用STL容器,VECTOR和数组以前有比较过性能差距还是有点的
zhrquan 2012-08-22
  • 打赏
  • 举报
回复
随便看看,感谢分享
as474751729 2012-08-21
  • 打赏
  • 举报
回复
大二学数据结构的时候写过:这个电脑出牌是个很有意思的算法。
老师就是AI方向的博士,他当年说,这个算法最终要达到:玩家和电脑玩的时候,算法要分析出玩家出牌的套路和心理变化!!!意思是说也许前两局电脑输了,但是经过AI分析后,后面一般的玩家是很难再赢电脑的。我觉得有点可怕,这个完全超出了我对电脑出牌的算法要求......还有:两个电脑农民要怎么配合的问题,一个电脑农民和玩家怎么配合的问题,这些都是相当抽象的算法!
希望你继续往下写,也许会用到神经网络和机器学习方面的东西....AI,爱,唉...
zhao_999 2012-08-21
  • 打赏
  • 举报
回复
学习下,一直想研究下,就从它开始吧
wuyou2542 2012-08-21
  • 打赏
  • 举报
回复
支持!!!!
wojiushi3344 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 184 楼 的回复:]
大二学数据结构的时候写过:这个电脑出牌是个很有意思的算法。
老师就是AI方向的博士,他当年说,这个算法最终要达到:玩家和电脑玩的时候,算法要分析出玩家出牌的套路和心理变化!!!意思是说也许前两局电脑输了,但是经过AI分析后,后面一般的玩家是很难再赢电脑的。我觉得有点可怕,这个完全超出了我对电脑出牌的算法要求......还有:两个电脑农民要怎么配合的问题,一个电脑农民和玩家怎么配合的问题,这些都是……
[/Quote]

谢谢你给的建议,我想我给你篇文章的名字给取错了,不应该叫AI,但是你给的建议比较的不错,希望以后有时间的时候可以往下写写!!!
xsd1221 2012-08-21
  • 打赏
  • 举报
回复
学习了 支持下
ren1015 2012-08-21
  • 打赏
  • 举报
回复
很好,学习;了
加载更多回复(119)

33,009

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧