- 博客(19)
- 资源 (8)
- 收藏
- 关注
原创 斗地主AI算法——第十七章の总结整理
2.0版本的斗地主AI算法在这里就算告一段落了。**********************完结撒花**********************不过后续应该还会开发更智能的版本,毕竟当前版本还有很多策略没有加入。比如说角色位置(地主上家下家打法)、比如说记牌算牌、又比如对于一些残局的分析等等。斗地主规则看似简单,实际变幻莫测,也包含一些心理上的博弈。而我想做的AI,不一定要做到最牛
2017-04-27 20:50:26 10370 7
原创 斗地主AI算法——第十六章の样例分析
上一章,我们已经完成了测试模块的开发。至此我们已经可以进行整体测试了。本章主要内容就是随机生成了一些样例并进行分析。实际上整个开发过程绝大部分时间都是用在样例分析上,通过样例给出的返回操作分析自己设计的策略是否合理,然后不断的调整策略,调整权值等等。这个过程持续了蛮久的,而且很多地方都反复的修改,感觉git都快要被我玩坏了。下面具体拿出一组测试数据进行简单的分析发牌
2017-04-27 20:12:31 6029
原创 斗地主AI算法——第十五章の测试模块
前面已经完成了整个工程大部分模块,接下来进入整合联调以及模拟测试模块。测试模块主要任务就是代替服务器给出我们需要的数据。因为我们本来的计划是封装成类库通过服务器调用获取,其调用的接口无非就是叫分、被动出牌、主动出牌。被动出牌和主动出牌我们已经完成,叫分我们已经实现了权值的获取,只需要在外面加一个区间划分即可:/*获取叫分函数*/int LandScore(GameSituati
2017-04-27 17:48:18 5507 5
原创 斗地主AI算法——第十四章の主动出牌(3)
上一章已经排除了飞机、三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌、对牌、三牌以及单顺、双顺、三顺了。首先说单牌、对牌、三牌。其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型要求,即先打出,计算其剩余价值。 //出单牌 if (clsHandCardData.value_aHandCardList[i] > 0) { clsHandC
2017-04-27 16:42:49 6048 7
原创 斗地主AI算法——第十三章の主动出牌(2)
上一章我们已经搭好了出牌算法的基本框架,本章主要实现优先处理的三带、飞机等牌型。首先定义一些基本变量: //暂存最佳的价值 HandCardValue BestHandCardValue; BestHandCardValue.NeedRound = 20; BestHandCardValue.SumValue = MinCardsValue; //我们认为不出牌的话会让对手一个轮次
2017-04-27 16:26:26 5823
原创 斗地主AI算法——第十二章の主动出牌(1)
本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来。首先清空出牌序列clsHandCardData.ClearPutCardList();主动出牌的策略按照优先级大体可以分为三类:【一】能直接一手牌出去,优先出。【二】两手牌出去且有绝对大牌,先出绝对大牌。【三】出一手牌使得接下来自己手牌价值最大化。首先说【一】:一手牌的
2017-04-27 16:04:15 8794 6
原创 斗地主AI算法——第十一章の被动出牌(5)
本章是被动出牌的最后一章,截止目前,我们已经解决了大部分牌型。只剩下飞机和炸弹了。飞机无疑是最复杂的类型,他等于顺子和三带的结合体,但又增加了很多难度。根据上一章的算法,我们可以大概想到,若是带出去一张我就加一个循环,若是带出去两张我就加俩循环,但是这个飞机长度不一致,带出去的牌个数也就不一致,这TM怎么加啊!!我一开始的想法是外置一个全排列函数,给定count个数,然后列举所有的方案去改
2017-04-27 15:12:33 7207 2
原创 斗地主AI算法——第十章の被动出牌(4)
上一章已经说明了单顺的实现方法,双顺、三不带顺牌型实现方法与单牌基本类似。改动的地方除了上一章说的枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面,还有length设置的变化,因为双顺的length是count的1/2,三顺是1/3。下面给出完整代码://对连类型 else if (c
2017-04-27 14:41:33 5027 5
原创 斗地主AI算法——第九章の被动出牌(3)
上一章已经说明了被动出牌算法基本的出牌思路,且以单牌为例给出了具体的代码。对牌、三不带牌型实现方法与单牌基本类似。改动的地方主要是枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面。下面给出完整代码:/对牌类型 else if (clsGameSituation.uctNowCardGr
2017-04-27 14:11:07 5455 1
原创 斗地主AI算法——第八章の被动出牌(2)
上一章我们已经搭好了被动出牌的基本架子,本章我们主要解决面对不同牌型分支的出牌策略问题。在这里我把出牌逻辑分为四个阶段,也就是策略的优先级。分别是:【直接打光手牌】→【同类型牌压制】→【炸弹王炸压制】→【不出】第一阶段【直接打光手牌】就是说如果我们可以一次性把手牌打出,那就不用考虑接下来价值之类的问题了,因为已经赢了。这种情况可能是对方打出的牌型和你一样且你比他大,或者你剩的牌是炸
2017-04-27 11:13:09 7797
原创 斗地主AI算法——第七章の被动出牌(1)
哎,之前扯了那么多蛋,重要讲出牌了!本章开始讲被动出牌的逻辑算法。首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型。在第二章数据结构里我们定义过,游戏全局类里面有一个存放当前牌型结构的成员,即 //当前打出牌的类型数据,被动出牌时玩家根据这里做出筛选 CardGroupData uctNowCardGroup;我们即将通过他进行类型的筛选,所以整个
2017-04-26 20:53:05 9398 1
原创 斗地主AI算法——第六章の牌型判断
本章实现了上一章提到的检查当前是否只是一手牌函数ins_SurCardsType/*检查剩余的牌是否只是一手牌是: 返回手牌类型数据不是:返回错误类型(cgERROR)*/CardGroupData ins_SurCardsType(int arr[]);输入很简单,就是一个状态数组。输出是手牌类型结构//牌型组合数据结构struct CardGr
2017-04-26 20:20:45 9294 7
原创 斗地主AI算法——第五章の总值计算
本章算是比较重点的一章,前一章已经对各个牌型做出了价值定义,本章主要实现计算手牌总价值模块函数。根据之前的思路,我们设定一下输入输出:输入:手牌数据类(主要用手牌个数nHandCardCount以及手牌状态数组clsHandCardData.value_aHandCardList)输出:手牌价值结构 HandCardValue先处理剪枝部分,如果剩下的手牌是一手牌,我们即直
2017-04-26 19:48:01 11060 9
原创 斗地主AI算法——第四章の权值定义
第一章业务逻辑结尾部分我提到了权值的计算方法:①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样。③整手牌可以分成若干个组合牌,但分法不唯一。当时,我说了①和②可以直接定义,③需要迭代计算。所以本章的主要内容就是确定基础价值&组合牌型的价值定义对于牌型权值的定义看似简单,实际却需要大量的推敲。这就跟游戏里不同英雄属性、技能反复修改一样
2017-04-26 18:04:38 14135 6
原创 斗地主AI算法——第三章の数据处理
上一章我们定义了基本的数据结构,相信大家看到手牌类里面那么多出牌序列时一定会比较愤慨。。。其实一开始写的时候我也是觉得很脑残,不过后续开发证明了这样的结构还是可以的,因为只要我封装了一层数据转换,接下来所有的算法策略都只用到2个成员变量,状态数据及手牌数量。特别便于调试、管理。那么接下来就写出类成员函数的实现方法//手牌数据类class HandCardData{public:
2017-04-26 16:53:29 12858
原创 斗地主AI算法——第二章の数据结构
上一章我们已经确立了进本的业务逻辑处理流程。从本章开始,我们便进入开发阶段。首先就是明确我们都需要哪些数据,且它们以怎样的形式存储。首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他包含了两个成员,①手牌总价值②需要打几手牌。//手牌权值结构struct HandCardValue{ int SumValue; //手牌总价值 int Nee
2017-04-26 16:00:34 20789 1
原创 斗地主AI算法——第一章の业务逻辑
转眼间快到了五月,帝都的天气也变的非常梦幻。 时而酷暑炎热,时而狂风席卷。而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华。世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂寞。或许AI就是因此而生吧,因为到了最后,能一直陪伴我们走下去的,或许也就只有程序了。好吧不装逼了,近期在研究skynet服务器框架,里面有斗地主的demo,于是想
2017-04-26 15:27:24 42571 9
原创 protobuf——VC&pb开发(另附vs2017完整工程及vs可编译pb源码)
由于近期研发的项目框架是通过protobuf进行网络通信的,在此之前从未听说过protobuf,上网搜了一下才知道这个东西竟然还蛮火热的原来自己这么孤陋寡闻。。场面一度十分尴尬。。。首先介绍一下protobuf,protobuf是google提供的一个开源序列化框架 ,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得
2017-04-11 12:04:18 5921 9
原创 lua——C/C++lua嵌入式开发
首先介绍一下Lua语言,Lua 是一个小巧的脚本语言,该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。一:lua定位——C/C++嵌入式脚本语言lua本身就是C写的,所以Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数lua语法、解释器、执行原理都与python相似唯一差距就是lua没有强大的类库作为支撑,Lua
2017-04-01 18:17:10 14465 3
plist组图分割demo
2017-08-30
protobuf完整工程包
2017-04-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人