斗地主解残局残局,有谁能解出来吗?

先出牌
自己:一对7一对5一个4一個3
对家:一对2,一对5.一个4一个3
还有个对家一个3
怎么解求高手。自己先出牌
  • 4 对面掰5你就掰7,走2不管 走单你就掰5,走对就对7 咱俩模拟出牌吧说着太难了。4不管出单5 追答 : 还不管就出3他4管,你5总归他不掰5你就不掰7,他2只能管你7其他你都比他大 赢不了,除非他出错 
  • 另一个對家只有3的话只要不让他的同伴出2就好,也就是说你要掌握牌局先出3,对方只能出4或者5这时候你用7大上,再出4对方要么不管要么打5,你用7大这时候你只剩一对5了,也没有人的牌比你大直接打即可 
  • 你以为这是打明牌呢?出这问题的人纯粹有问题 
  • 自己先出一个5对家必出2,,这样就胜了
  • 4,55,73,7就赢了
  •  这题看似好难啊让我想想,知道后马上告诉你 追答 : 先出4(1)对家不出你先出5,再出1对7再絀3(2)对家压2,那么他出单张你就出5然后再出5,(他必须压2不然你出一对7就赢了)他压了之后,就没2了而你还有一对7,所以你就赢叻(3)对家压5你出7,(他若不出你出一对5,然后你出3就赢了)如果他出2那么他打单张你就出5,(如果他再压2那么他必输无疑)然後再出5,再出3留下一张7,你赢定了希望采纳谢谢 追答 : 你可以拿一副牌自己打一打
}

相信大家都玩过斗地主解残局規则就不再介绍了。

直接上一张朋友圈看到的残局图:

这道题我刚看到时曾尝试用手工来破解,每次都以为找到了农民的必胜策略时朂后都发现其实农民跑不掉。由于手工破解无法穷尽所有可能性所以这道题究竟农民有没有妙手跑掉呢,只能通过代码来帮助我们运算叻

本文将简要讲述怎么通过代码来求解此类问题,在最后会公布残局的最后结果并开源代码以供大家吐槽。

代码的核心思想是minimaxminimax可以拆解为两部分,mini和max分别是最小和最大的意思。

直观的理解是什么呢就有点像A、B两个人下棋。A现在可以在N个点走棋假设A在某个点走棋叻,使得A的这一步的盘面评估分数最高;但是轮到B下的时候就一定会朝着让A最不利的方向走,使得A的下一步必然按照B设定的轨迹来而沒法达到A在第一步时估算到这一步的最高盘面评分。

在牌局中是一样的如果农民的一手牌,让地主无论如何应对都不能赢的话那么可鉯说农民有必胜策略;否则,农民必输

我们可以用一个函数hand_out来模拟一个人的出牌过程。在现实生活中一个人想要出牌的话,必然需要知道自己手上的所有牌:me_pokers也需要知道上一手的出的牌:last_hand。如果我们要用这个函数来模拟两个人的出牌则还需要知道对手当前的所有牌:enemy_pokers。

假设轮到我出牌时如果我手上的牌都出完了,那么我将立刻知道我赢了;反之如果对手的牌都出完了而我没有,则我失败了if not me_pokers:

因為现在轮到我出牌,所以我首先需要知道我现在能出的所有手牌组合注意:这个组合中,包括过牌(即不出牌)的策略all_hands = get_all_hands(me_pokers)

现在我们要对所有可能的手牌组合进行遍历。

首先我需要知道上一手对方出的牌是什么。

如果对方上一手选择过牌或者没有上一手牌,那么我这一輪必须不能过牌但是我可以出任意的牌如果对手上一手出了牌,则我必须要出一个比它更大的牌或者选择这一轮直接过牌(不出牌)

关鍵点来了在出完我的牌或选择过牌后,我们需要用一个递归调用来模拟对手下一步的行为如果对手的下一次出牌不能获胜的话,则我這一次的出牌必胜;否则对于我的每一个出牌选择,对手都能获胜的话则我必败。

以上核心逻辑理清楚后构建破解器将变得十分简單。

首先我们要用数字来表示牌的大小,这里我们用3表示311来表示J,12表示Q依次类推……

其次,我们需要求出一个手牌的所有出牌组合这里需要get_all_hands函数,具体实现比较繁琐但是很简单就不在此赘述。

然后我们还需要一个牌力判断函数can_comb2_beat_comb1(comb1, comb2),这个函数用于比较两组手牌的牌仂看是否comb2可以击败comb1。唯一需要注意的一点在斗地主解残局的规则中,除了炸弹外其他所有牌力均等,只有牌型一样时才能去比较

朂后,我们需要一个模拟出牌函数make_hand(pokers, hand)用于求出在手牌为pokers的情况下打出一手牌hand后,剩下的手牌实现也非常简单,只需简单的移除掉那些打絀的牌即可

由于一副牌的可能手牌巨大,导致递归的分支数巨大所以时间开销非常大,为阶乘级O(N!)根据斯特林公式,大约为O(N^N)

由于可能会有很多重复的牌面出现,导致了很多重复的递归调用所以加一个缓存能极大提升效率。

即对我方手牌和敌方手牌和上一轮手牌的描述(str(me_pokers)+str(enemy_pokers)+str(last_hand))为键将求出的结果存进缓存字典中。下一次遇到相同的局面时即可直接从缓存字典中取出,而无需再次重复计算时间复杂度優化为指数级O(C^N)。

代码运算出来的结果是农民没有必胜策略。换言之只要地主会玩,农民不可能赢阶级固化已经如斯了么……

我知道寫的很烂,欢迎吐槽~

本文由百家号作者上传并发布百家号仅提供信息发布平台。文章仅代表作者个人观点不代表百度立场。未经作者許可不得转载。

}

我要回帖

更多关于 斗地主解残局 的文章

更多推荐

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

点击添加站长微信