
游戏算法
文章平均质量分 81
游戏相关算法
九日王朝
技术是谋生的手段,而不是生命的全部。过分沉迷技术只会让人坠入深渊和绝望,人生应该追求的是智慧与认知。
与其劳碌拼搏匆匆过完一生,应该把更多的精力用于了解这个世界,锻造通透豁达的内心。才能得以善终。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
node.js——麻将算法(七)简易版麻将出牌AI2.0
*文本为上一篇博客http://blog.youkuaiyun.com/sm9sun/article/details/77898734的部分追加优化上一篇博客已经实现了基本的出牌逻辑,大部分情况能够给出正确的策略选择,但经过了一些测试,仍发现了几个严重的问题:问题一:当手牌无闲牌时,偶尔会将完整的一组牌拆开打出。例如:二万、四万、七万、八万、三筒、五筒、一条、二条、三条、九条、九条可能会打原创 2017-09-25 14:27:07 · 8615 阅读 · 5 评论 -
node.js——麻将算法(六)简易版麻将出牌AI1.0
普通麻将的出牌AI如果不是要求特别高的话,其实蛮容易实现的,毕竟大多数人打牌都只是看自己的手牌。所以作为简易版的AI,出牌的策略只要奔着胡牌去就可以了。我们能想到的就是把相邻或相同的牌凑到一起,把单独的牌打出去。以这个思路打牌,就会慢慢接近听牌至最终的胡牌。我们简单举个例子,我们有1万2万,那么我们认为其打出去的优先级要高于单独的牌,因为其只需要1个三万就可以凑成一组了。这种思路实际很原创 2017-09-08 21:22:42 · 9956 阅读 · 5 评论 -
node.js——麻将算法(五)胡牌算法的一些优化处理方案(有赖子版)
以前有赖子判胡算法http://blog.youkuaiyun.com/sm9sun/article/details/65632646以前的帖子说明了处理赖子的两种方案:枚举代替及插空补缺,并最终选择了枚举遍历方案,因为当初考虑的是通过GetAppointList方法已经会剔除大多数无关联的牌了,且后期大家通过吃碰杠等也会减少手牌,姑且认为n的值为10,因为大多数麻将四个赖子直接胡。所以三原创 2017-09-01 18:11:41 · 7924 阅读 · 3 评论 -
node.js——麻将算法(四)胡牌算法的一些优化处理方案(无赖子版)
回想三月份刚接触棋牌时写过一些麻将的算法,转眼间半年过去了,回顾下曾经的代码,写的还真是蛮low的http://blog.youkuaiyun.com/sm9sun/article/details/65448140 以前无赖子判胡算法针对于半年前写的算法,CanHuPai_norm函数第一步就是剔除对子(即将牌),由于是将全部牌数组整体考虑,所以每个大于等原创 2017-09-01 16:03:31 · 5645 阅读 · 1 评论 -
node.js——麻将算法(三)胡牌相关明牌
最近在做一款叫做“卡五星”的三人麻将,来自湖北,麻将里只有筒和条(没有万)以及中发白这些牌。其他的特殊功能暂且不提,其中有一个需求是玩家听牌后需要将与胡牌有关系的牌显示出来给其他玩家看。举个例子,比如说我的手牌是1234677筒,此时我胡5筒(4,6),那么就要讲4筒,6筒显示出来。又比如7888筒(胡6,7,9筒),就要讲7888都显示出来。放组样例图:开始接到这原创 2017-06-11 12:03:59 · 2215 阅读 · 1 评论 -
lua——牛牛牌型处理相关算法(下)——牌型比较
牛牛的比牌规则为:单牌比较: k>q>j>10>9>8>7>6>5>4>3>2>a。花色比较:黑桃>红桃>梅花>方块。牌型比较:无牛无牛牌型比较:取其中最大的一张牌比较大小,牌大的赢,大小相同比花色。有牛牌型比较:比牛数;牛数相同庄吃闲。牛牛牌型比较:取其中最大的一张牌比较大小,牌大的赢,大小相同比花色。银牛牌型比较:取其中最大的一张牌比较大小,牌大的赢,大小相同比原创 2017-05-24 15:58:00 · 8084 阅读 · 1 评论 -
lua——牛牛牌型处理相关算法(中)——牌型判定
牛牛的牌型按从小到大的顺序分为:无牛算牛的方式为:先选出三张牌,若能组成十的整数倍 即为有牛,然后再看剩余两张牌除以十的余数。余几就是牛几,若正好也能整除十,即为牛牛。若无法选出三张组成十的整数倍的牌即为无牛。银牛:1张10 加4张大于10的牌金牛:5张大于10的牌炸弹:存在四张相同的牌五小牛:五张牌总数值相加小于等于10首先定义牌型,因为客户端不同数的牛显原创 2017-05-24 15:45:20 · 9797 阅读 · 1 评论 -
lua——牛牛牌型处理相关算法(上)——牌值数据
这几天又做了牛牛游戏,在这里把相关算法写一下,与前几天写的赢三张的基本类似,所以大家也可以参考前几篇博客。牛牛是一种简单却又非常有意思的棋牌游戏,主要是采用一副扑克牌其中的52张(除去大小王);第一局的庄家是随机产生,而后每局的庄家是上一轮游戏中的赢家,每局游戏系统自动洗牌后将5张牌均匀分给给各位玩家。玩家拿到牌后根据一定的游戏规则进行排列组合,庄家和闲家依次进行大小比较从而决定胜负。原创 2017-05-24 15:28:12 · 11861 阅读 · 5 评论 -
lua——赢三张牌型处理相关算法(下)——牌型比较
上文中我们已经实现了赢三张牌型的判定方法,同时我们也给出了一个枚举结构CardType。不难理解,若两组牌不是同一牌型的话,直接根据枚举的值进行比对就可以了。若是相同牌型还需要进行进一步的判断。所以我们暂且将比牌函数分为两个分支--@比牌接口函数--@ my_Cards, 本家牌,--@ pre_Cards,下家牌,--@ ret true/falsefunction cardTool原创 2017-05-18 14:28:19 · 1806 阅读 · 0 评论 -
lua——赢三张牌型处理相关算法(中)——牌型判定
赢三张的牌型大题分为6种:单牌CardType ={ UNDEFINE=0, --单牌 DUI_ZI =1, --对子 SHUN_ZI =2, --顺子 TONG_HUA=3, --同花 TONG_HUA_SHUN = 4, --同花顺 BAO_ZI = 5, --豹子}原创 2017-05-18 14:05:02 · 1575 阅读 · 0 评论 -
lua——赢三张牌型处理相关算法(上)——牌值数据
赢三张,我们东北管这个叫拖拉机。其他的几个名称是违规的。。是一个简单粗暴的扑克牌(dubo)游戏。玩家每人三张牌,通过特定的牌型规则进行比大小。(押注什么的就不说了,具体详细规则请参考百度)最近一直深陷在各种扑克玩法的牌型逻辑处理中,对比了一下,觉得赢三张应该算是比较简单的了,于是在这里写出一些牌型逻辑处理的算法。有些也适用于其他的扑克牌玩法。注:语言为lua原创 2017-05-18 11:39:28 · 4077 阅读 · 4 评论 -
斗地主AI算法——第十七章の总结整理
2.0版本的斗地主AI算法在这里就算告一段落了。**********************完结撒花**********************不过后续应该还会开发更智能的版本,毕竟当前版本还有很多策略没有加入。比如说角色位置(地主上家下家打法)、比如说记牌算牌、又比如对于一些残局的分析等等。斗地主规则看似简单,实际变幻莫测,也包含一些心理上的博弈。而我想做的AI,不一定要做到最牛原创 2017-04-27 20:50:26 · 10541 阅读 · 7 评论 -
斗地主AI算法——第十六章の样例分析
上一章,我们已经完成了测试模块的开发。至此我们已经可以进行整体测试了。本章主要内容就是随机生成了一些样例并进行分析。实际上整个开发过程绝大部分时间都是用在样例分析上,通过样例给出的返回操作分析自己设计的策略是否合理,然后不断的调整策略,调整权值等等。这个过程持续了蛮久的,而且很多地方都反复的修改,感觉git都快要被我玩坏了。下面具体拿出一组测试数据进行简单的分析发牌原创 2017-04-27 20:12:31 · 6162 阅读 · 0 评论 -
斗地主AI算法——第十五章の测试模块
前面已经完成了整个工程大部分模块,接下来进入整合联调以及模拟测试模块。测试模块主要任务就是代替服务器给出我们需要的数据。因为我们本来的计划是封装成类库通过服务器调用获取,其调用的接口无非就是叫分、被动出牌、主动出牌。被动出牌和主动出牌我们已经完成,叫分我们已经实现了权值的获取,只需要在外面加一个区间划分即可:/*获取叫分函数*/int LandScore(GameSituati原创 2017-04-27 17:48:18 · 5597 阅读 · 5 评论 -
斗地主AI算法——第十四章の主动出牌(3)
上一章已经排除了飞机、三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌、对牌、三牌以及单顺、双顺、三顺了。首先说单牌、对牌、三牌。其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型要求,即先打出,计算其剩余价值。 //出单牌 if (clsHandCardData.value_aHandCardList[i] > 0) { clsHandC原创 2017-04-27 16:42:49 · 6134 阅读 · 7 评论 -
斗地主AI算法——第十三章の主动出牌(2)
上一章我们已经搭好了出牌算法的基本框架,本章主要实现优先处理的三带、飞机等牌型。首先定义一些基本变量: //暂存最佳的价值 HandCardValue BestHandCardValue; BestHandCardValue.NeedRound = 20; BestHandCardValue.SumValue = MinCardsValue; //我们认为不出牌的话会让对手一个轮次原创 2017-04-27 16:26:26 · 5911 阅读 · 0 评论 -
斗地主AI算法——第十二章の主动出牌(1)
本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来。首先清空出牌序列clsHandCardData.ClearPutCardList();主动出牌的策略按照优先级大体可以分为三类:【一】能直接一手牌出去,优先出。【二】两手牌出去且有绝对大牌,先出绝对大牌。【三】出一手牌使得接下来自己手牌价值最大化。首先说【一】:一手牌的原创 2017-04-27 16:04:15 · 9006 阅读 · 6 评论 -
斗地主AI算法——第十一章の被动出牌(5)
本章是被动出牌的最后一章,截止目前,我们已经解决了大部分牌型。只剩下飞机和炸弹了。飞机无疑是最复杂的类型,他等于顺子和三带的结合体,但又增加了很多难度。根据上一章的算法,我们可以大概想到,若是带出去一张我就加一个循环,若是带出去两张我就加俩循环,但是这个飞机长度不一致,带出去的牌个数也就不一致,这TM怎么加啊!!我一开始的想法是外置一个全排列函数,给定count个数,然后列举所有的方案去改原创 2017-04-27 15:12:33 · 7315 阅读 · 2 评论 -
斗地主AI算法——第十章の被动出牌(4)
上一章已经说明了单顺的实现方法,双顺、三不带顺牌型实现方法与单牌基本类似。改动的地方除了上一章说的枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面,还有length设置的变化,因为双顺的length是count的1/2,三顺是1/3。下面给出完整代码://对连类型 else if (c原创 2017-04-27 14:41:33 · 5099 阅读 · 5 评论 -
斗地主AI算法——第九章の被动出牌(3)
上一章已经说明了被动出牌算法基本的出牌思路,且以单牌为例给出了具体的代码。对牌、三不带牌型实现方法与单牌基本类似。改动的地方主要是枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面。下面给出完整代码:/对牌类型 else if (clsGameSituation.uctNowCardGr原创 2017-04-27 14:11:07 · 5539 阅读 · 1 评论 -
斗地主AI算法——第八章の被动出牌(2)
上一章我们已经搭好了被动出牌的基本架子,本章我们主要解决面对不同牌型分支的出牌策略问题。在这里我把出牌逻辑分为四个阶段,也就是策略的优先级。分别是:【直接打光手牌】→【同类型牌压制】→【炸弹王炸压制】→【不出】第一阶段【直接打光手牌】就是说如果我们可以一次性把手牌打出,那就不用考虑接下来价值之类的问题了,因为已经赢了。这种情况可能是对方打出的牌型和你一样且你比他大,或者你剩的牌是炸原创 2017-04-27 11:13:09 · 7913 阅读 · 0 评论 -
斗地主AI算法——第七章の被动出牌(1)
哎,之前扯了那么多蛋,重要讲出牌了!本章开始讲被动出牌的逻辑算法。首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型。在第二章数据结构里我们定义过,游戏全局类里面有一个存放当前牌型结构的成员,即 //当前打出牌的类型数据,被动出牌时玩家根据这里做出筛选 CardGroupData uctNowCardGroup;我们即将通过他进行类型的筛选,所以整个原创 2017-04-26 20:53:05 · 9569 阅读 · 1 评论 -
斗地主AI算法——第六章の牌型判断
本章实现了上一章提到的检查当前是否只是一手牌函数ins_SurCardsType/*检查剩余的牌是否只是一手牌是: 返回手牌类型数据不是:返回错误类型(cgERROR)*/CardGroupData ins_SurCardsType(int arr[]);输入很简单,就是一个状态数组。输出是手牌类型结构//牌型组合数据结构struct CardGr原创 2017-04-26 20:20:45 · 9429 阅读 · 7 评论 -
斗地主AI算法——第五章の总值计算
本章算是比较重点的一章,前一章已经对各个牌型做出了价值定义,本章主要实现计算手牌总价值模块函数。根据之前的思路,我们设定一下输入输出:输入:手牌数据类(主要用手牌个数nHandCardCount以及手牌状态数组clsHandCardData.value_aHandCardList)输出:手牌价值结构 HandCardValue先处理剪枝部分,如果剩下的手牌是一手牌,我们即直原创 2017-04-26 19:48:01 · 11182 阅读 · 9 评论 -
斗地主AI算法——第四章の权值定义
第一章业务逻辑结尾部分我提到了权值的计算方法:①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样。③整手牌可以分成若干个组合牌,但分法不唯一。当时,我说了①和②可以直接定义,③需要迭代计算。所以本章的主要内容就是确定基础价值&组合牌型的价值定义对于牌型权值的定义看似简单,实际却需要大量的推敲。这就跟游戏里不同英雄属性、技能反复修改一样原创 2017-04-26 18:04:38 · 14281 阅读 · 6 评论 -
斗地主AI算法——第三章の数据处理
上一章我们定义了基本的数据结构,相信大家看到手牌类里面那么多出牌序列时一定会比较愤慨。。。其实一开始写的时候我也是觉得很脑残,不过后续开发证明了这样的结构还是可以的,因为只要我封装了一层数据转换,接下来所有的算法策略都只用到2个成员变量,状态数据及手牌数量。特别便于调试、管理。那么接下来就写出类成员函数的实现方法//手牌数据类class HandCardData{public:原创 2017-04-26 16:53:29 · 12979 阅读 · 0 评论 -
斗地主AI算法——第二章の数据结构
上一章我们已经确立了进本的业务逻辑处理流程。从本章开始,我们便进入开发阶段。首先就是明确我们都需要哪些数据,且它们以怎样的形式存储。首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他包含了两个成员,①手牌总价值②需要打几手牌。//手牌权值结构struct HandCardValue{ int SumValue; //手牌总价值 int Nee原创 2017-04-26 16:00:34 · 20971 阅读 · 1 评论 -
斗地主AI算法——第一章の业务逻辑
转眼间快到了五月,帝都的天气也变的非常梦幻。 时而酷暑炎热,时而狂风席卷。而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华。世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂寞。或许AI就是因此而生吧,因为到了最后,能一直陪伴我们走下去的,或许也就只有程序了。好吧不装逼了,近期在研究skynet服务器框架,里面有斗地主的demo,于是想原创 2017-04-26 15:27:24 · 43070 阅读 · 9 评论 -
node.js——麻将算法(二)赖子玩法
上篇博客传送门http://blog.youkuaiyun.com/sm9sun/article/details/65448140上文中已经实现了基本胡法的算法,本章加入“癞子玩法”的判胡逻辑对于癞子的处理方式无非就两种:一,以枚举的方式使癞子转换为其他牌型进行进一步判断二,在计算判胡时出现位置空缺时使用癞子进行补位前者的优势是准确度相对容易把控,并且逻辑清原创 2017-03-24 17:11:12 · 7043 阅读 · 4 评论 -
node.js——麻将算法(一)基本判胡
大家好,失踪已久的九日哥回来了 由于前段时间一直专注于开发鉴黄,所以身心都有些不适,故也给了自己很长的放松时间~然而回来了之后,九日哥毅然决然的选择了棋牌(dubo)事业~看来我这辈子也就离不开黄赌毒了。这就是我的职业生涯规划,恩,看起来没什么不对。首先带来的就是麻将胡牌、听牌的算法,不过大家都知道,麻将各个地方的规则都不同,所以相关算法也需要作出一定的原创 2017-03-23 20:41:39 · 14592 阅读 · 10 评论