ITPub博客

首页 > IT职业 > IT生活 > 斗地主AI算法——第十四章の主动出牌(3)

斗地主AI算法——第十四章の主动出牌(3)

IT生活 作者:54xx 时间:2021-09-09 09:33:40 0 删除 编辑

上一章已经排除了飞机、三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌、对牌、三牌以及单顺、双顺、三顺了。


首先说单牌、对牌、三牌。其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型要求,即先打出,计算其剩余价值。


			//出单牌			if (clsHandCardData.value_aHandCardList[i] > 0)			{				clsHandCardData.value_aHandCardList[i]--;				clsHandCardData.nHandCardCount--;				HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);				clsHandCardData.value_aHandCardList[i]++;				clsHandCardData.nHandCardCount++;				if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7))  1)			{				//尝试打出一对牌,估算剩余手牌价值				clsHandCardData.value_aHandCardList[i] -= 2;				clsHandCardData.nHandCardCount -= 2;				HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);				clsHandCardData.value_aHandCardList[i] += 2;				clsHandCardData.nHandCardCount += 2;				//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正				if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7))  2)			{				clsHandCardData.value_aHandCardList[i] -= 3;				clsHandCardData.nHandCardCount -= 3;				HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);				clsHandCardData.value_aHandCardList[i] += 3;				clsHandCardData.nHandCardCount += 3;				//选取总权值-轮次*7值最高的策略  因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正				if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) 


至于顺子的算法,和被动出牌的有一点点差别,就是因为没有了数量限制,所以需要遍历以i牌为起点可以组成的所有顺子。



//出单顺			if (clsHandCardData.value_aHandCardList[i] > 0)			{				int prov = 0;				for (int j = i; j 0)					{						prov++;					}					else					{						break;					}					if (prov >= 5)					{						for (int k = i; k  1)			{				int prov = 0;				for (int j = i; j 1)					{						prov++;					}					else					{						break;					}					if (prov >= 3)					{						for (int k = i; k  2)			{				int prov = 0;				for (int j = i; j 2)					{						prov++;					}					else					{						break;					}					if (prov >= 2)					{						for (int k = i; k 


因为本策略是必须解决掉至少一个i牌的,所以出牌操作放在循环内进行,也就是说,只要你不是炸3,若你手牌有3,在处理3时一定会return  就绝对不会再走到4。




if (BestCardGroup.cgType == cgERROR)			{			}			else if (BestCardGroup.cgType == cgSINGLE)			{				clsHandCardData.value_nPutCardList.push_back(BestCardGroup.nMaxCard);				clsHandCardData.uctPutCardType = BestCardGroup;			}			else if (BestCardGroup.cgType == cgDOUBLE)			{				clsHandCardData.value_nPutCardList.push_back(BestCardGroup.nMaxCard);				clsHandCardData.value_nPutCardList.push_back(BestCardGroup.nMaxCard);				clsHandCardData.uctPutCardType = BestCardGroup;			}			else if (BestCardGroup.cgType == cgTHREE)			{				clsHandCardData.value_nPutCardList.push_back(BestCardGroup.nMaxCard);				clsHandCardData.value_nPutCardList.push_back(BestCardGroup.nMaxCard);				clsHandCardData.value_nPutCardList.push_back(BestCardGroup.nMaxCard);				clsHandCardData.uctPutCardType = BestCardGroup;			}			else if (BestCardGroup.cgType == cgSINGLE_LINE)			{				for (int j = BestCardGroup.nMaxCard- BestCardGroup.nCount+1; j 



至此,主动出牌的所有逻辑均已实现,同时整个斗地主算法也基本完成了。接下来我们便可写一些测试模块来进行整合联调。


敬请关注下一章:斗地主AI算法——第十五章の测试模块

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/1976/viewspace-2804688/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 谈谈 Web 安全
下一篇: Windows搭建php环境
请登录后发表评论 登录
全部评论

注册时间:2019-04-16

  • 博文量
    226
  • 访问量
    1611