趁老王不在和隔壁邻居斗斗地主比比大小

28次阅读

共计 2679 个字符,预计需要花费 7 分钟才能阅读完成。

这几天又空闲下来了,手痒痒,就想找隔壁邻居玩一玩斗地主,趁老王不在家,消遣下无聊的时光。
现在但是每次在玩的时候,老是被邻居的穿着干扰到,我就在想是不是可以用 python 来搞一搞这个斗地主,然后让我专注在邻居身上,哦不,是邻居的牌身上。

基本规则

扑克牌一副由 54 张组成,含 3~A,2 各 4 张,小王 1 张,大王 1 张。牌面从小到大用如下字符和字符串表示(其中,小写 joker 表示小王,大写 JOKER 表示大王)。

1、输入每手牌可能是个子,对子,顺子(连续 5 张),三个,炸弹(四个)和对王中的一种,不存在其他情况。
2、除了炸弹和对王可以和所有牌比较之外,其他类型的牌只能跟相同类型的存在比较关系(如,对子跟对子比较,三个跟三个比较),不考虑拆牌情况(如:将对子拆分成个子)

3、大小规则跟大家平时了解的常见规则相同,个子,对子,三个比较牌面大小;顺子比较最小牌大小;炸弹大于前面所有的牌,炸弹之间比较牌面大小;对王是最大的牌;

4、输入的两手牌不会出现相等的情况

输入描述

输入两手牌,两手牌之间用“-”连接,每手牌的每张牌以空格分隔,“-”两边没有空格

大致思路

1、首先因为花牌需要和大小王是没有一个数字的,所以要把花牌和大小王转换成数字。这里 J、Q、K、A、2、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

2、了方便计算数值,把转换过后的数字变成 int 数组

# 如何将一个字符串数组转换成整型数组,方便最大、最小值比较
firstChange =  list(map(int,firstChange))
secondChange = list(map(int,secondChange))

3、判断是否是炸弹

# 判断是否是炸弹
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

4、5 个数字以下的,只能出单个,对子,三个,四个即最大值和最小值必然相同才能算有效;5 个数字的,考虑是否是顺子

# 判断输入的值是否正确
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

5、把每个数组的值进行相应的求和,得到这个数组的结果,才能进行两个数组的大小比较

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

6、来到最后一步,就是比较大小的逻辑了

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 等着你~

正文完
 0