教你用Python秒破路边“诈骗”棋牌残局!发家致富第一步!
文章最后有彩蛋,别错过了!
既然说python是一门超前卫的计算机编程语言,那么就决定了它肯定是千变万化的,无所不能的!事实上python目前已经应用与各个领域,然而我就喜欢琢磨一些实用的一些小领域的应用!把python比作shell,控制计算机(给你)思考出牌方式,如何才能够赢。这就是大体思路!
相信大家走在路上,天桥旁边或者小区公园都看到过!
教你用Python秒破路边“诈骗”棋牌残局!发家致富第一步!
“斗地主残局破解,象棋残局破解等等”你能让那边能赢就能获得相应奖励这些!
如果你能够靠自己的思维获得最终的胜利,这无疑是非常厉害的!即使大家都是说人脑比计算机聪明,但是更多的是计算机可以做出来的题目,你却做不出来。这种情况我们用python控制计算机可以让计算机轻松帮我们搞定!计算机是不用思考的,只是库里有,它会立即给出答案!
其实,看到这些残局破解的时候,通常都会习惯性的手动来破解,每次都兴高采烈的以为找到农民胜利的方法时,最终都会发现根本行不通,不管怎么样,都走不完手上的牌!人脑的思维以及储存从某种意义上来说是有极限的,计算机也有,但是计算机的极限远大于人脑!那今天我们就用python来运算一下!
本文将会简述通过python来解决这类问题,让你小区附近的这钟“江湖骗术”统统乖乖离开!
minimax
代码核心部分,minimax可以拆分为两部分,mini和max,分别代表最小和最大!
直观的理解就是两个人下棋,甲可以在N个点走棋,假设甲在某个点走棋了,使得甲的这一步的盘面评估分数最高;但是轮到乙下的时候,就一定会朝着让甲最不利的方向走,使得甲的下一步必然按照乙设定的轨迹来,而设法达到甲在第一步时估算到这一步的最高盘面评分。
在牌局中是一样的,如果农民的这一手牌,让地主无论如何应对都不能赢的话,那么可以说农民有必胜的策略,否则,农民必输!
核心逻辑
函数
hand_out 模拟一个人的出牌过程。
me_pokes 模拟自己手上的牌
last_hand 上一手出的牌
enemy_pokers对手当前所有的牌
这个函数的返回值,是轮到我me_pokers出牌时,是否能够必赢牌,如果能赢则返回真,否则返回假!
**def **hand_out(me_pokers, enemy_pokers, last_hand)
假设轮到我出牌时,如果我没有牌了,那么我将立刻知道我赢了,反之如果对手的牌都出完了,而我没有,则我失败了
**if not **me_pokers:
return True
**if not **enemy_pokers:
return False
因为轮到我出牌,所以我首先要知道我现在能出的所有手牌的组合,注意:这个组合中,包括过牌的策略。
all_hands = get_all_hands(me_pokers)
现在要对所有可能的手牌组合进行遍历。
首先我需要知道,上一手对方出的牌是什么。
如果对方上一手选择过,或者没有上一手牌,那么我这一轮必须不能过牌,但是我可以出任意的牌
如果对手上一手出了牌,则我必须要出一个比它更大的牌或者选择这一轮直接过牌。
关键点就是,在出完我的牌或者过牌后,我们需要用一个递归调用来模拟对手下一步的行为。如果对手的下一次出牌不能获胜的话,则我这一次出牌必胜,否则,对于我的每一个出牌选择,对手都能获胜的话,则我必败!
构建
以上核心逻辑清楚后,构建破解器变的十分简单。
数字代表牌的大小!
然后,我们需要求出一个手牌所有的组合,这里需要get_all_hands函数,具体实现比较繁琐但是很简单!
然后就是牌力的判断,也就是看谁的比较大了!唯一要注意的就是,在斗地主的规则中,除了炸弹外,其他的所有牌力均等,只有牌型一样才去比较!
最后,我们需要一个模拟出牌函数make_hand(pokers,hand),用于求出在手牌为pokers的情况下打出一手牌后,剩下的手牌,实现也非常简单,只需简单的移除掉那些打出的牌即可!
作者:Python_iOS书籍库
链接:https://www.jianshu.com/p/f1d6551c7d0c
共同学习,写下你的评论
评论加载中...
作者其他优质文章