Python实现武汉麻将(带癞子)

背景

闲着没事,写了个武汉麻将的判断胡牌方法,因为每把癞子不一样而且只能带一个癞子胡牌,所以没有判断多个癞子的情况,主要是碰到清一色又带癞子的情况,不知道胡了没有,而且打哪张胡的更多,类似于一个简单的指示器

【注】如果胡牌的时候没有癞子或者癞子没有变成其他牌,算是硬的,两倍计算;胡牌的时候有癞子,算是软的,一倍计算

直接上代码

card = {11: '一万', 12: '二万', 13: '三万', 14: '四万', 15: '五万', 16: '六万', 17: '七万', 18: '八万', 19: '九万',
        21: '一筒', 22: '二筒', 23: '三筒', 24: '四筒', 25: '五筒', 26: '六筒', 27: '七筒', 28: '八筒', 29: '九筒',
        31: '一条', 32: '二条', 33: '三条', 34: '四条', 35: '五条', 36: '六条', 37: '七条', 38: '八条', 39: '九条',
        41: '东风', 42: '南风', 43: '西风', 44: '北风', 45: '红中', 46: '发财', 47: '白板'}


def if_success(cards14):
    # 找到所有的对子,判断剩下的12张能不能组成顺子
    pair = []
    for i in set(cards14):
        if cards14.count(i) >= 2:
            pair.append(i)
    # print(pair)
    for p in pair:
        tmp = cards14[:]
        tmp.remove(p)
        tmp.remove(p)
        # print('\n去除对子之后的序列为:', tmp)

        # 现在判断tmp是不是顺序序列
        for trip in set(tmp):
            if tmp.count(trip) >= 3:
                tmp.remove(trip)
                tmp.remove(trip)
                tmp.remove(trip)
        # print('去除三张之后的序列为:', tmp)

        # 现在判断tmp里面还有没有顺子
        tmp.sort()
        while len(tmp) > 0:
            start = tmp[0]
            if start + 1 in tmp and start + 2 in tmp:
                tmp.remove(start)
                tmp.remove(start + 1)
                tmp.remove(start + 2)
            else:
                break
        # print('去除三连之后的序列为:', tmp)

        if not tmp:
            return True
    return False


def if_ready(cards13, ran):
    # 武汉麻将胡牌时至多只能有一个癞子
    cards13.sort()
    ans, ans_print = [], []

    # print('Begin:', cards13, len(cards13))
    # 考虑癞子,且癞子已经存在手牌里
    if ran in cards13:
        cards13.remove(ran)
        for i in range(11, 40):
            if i % 10 == 0:
                continue
            cards13.append(i)
            for j in range(11, 40):
                if j % 10 == 0:
                    continue
                cards13.append(j)
                if if_success(cards13):
                    ans.append(j)
                    # print('癞子当做:', card[i], '可以胡:', card[j])
                cards13.remove(j)
            cards13.remove(i)
        cards13.append(ran)
        if not ans:
            # print('还没停口!!!打牌!摸牌!')
            return False
        # print('Switch1:', cards13, len(cards13))
    # 考虑癞子,但癞子不存在手牌里
    else:
        ans.append(ran)
        for i in range(11, 40):
            if i % 10 == 0:
                continue
            cards13.append(i)
            if if_success(cards13):
                ans.append(i)
            cards13.remove(i)
        if len(ans) == 1:
            # print('还没停口!!!打牌!摸牌!')
            return False
        # print('Switch2:', cards13, len(cards13))
    ans = list(set(ans))
    ans.sort()
    for i in ans:
        ans_print.append(card[i])
    # print('可以胡:', ans_print)
    # print('End:', cards13, len(cards13))
    return ans_print


def success_or_ready(cards14: list, ran: int):
    cards14.sort()
    cards14_print = []
    ans = 0
    for i in cards14:
        cards14_print.append(card[i])
    print('这副牌是:', cards14_print)
    print('癞子是:', card[ran])

    # case1:不管有没有癞子,直接糊了,硬的
    if if_success(cards14):
        print('胡牌!硬的!赢2倍!')
        return True

    # case2:有癞子,也糊了,软的
    if ran in cards14:
        cards14.remove(ran)
        for i in range(11, 40):
            if i in [20, 30]:
                continue
            cards14.append(i)
            if if_success(cards14):
                print('胡牌!软的!赢1倍!')
                return True
            cards14.remove(i)
        cards14.append(ran)

    # case3:不管有没有癞子,打一张停口
    tmp = list(set(cards14[:]))

    for i in tmp:
        cards14.remove(i)
        # print(cards14, len(cards14))
        if if_ready(cards14, ran):
            print('打掉:', card[i], '可以胡:', if_ready(cards14, ran))
            ans += 1
        cards14.append(i)

    # case4:不管有没有癞子,口都没停
    if ans == 0:
        print('【警告】口都没停!随便打一张吧!')

    return True


if __name__ == '__main__':
    cards14 = [11,11,11,12,13,14,15,16,17,18,19,19,19,22]
    cards13 = [13,13,13,14,14,14,15,16,17,18,19,19,19]
    ran = 21
    # print(if_ready(cards13, ran))
    success_or_ready(cards14, ran)

运行结果是这样的:

这副牌比较有代表性,1112345678999,这13张底牌甚至还有个专业名词:九莲宝灯,一到九万都可以胡牌,用来判断麻将程序的执行结果非常适合

【注】这里没有判断暗杠加番的情况,只算是普通胡牌;七小对也不能胡牌;感兴趣的可以基于我的代码继续修改,增加这些判断方式

总结

这一版暂时写出来给我自己看的,还没润色,后期会在这篇文章上继续修改,增加注释和评论

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值