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

这几天又空闲下来了,手痒痒,就想找隔壁邻居玩一玩斗地主,趁老王不在家,消遣下无聊的时光。
现在但是每次在玩的时候,老是被邻居的穿着干扰到,我就在想是不是可以用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等着你~

原文地址:https://blog.51cto.com/miracleyoung/2426899

时间: 2024-09-30 19:44:16

趁老王不在,和隔壁邻居斗斗地主,比比大小的相关文章

C++中的友元——编程界的老王

c++中友元类可以访问类的所有域,简直是编程世界的老王. 老王可以得知邻居李的名字,户籍,甚至是 *wife**. 但是老王却不一定知道邻居李的儿子的亲生父亲. 老王的儿子,可以通过老王得知邻居李叔的八卦新闻. 但是老王的儿子和老王一样,并不能知道邻居李叔儿子的亲生父亲. #include <iostream> using namespace std; class Li { friend class LaoWang; public: Li(): name(1), m_home(2), m_wi

一个老王开枪案例带你一步一步领略程序开发的魅力

一.前言 我身边的很多同学都认为学计算机专业的人,代码写的好很正常,认为自己不是学计算机专业的,不会写代码很正常,或者这么说,觉得会写代码是一种天赋.其实不然,我们现在必须要清楚当代社会的局势,当代社会朝着信息化的方向快速的发展,AI的时代即将到来,不会写代码的大学生是不是很low了?何况新加坡总统李显龙写代码都溜得飞起来,作为一个总统都会写代码,我们又何尝不要去学呢?几乎所有专业都有开设编程课程,这是一种思维的体操,把写代码当作一种娱乐也未尝不可? 不要认为写代码是件很难的事情,没有人一出生就

1006 小明与隔壁老王之间不得不说的故事

1006: 小明与隔壁老王之间不得不说的故事 时间限制: 1 Sec  内存限制: 128 MB提交: 355  解决: 152[提交][状态][讨论版] 题目描述 有一天,小明想偷吃隔壁老王院子里苹果树上的苹果. 但是,老王家有一条哈士奇,每隔一定时间就会吼叫.准确的说,它会在一个时间点吼叫第一次,之后每隔一段时间吼叫两次,比如第一次吼叫是在 t 时刻,间隔为 s,则吼叫时间点为 t, t + s, t + s + 1, t + 2s, t + 2s + 1 等. 小明是个要面子的人,不想被这

shell安全防范———慎将当前目录.加入PATH~~~之~隔壁老王来敲门

你家大门常打开~~~老王请进~~(慎将当前目录.加入PATH) 经常听见有人说别将.(当前目录)加入PATH,到底为什么呢,自己想了很多次也上网查了半天,然后并没有什么卵子用 最终冥思苦想.拨开云雾见青天~~想到这么一个例子,起码能看出把.目录加入PATH会是什么样的下场!!!. 那么~~上图说话: 一.先模拟将,目录放入PATH 这是原来PATH的变量 2.    那么现在我将.目录将入到PATH中 睁大眼睛@@:一定要把.目录放在最前面,因为一个命令是从PATH中最前面的路径中寻找,如果找不

java 的23种设计模式 之单身狗和隔壁老王的故事

觉得代码写的别扭了,回头翻翻java 的23种设计模式.today,额,这么晚了,困了.就弄个最简单的单例模式吧. 单例模式:俗称单身狗 package singleton; public class SingleTon { private static final class SingleTonBuilder { private static SingleTon singleTon = new SingleTon(); } private SingleTon() { } public stat

OSChina 周六乱弹 —— 防火防盗防老王

你们睡前和起床前干的事情是什么?肯定是刷朋友圈吧.现在刷朋友圈越来越有 B 格了 @xiaochong0302:最新微信研究调查报告出炉:靠玩手机微信过日子的称为"信生活" 1.只收不发的叫"信冷淡": 2.只发不收的叫"信骚扰": 3.发不出去的叫"信功能障碍" 4.看微信哈哈大笑的,你基本已达到"信高潮": 5.一会儿看微信一会儿又删掉的叫"信功能紊乱":  6.用微信谈工作的叫"信工作者" 7.一天发10条微信以上叫"信生活过度" 8.看完不转的基本属于"信无能" 9.如果不玩微信的叫"无

优云老王的心路历程(一):那个做了五年的产品经理

前言: 老王的五年产品经理心路历程,对拍脑袋式产品决策的反思,及如何建立产品用户体验监控体系. 我从2003年"误入"运维软件行业,并在2010年开始做产品经理,5年来,我始终和优秀的团队在一起,从零开始创造了ITSM.CMDB产品,并得到了很多用户的认可.但不怕大家笑话,这5年中,我内心其实无比的纠结.面对产品的历次迭代,一方面要做出对用户有价值的功能,要说服开发团队去落地:另一方面担心产品过于复杂用户不买账,而对功能的裁剪却不敢轻易动刀.例如产品是站为用户领导设计还是为真正的用户操

老王python基础篇--python, 视频, 教程, 视频教程, 基础

老王python基础篇 基础篇11-python基本数据结构-元组和集合.rar 基础篇19-python语句与数据结构应用.rar 基础篇21-文本操作应用.rar 基础篇3-虚拟机安装xubuntu开发环境.rar 基础篇17-python语句1.2.rar 基础篇10-python基本数据结构-列表应用.rar 基础篇9-python基本数据结构-列表.rar 基础篇5-python基本数据类型讲解1.1.rar 基础篇18-基础篇综合习题.rar 基础篇8-python基本数据类型习题解

老王心中的委屈,大伙们有吗

从事测量工作的10年了,心里总有说不出的滋味,你们知道吗,我们的青春去哪里了,难道是整天和那些同事们做着gaoji的测量工作,各种测量仪,玩游戏? 可是我就是这样度过的,现在35了,感觉我年轻过的就只有到处奔波,对不起的是家人. 女怕嫁错郎,男怕入错行.我们是不是入错行了,亏的是自己,对不起是家人. 以前20几岁的时候经常和队长(大部分都是30多了)探讨人生,探讨未来,tm人生就是这样悲剧,什么享受人生,什么未来,未来在哪里,在施工单位没关系就充其量是个测量队长(部长).何谈前途, 工作的时候经