求助のPC版和手机版欢乐斗地主免费版2017区别

8723人阅读
C/C++(46)
棋牌算法(29)
转眼间快到了五月,帝都的天气也变的非常梦幻。 时而酷暑炎热,时而狂风席卷。
而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华。
世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂寞。
或许AI就是因此而生吧,因为到了最后,能一直陪伴我们走下去的,或许也就只有程序了。
好吧不装逼了,近期在研究skynet服务器框架,里面有斗地主的demo,于是想做一个嵌入式的AI逻辑,目前的计划只用于托管处理业务。当然也有做机器人调度服务的想法,前期也算是把网上好找的相关文章看了个遍,收获还是蛮多的,这里就不一一致谢了。
下面步入正题
——————————————————————
相信大家已经对斗地主游戏及其玩法不陌生了。对于玩家而言,我们所做出的操作也就只有三种,分别是:叫地主,主动出牌,被动出牌。之所以把主动出牌和被动出牌分开讲,因为从逻辑方面两者差别还是蛮大的。主动出牌没有牌型限制,而被动出牌则必须出指定的一种牌型或炸弹、王炸。显然,当你处于被动出牌的阶段时,可供你选择的操作本身就很少,就算你枚举出所有情况也是可以的,而主动出牌一般就不能这么搞了,这点从各大斗地主游戏平台提供的提示策略也能看出来。
所以从业务的角度来说,我们主要需要完成叫地主,主动出牌,被动出牌这三种处理逻辑。
再分别看这三种处理:
叫地主:叫地主还算比较简单,无非就是通过一系列的计算,得出手牌的一个价值,我们先简称这个计算函数为F,即根据F(手牌)返回的这个价值分一下区间,然后返回一个叫分值(1分2分3分)
主动出牌:主动出牌所做的工作是筛选出当前形势最佳的出牌决策,显然,这个筛选的标准就是如何打出一手牌使得接下来手牌的价值最高,我们可以认为主动出牌的逻辑为:先列举了N种出牌策略,然后通过计算F(剩余手牌),选择返回值最高的一种策略。另外,若只剩一手牌,那么即可直接打出获胜。
被动出牌:被动出牌第一步便是排除多个不合法的出牌类型,可想而知,排除之后可供参考的选择回变的非常少,然后接下来便和主动出牌类似,选择打出一手牌使得剩余价值最高,与主动出牌不同的是,被动出牌可以选择不出牌,比如,,当你可以打对7的时候你不一定要打,因为打了之后接下来的手牌会变的更难出。所以需要对比考虑一下出牌的收益,对比的方法也是看看原手牌的价值与出牌后的价值关系。
通过上述逻辑,我们可以整理出整体的业务流程
那么现在大体的解决方案框架我们已经确定了,重点的问题就是这个手牌价值如何计算。
第一,不同的牌根据其点数首先就要有一定的价值区分,王和3的价值肯定是不一样的,比如说大王的价值是+10分,3的价值是-10分等等。
第二,斗地主存在很多牌型,且三牌四牌还可以带出其他的牌,炸弹王炸又可以通管,所以不同的牌型要有自己的价值体系
第三,一手牌也很有可能拆分成两手,举个例子,当你就剩四张牌时,你认为QQQ3和QQQ2的价值是否相等呢?
这三个问题实际上反映的就是【单牌】【组合牌】【整手牌】三者之间的关系。
由上可知:①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样。③整手牌可以分成若干个组合牌,但分法不唯一。
那么如何解决这三个问题呢?首先①和②我们大概可以想到,可以直接去定义。③就比较复杂,因为拆分的方法不唯一,所以需要筛选出一个最优解,这个最优解如何得到呢?
一定是这些拆分出来的组合牌的总和。也就是,当我们只剩一手牌的时候,我们可以通过组合牌的价值定义直接赋予他价值。若非一手牌,则打出一手牌然后继续计算。
不难看出,这是一个递归,递归的出口即只剩一手牌的时候。再看,打出一手牌这一步,是不是和主动出牌的计算最佳决策类似?那么我们现在可以确立这个解决方式。
假设:F()为计算当前手牌的价值 & G()为主动出一手牌使接下来的牌价值最大
G()的实现方法是选出若干个F(剩余牌)返回值最优的那个
F()的实现方法是若剩余牌可以一手打出,返回其组合牌价值,否则 F(手牌)=F(G())+F(手牌-G())
以上就是针对斗地主AI实现方法的基本概念,业务逻辑确立之后,我们便可以进行开发了。
敬请关注下一章:斗地主AI算法——第二章の数据结构
访问:176536次
积分:3512
排名:第11173名
原创:166篇
评论:53条
文章:107篇
阅读:107175
(3)(10)(6)(2)(5)(8)(9)(2)(6)(19)(3)(4)(9)(82)求苏南的花庚文暗恋恋の生,斗地主,沦陷txt版本!感谢!_百度知道
求苏南的花庚文暗恋恋の生,斗地主,沦陷txt版本!感谢!
暗恋恋の生,斗地主!!@qq,沦陷好像后两个没有完结,就请传个我目前出来的版本就好!感谢求苏南王道文
不是一下几百篇打包的那种哦!注意是好看的哦,感谢!不过,最主要的是这题目上的三篇哦除了这三篇,发一些其他好看的庚的王道文给我也好啊
我有更好的答案
亲要吗,发电邮给我讲。我发给你@QQ?要的话我只有暗恋恋の生
采纳率:45%
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。3340人阅读
C/C++(46)
棋牌算法(29)
第一章业务逻辑结尾部分我提到了权值的计算方法:
①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样。③整手牌可以分成若干个组合牌,但分法不唯一。
当时,我说了①和②可以直接定义,③需要迭代计算。所以本章的主要内容就是确定基础价值&组合牌型的价值定义
对于牌型权值的定义看似简单,实际却需要大量的推敲。这就跟游戏里不同英雄属性、技能反复修改一样。事实上,直至整个工程开发完毕,我还在修改权值定义,因为这是唯一影响逻辑处理的因素。如果你觉得程序返回的出牌策略不太符合你的想法,那么一定是权值定义这里出现的问题。
首先,网络上有很多文章统计出不同牌型出现的概率,但是我始终觉得,对于斗地主而言,一种牌型出现的概率并不是那么重要,举个例子。我认为33和3的价值是一样的。
因为大多数情况你出了都会被管,若你有飞机,这两者都可以被带出。或许从概率的角度来说能管上33的牌会更少,但事实上,对方究竟管不管你,用什么管你取决于对方的牌型组合。你出33,对方可以出44,但是你出3,对方不一定会出4管你,因为这样他还会剩下一个4,他会用其他的牌管你,并且,若该牌型很难出现,即被管的可能性很低,那么他管上别人的可能性也很低。所以实际上这种牌型的收益可以近似的等于不存在。况且我也不想搞一套很复杂的公式,我的想法是用一些简单的公式得出一个中肯的价值,或许不是那么的公平,但至少程序应对绝大部分局面都能给出比较正确的操作。
首先,我们有出牌轮次的定义,我们尽量使得出牌轮次少一些,还是那句话,所以对于牌型,大家是公平的,你组成这种牌型的几率低,但你管别人的几率也低。你若想出去,还是要用其他的牌抢占先手再打出,所以这种牌型不会给你带来抢占出牌权的收益。那么他的好处或许是能让你快速的出完牌,减少出牌轮次。
然后就是牌的基础价值定义,牌的价值一定有正有负,我也是经过一些测试及计算,确定了价值为0的位置是10。
我们有15种牌型,从值域来说是3~17。那么10属于最中间的位置,还有就是我们经常管10以上的牌称作带“人”的牌(因为JQK有人图案)。我们认为带“人”的牌都是干部,是可以管别人的。
或许有人会说,王比其他牌型少,且人家若成了王炸又不可能拆开出。但实际玩牌的时候王牌管单出现的几率和其他牌差不多,因为其他牌也需要考虑是否组成对牌、三牌、顺子等情况。大家的拆分选择可以认为近似公平的。至于牌少的问题,你想想你一局游戏实际打单牌的次数也没多少次。况且,基础价值是应用于所有类型的牌值的。但他不能说明一切问题。他只是表示当你的牌值大于10以上,你管上别人的概率高,反之,你被管的概率高。
根据这个思路,我们暂定单双三等牌型的价值就是这个基础价值。也就是3的基础价值是-7 &大王的基础价值是7
根据这个基础价值,我们便得出控手(轮次)的价值。因为最大负牌值是-7,所以控手价值是7,这个应该不难理解把。因为你若想打出一个3,你就必须得抢占一次控手机会。然后再打出3。同理,一次控手机会可以出一手牌,所以单个轮次的价值也是7,若你的牌型组合价值大于7,则认为你这种牌型可以创造一个轮次,举个简单的例子 王炸。
接下来是顺子的定义。顺子权值的思路我也犹豫了好久,最后决定是其最大牌的单体价值+1,因为2不参与顺子。至于王就不考虑了。原来考虑到是否要采用平均值等,后来发现顺子到底能否被管以及管别人,主要决定于最大的牌,比如说你从3~A和从10~A是一样的。管别人的话也不是越长越好,你长顺子强行管短顺子可能还会多出很多单牌。
对于四带二、飞机等定义,是修改最多的。的确这样的牌很难被管,所以我给了他一个非负价值,但是又发现其价值很大,比如说KKKQQQJJJ他的价值已经飙到11了。
那么程序给出的策略就是 分开打,因为KKKQQQ也是飞机。一个轮次的价值是7,远小于11。所以可以拆成两个轮次。鉴于这一点,我把价值调成为非负且除以2
这样这类牌型的价值永远不会大于7,毕竟这种牌型能一手出完不能分成两手出。而且根据之前的逻辑,你很难被管所以你也很难管别人,那么正价值收益缩减也是很自然的了。
最后说一下炸弹及王炸,炸弹无负价值且+一个轮次7,因为我们认为炸弹大概率能抢占一局轮次。而炸弹及王炸没有正价值收益缩减的原因是处于信仰把,尽量的不要拆分。也符合我们人性。我们都是把炸弹、王炸看成最重要的。
还有,在此之前我有想过权值定义取不拆分和拆分的最大价值。比如说3A带俩2,那么其实俩2的价值也很高,后期很有可能拆开打。但是最后因为引入了手牌轮次参数,所以不考虑拆分价值了。不然四带二的价值爆炸。
下面给出目前暂定的定义方案
/*评分逻辑思维:
0.由于新策略引入手牌轮次参数,所以不再考虑拆分价值。
1.牌力基础价值:我们认为10属于中等位置,即&10单牌价值为负,大于10的单牌价值为正
2.控手的价值定义:我们认为一次控手权可以抵消一次手中最小牌型,最小牌型(3)的价值为-7,即我们定义一次控手权的价值为7
3.单牌的价值定义:该牌的基础价值
4.对牌的价值定义:我们认为对牌与单牌价值相等(均可以被三牌带出)故其价值为该牌的基础价值
5.三牌的价值定义:
该牌的基础价值
我们认为通常带出去的牌价值一定无正价值故其价值为该牌的基础价值
我们认为通常带出去的牌价值一定无正价值故其价值为该牌的基础价值
6.四牌的价值定义:
我们认为炸弹会享有一次控手权利且炸弹被管的概率极小,故其无负价值,非负基础价值+7
四带二单:
我们认为四带二单管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)
四带二对:
我们认为四带二对管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)
7.王炸的价值定义:已知炸2价值为15-3+7=19分,故王炸价值为20分。
8.顺子的价值定义:
我们认为单顺的价值等于其最大牌的单体价值,且2不参与顺子,故顺子的权值依次提升1
我们认为双顺的价值等于其最大牌的单体价值,且2不参与顺子,故顺子的权值依次提升1
飞机不带:
由于飞机牌型管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)
飞机带双翅: 由于飞机牌型管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)
飞机带单翅: 由于飞机牌型管人与被管的概率极小,故其无负价值,其价值为非负基础价值/2(该值最大为6小于一个轮次7)
9.根据数值分布,我们暂定:
&10不叫分,10-14叫一分,15-19叫两分,20以上叫三分
PS.以上逻辑纯属扯淡,谁信谁SB。。。。。
以及封装好的获取价值函数
/*封装好的获取各类牌型组合结构函数
CardGroupType cgType:牌型
int MaxCard:决定大小的牌值
int Count:牌数
返回值:CardGroupData
CardGroupData get_GroupData(CardGroupType cgType, int MaxCard, int Count)
CardGroupData uctCardGroupD
uctCardGroupData.cgType = cgT
uctCardGroupData.nCount = C
uctCardGroupData.nMaxCard = MaxC
//不出牌型
if (cgType == cgZERO)
uctCardGroupData.nValue = 0;
//单牌类型
else if (cgType == cgSINGLE)
uctCardGroupData.nValue = MaxCard - 10;
//对牌类型
else if (cgType == cgDOUBLE)
uctCardGroupData.nValue = MaxCard - 10;
//三条类型
else if (cgType == cgTHREE)
uctCardGroupData.nValue = MaxCard - 10;
//单连类型
else if (cgType == cgSINGLE_LINE)
uctCardGroupData.nValue = MaxCard - 10 + 1;
//对连类型
else if (cgType == cgDOUBLE_LINE)
uctCardGroupData.nValue = MaxCard - 10 + 1;
//三连类型
else if (cgType == cgTHREE_LINE)
uctCardGroupData.nValue = (MaxCard - 3 + 1)/2;
//三带一单
else if (cgType == cgTHREE_TAKE_ONE)
uctCardGroupData.nValue = MaxCard - 10;
//三带一对
else if (cgType == cgTHREE_TAKE_TWO)
uctCardGroupData.nValue = MaxCard - 10;
//三带一单连
else if (cgType == cgTHREE_TAKE_ONE_LINE)
uctCardGroupData.nValue = (MaxCard - 3 + 1) / 2;
//三带一对连
else if (cgType == cgTHREE_TAKE_TWO_LINE)
uctCardGroupData.nValue = (MaxCard - 3 + 1) / 2;
//四带两单
else if (cgType == cgFOUR_TAKE_ONE)
uctCardGroupData.nValue = (MaxCard - 3 ) / 2;
//四带两对
else if (cgType == cgFOUR_TAKE_TWO)
uctCardGroupData.nValue = (MaxCard - 3 ) / 2;
//炸弹类型
else if (cgType == cgBOMB_CARD)
uctCardGroupData.nValue = MaxCard - 3 + 7;
//王炸类型
else if (cgType == cgKING_CARD)
uctCardGroupData.nValue = 20;
//错误牌型
uctCardGroupData.nValue = 0;
return uctCardGroupD
注意!!!以上价值定义是作者本人主观意愿,并非斗地主游戏最佳策略,请大家遵从自己的内心适当修改~~
好了,权值定义做完后,我们便可以实现比较重要的一个模块了,即手牌总价值计算函数,也就是我一直说的F()算法函数。
敬请关注下一章:斗地主AI算法——第五章の总值计算
访问:176538次
积分:3512
排名:第11173名
原创:166篇
评论:53条
文章:107篇
阅读:107175
(3)(10)(6)(2)(5)(8)(9)(2)(6)(19)(3)(4)(9)(82)万能豆游戏
Flash 游戏
使用其他账号登录
抵制不良游戏&&拒绝盗版游戏&&注意自我保护&&谨防受骗上当&&适度游戏益脑&&沉迷游戏伤身&&合理安排时间&&享受健康生活 --《》
游戏中使用到的游戏币、门票等均为游戏道具,不具有任何财产性功能,只限用户本人在游戏中使用。本公司对于用户所拥有的游戏币、门票不提供任何形式的官方回购、直接或变相兑换现金或实物等服务及相关功能。本公司严禁用户之间在游戏中及线下进行任何相互叫卖、转让游戏币等行为,如一经查出则永久封杀,账户清零。
通用网址:联众世界
中国计算机信息网络国际联网单位编号:37 | 网站备案号: 京ICP备号-2
京ICP证080029号
批准文号:科技与数字[2013]20号 | ISBN号:ISBN 978-7- | 公安机关备案号:38
北京联众互动网络股份有限公司版权所有(C)2014 | 北京联通提供网络带宽}

我要回帖

更多关于 斗地主网页版 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信