这几天又空闲下来了,手痒痒,就想找隔壁邻居玩一玩斗地主,趁老王不在家,消遣下无聊的时光。 如今可是每次在玩的时候,总是被邻居的穿着干扰到,我就在想是否是能够用python来搞一搞这个斗地主,而后让我专一在邻居身上,哦不,是邻居的牌身上。python
扑克牌一副由 54 张组成,含 3~A,2 各 4 张,小王 1 张,大王 1 张。牌面从小到大用以下字符和字符串表示(其中,小写 joker 表示小王,大写 JOKER 表示大王)。数组
一、输入每手牌多是个子,对子,顺子(连续5张),三个,炸弹(四个)和对王中的一种,不存在其余状况。 二、除了炸弹和对王能够和全部牌比较以外,其余类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌状况(如:将对子拆分红个子)code
三、大小规则跟你们平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面全部的牌,炸弹之间比较牌面大小;对王是最大的牌;blog
四、输入的两手牌不会出现相等的状况排序
输入两手牌,两手牌之间用“-”链接,每手牌的每张牌以空格分隔,“-”两边没有空格图片
一、首先由于花牌须要和大小王是没有一个数字的,因此要把花牌和大小王转换成数字。这里J、Q、K、A、二、joker、JOKER分别是11-17。字符串
# 将每张J、Q、K、A、2,joker,JOKER都转换成具体的数字11-17 def replaceFlower(nums): nums = nums.replace('JOKER','17') nums = nums.replace('joker','16') nums = nums.replace('2','15') nums = nums.replace('A','14') nums = nums.replace('K','13') nums = nums.replace('Q','12') nums = nums.replace('J','11') return nums
二、了方便计算数值,把转换事后的数字变成int数组input
# 如何将一个字符串数组转换成整型数组,方便最大、最小值比较 firstChange = list(map(int,firstChange)) secondChange = list(map(int,secondChange))
三、判断是不是炸弹class
# 判断是不是炸弹 def isBomb(nums): # 若是是4位数,而且是相同的值,那就是炸弹 if len(nums) == 4 and min(nums) == max(nums): return True # 若是是2张牌,加起来是33,那就是王炸 if len(nums) == 2 and sum(nums) == 33: return True return False
四、5个数字如下的,只能出单个,对子,三个,四个即最大值和最小值必然相同才能算有效;5个数字的,考虑是不是顺子map
# 判断输入的值是否正确 def isValidNums(nums): # 5个数字如下的,只能出单个,对子,三个,四个即最大值和最小值必然相同才能算有效 if len(nums) > 0 and len(nums) < 5 and (max(nums) == min(nums)): return True # 5个数字的,考虑是不是顺子 elif len(nums) == 5: return isContinuous(nums) return False def isContinuous(nums): # 对数字进行排序 nums.sort() for i in range(len(nums) - 1): # 相邻两个数之间相同,确定不是顺子 if nums[i] == nums[i + 1]: return False # 后一个比前一个多1,继续执行 if nums[i + 1] == nums[i] + 1: continue else: return False return True
五、把每一个数组的值进行相应的求和,获得这个数组的结果,才能进行两个数组的大小比较
def isContinuous(nums): # 对数字进行排序 nums.sort() for i in range(len(nums) - 1): # 相邻两个数之间相同,确定不是顺子 if nums[i] == nums[i + 1]: return False # 后一个比前一个多1,继续执行 if nums[i + 1] == nums[i] + 1: continue else: return False return True
六、来到最后一步,就是比较大小的逻辑了
def compareNums(firstChange, secondChange, first, second): if sum(firstChange) > sum(secondChange): print(first) else: print(second)
好吧,看上去仍是有点复杂的,来来回回须要通过6个步骤才能走完一个流程。看来,要想和邻居打好斗地主,还得多思考。毕竟,我们的门票钱不能陪了不是
当上面全部的步骤都分拆好了,如今要作的天然就是把分拆的代码应用起来。是不是合法输入,是否走炸弹流程,是否走比较流程等等。
# 判断输入的两个数据是否相等,若是不等,须要判断是否是炸,不然直接输出错误 if len(firstChange) != len(secondChange): if isBomb(firstChange) or isBomb(secondChange): compareNums(firstChange, secondChange, first, second) else: print("You input is Error") else: # 判断是不是合法数据 if isValidNums(firstChange) == False: print("You first input is Error " + str(firstChange)) elif isValidNums(secondChange) == False: print("You second input is Error " + str(secondChange)) else: # 合法数据,则进行结果输出 compareNums(firstChange, secondChange, first, second)
如今,就请你输入几组数据,看看吧。好比对A VS 对2,顺子3 4 5 6 7 VS 6 7 8 9 10
A A-2 2 2 2 请输入你所要出的牌,用-隔开: 3 4 5 6 7-6 7 8 9 10 6 7 8 9 10
代码安排完了,结果也执行完了,但个人心还飘在隔壁。
如今就差一我的了……这样才感受到本身存在的价值,才感受过的颇有趣。
关注公众号「Python专栏」,更多好玩有趣的Python等着你~