地主对三对五对九一个十一对王炸斗地主,农民对四对八对K三个A加一个Q.地主怎么赢

地主一对3,一个8,一对11,一对王。农民一对6,4个A,地主出牌,怎么_百度知道
地主一对3,一个8,一对11,一对王。农民一对6,4个A,地主出牌,怎么
农民一对6地主一对3,一个8,一对11,一对王,4个A
我有更好的答案
地主出8,农民如果出4A了,农民就输了,农民出4A地主扔王炸,对11农民不要,对三,地主赢了望采纳~
采纳率:83%
地主怎么也不赢
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。先去看看别的吧
乐视体育文化产业发展(北京)有限公司&&
备案号 【京ICP备号-1】&&
公司地址:北京市朝阳区彩虹路电通创意广场12、13号楼&&
公司座机号:(010)地主拿一对王一对八一个七一个六,农民拿一对十一对八一个七一个六,怎么赢?_百度知道
地主拿一对王一对八一个七一个六,农民拿一对十一对八一个七一个六,怎么赢?
我有更好的答案
地主先出,先出一个6,对方出牌后用1个王接回,然后再出1个7,还是用王接回,最后出一对八,地主赢B农民先出,先出一对八,赌对方放一堆王轰掉
不能看运气,要农民赢
采纳率:90%
来自团队:
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。斗地主残局破解一个三一对五一对七一对十一对q一个二对方以一对a一个9怎么赢_百度知道
斗地主残局破解一个三一对五一对七一对十一对q一个二对方以一对a一个9怎么赢
我有更好的答案
这个牌局没有讲是斗地主,是其他玩法,A最大。
无解的A对胜的
你打一个三对面一个九然后你一个Q对方出A你拿2压住如果对方不出A你就一直打单然后把他的A拆开你那2压住你就赢了
出三对方不要
那就不知道了
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2272人阅读
C/C++(46)
棋牌算法(29)
本章是被动出牌的最后一章,截止目前,我们已经解决了大部分牌型。只剩下飞机和炸弹了。
飞机无疑是最复杂的类型,他等于顺子和三带的结合体,但又增加了很多难度。
根据上一章的算法,我们可以大概想到,若是带出去一张我就加一个循环,若是带出去两张我就加俩循环,但是这个飞机长度不一致,带出去的牌个数也就不一致,这TM怎么加啊!!我一开始的想法是外置一个全排列函数,给定count个数,然后列举所有的方案去改变value_aHandCardList数组再筛选出最优解。但这样做有坏处,第一,这个外置函数非常的麻烦,因为他全排列的全集和子集个数都不确定。第二,影响了程序分支一致性,别的模块都差不多,就飞机这里搞特殊化不太好。第三,不一定安全,因为这种做法意味着我又要多了一个可以影响value_aHandCardList的模块,我并不希望这样。
所以思考了很久,我觉得宁愿多做几个分支,毕竟飞机的个数还是可控的,就2-4。虽然这种代码写起来跟看起来都很傻逼,但是也没有办法。。。
飞机带单:
//暂存最佳的价值
HandCardValue BestHandCardValue = get_HandCardValue(clsHandCardData);
//我们认为不出牌的话会让对手一个轮次,即加一轮(权值减少7)便于后续的对比参考。
BestHandCardValue.NeedRound += 1;
//暂存最佳的牌号
int BestMaxCard = 0;
//是否出牌的标志
bool PutCards =
//验证顺子的标志
int prov = 0;
//顺子起点
int start_i = 0;
//顺子终点
int end_i = 0;
//顺子长度
int length = clsGameSituation.uctNowCardGroup.nCount / 4;
int tmp_1 = 0;
int tmp_2 = 0;
int tmp_3 = 0;
int tmp_4 = 0;
//2与王不参与顺子,从当前已打出的顺子最小牌值+1开始遍历
for (int i = clsGameSituation.uctNowCardGroup.nMaxCard - length + 2; i & 15; i++)
if (clsHandCardData.value_aHandCardList[i] & 2)
if (prov &= length)
start_i = i - length + 1;
for (int j = start_i; j &= end_i; j++)
clsHandCardData.value_aHandCardList[j] -= 3;
clsHandCardData.nHandCardCount -= clsGameSituation.uctNowCardGroup.nC
/*本来想做全排列选取带出的牌然后枚举出最高价值的,但考虑到当飞机长度也就是在2-4之间
所以干脆做三个分支处理算了*/
//为两连飞机
if (length == 2)
for (int j = 3; j & 18; j++)
if (clsHandCardData.value_aHandCardList[j] & 0)
clsHandCardData.value_aHandCardList[j] -= 1;
for (int k = 3; k & 18; k++)
if (clsHandCardData.value_aHandCardList[k] & 0)
clsHandCardData.value_aHandCardList[k] -= 1;
HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);
clsHandCardData.value_aHandCardList[k] += 1;
//选取总权值-轮次*7值最高的策略
因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正
if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) &= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7)))
BestHandCardValue = tmpHandCardV
BestMaxCard = end_i;
PutCards =
clsHandCardData.value_aHandCardList[j] += 1;
//为三连飞机
if (length == 3)
for (int j = 3; j & 18; j++)
if (clsHandCardData.value_aHandCardList[j] & 0)
clsHandCardData.value_aHandCardList[j] -= 1;
for (int k = 3; k & 18; k++)
if (clsHandCardData.value_aHandCardList[k] & 0)
clsHandCardData.value_aHandCardList[k] -= 1;
for (int l = 3; l & 18; l++)
if (clsHandCardData.value_aHandCardList[l] & 0)
clsHandCardData.value_aHandCardList[l] -= 1;
HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);
//选取总权值-轮次*7值最高的策略
因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正
if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) &= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7)))
BestHandCardValue = tmpHandCardV
BestMaxCard = end_i;
PutCards =
clsHandCardData.value_aHandCardList[l] += 1;
clsHandCardData.value_aHandCardList[k] += 1;
clsHandCardData.value_aHandCardList[j] += 1;
//为四连飞机
if (length == 4)
for (int j = 3; j & 18; j++)
if (clsHandCardData.value_aHandCardList[j] & 0)
clsHandCardData.value_aHandCardList[j] -= 1;
for (int k = 3; k & 18; k++)
if (clsHandCardData.value_aHandCardList[k] & 0)
clsHandCardData.value_aHandCardList[k] -= 1;
for (int l = 3; l & 18; l++)
if (clsHandCardData.value_aHandCardList[l] & 0)
clsHandCardData.value_aHandCardList[l] -= 1;
for (int m = 3; m & 18; m++)
if (clsHandCardData.value_aHandCardList[m] & 0)
clsHandCardData.value_aHandCardList[m] -= 1;
HandCardValue tmpHandCardValue = get_HandCardValue(clsHandCardData);
//选取总权值-轮次*7值最高的策略
因为我们认为剩余的手牌需要n次控手的机会才能出完,若轮次牌型很大(如炸弹) 则其-7的价值也会为正
if ((BestHandCardValue.SumValue - (BestHandCardValue.NeedRound * 7)) &= (tmpHandCardValue.SumValue - (tmpHandCardValue.NeedRound * 7)))
BestHandCardValue = tmpHandCardV
BestMaxCard = end_i;
PutCards =
clsHandCardData.value_aHandCardList[m] += 1;
clsHandCardData.value_aHandCardList[l] += 1;
clsHandCardData.value_aHandCardList[k] += 1;
clsHandCardData.value_aHandCardList[j] += 1;
for (int j = start_i; j &= end_i; j++)
clsHandCardData.value_aHandCardList[j] += 3;
clsHandCardData.nHandCardCount += clsGameSituation.uctNowCardGroup.nC
if (PutCards)
for (int j = start_i; j &= end_i; j++)
clsHandCardData.value_nPutCardList.push_back(j);
clsHandCardData.value_nPutCardList.push_back(j);
clsHandCardData.value_nPutCardList.push_back(j);
if (length == 2)
clsHandCardData.value_nPutCardList.push_back(tmp_1);
clsHandCardData.value_nPutCardList.push_back(tmp_2);
if (length == 3)
clsHandCardData.value_nPutCardList.push_back(tmp_1);
clsHandCardData.value_nPutCardList.push_back(tmp_2);
clsHandCardData.value_nPutCardList.push_back(tmp_3);
if (length == 4)
clsHandCardData.value_nPutCardList.push_back(tmp_1);
clsHandCardData.value_nPutCardList.push_back(tmp_2);
clsHandCardData.value_nPutCardList.push_back(tmp_3);
clsHandCardData.value_nPutCardList.push_back(tmp_4);
clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgTHREE_TAKE_ONE_LINE, BestMaxCard, clsGameSituation.uctNowCardGroup.nCount);
大家可以看到我回溯的处理方式和之前的不一样了,因为飞机类型很有可能把对牌当成两个单牌带出,甚至可以拆炸弹。所以每个循环内当确定了一个点就先处理value_aHandCardList状态,这样也相对安全,上一章中在四带二环节我也有提到过这方面。
飞机带对类似,而且这里是被动出牌,所以不存在4连飞机的情况,因为4连飞机带对的话就有20张牌了。只考虑2连和3连就可以了。
最后再说一下炸弹,这个炸弹就厉害了,我给的策略就是————————————
直接炸丫的!不要怂!!
else if (clsGameSituation.uctNowCardGroup.cgType == cgBOMB_CARD)
//更大的炸弹——这里直接炸,不考虑拆分后果。因为信仰。
for (int i = clsGameSituation.uctNowCardGroup.nMaxCard + 1; i & 16; i++)
if (clsHandCardData.value_aHandCardList[i] == 4)
clsHandCardData.value_nPutCardList.push_back(i);
clsHandCardData.value_nPutCardList.push_back(i);
clsHandCardData.value_nPutCardList.push_back(i);
clsHandCardData.value_nPutCardList.push_back(i);
clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgBOMB_CARD, i, 4);
if (clsHandCardData.value_aHandCardList[17] & 0 && clsHandCardData.value_aHandCardList[16] & 0)
clsHandCardData.value_nPutCardList.push_back(17);
clsHandCardData.value_nPutCardList.push_back(16);
clsHandCardData.uctPutCardType = clsGameSituation.uctNowCardGroup = get_GroupData(cgKING_CARD, 17, 2);
clsHandCardData.uctPutCardType = get_GroupData(cgZERO, 0, 0);
当然也可以改成考虑拆分后果什么的,或者如果你手上有多个炸弹是否对比一下出那个接下来更好 等等逻辑。
不过对于我来说,你都有俩炸弹了,还怕什么,肯定都是要炸的!宁输不拆!就是这么浪!
好了至此被动出牌模块就全部写完了,从下一章开始,我们讲主动出牌。
敬请关注下一章:斗地主AI算法——第十二章の主动出牌(1)
访问:173251次
积分:3472
排名:第11298名
原创:166篇
评论:53条
文章:107篇
阅读:105363
(3)(10)(6)(2)(5)(8)(9)(2)(6)(19)(3)(4)(9)(82)

我要回帖

更多关于 斗地主王炸音乐 的文章

 

随机推荐