(python)斗地主游戏中的炸弹概率分析

 一、题目介绍

这是一个出现在我作业中的题目,以下是题目原文

炸弹概率分析

斗地主游戏中,炸弹可以是四张一样数字或字母的牌,如:四张K、四张5,也可以是一对大小王。请计算斗地主游戏中,炸弹出现的概率。

 题目范围感觉特别的广泛所以我的答案也就只是单纯的发挥了我的想象力去回答这个题目

二、python代码

import random


def boom():
    farmer_flag = 0
    landlord_flag = 0
    for i in range(10000):
        farmer = []
        landlord = []
        f_card = 0
        while f_card < 17:
            cards = random.choice("123456789XJQKBM")
            if farmer.count(cards) >= 4:
                pass
            elif cards == "B" and farmer.count("B") == 1:
                pass
            elif cards == "M" and farmer.count("M") == 1:
                pass
            else:
                farmer.append(cards)
                f_card += 1
        l_card = 0
        while l_card < 20:
            cards = random.choice("123456789XJQKBM")
            if landlord.count(cards) >= 4:
                pass
            elif cards == "B" and landlord.count("B") == 1:
                pass
            elif cards == "M" and landlord.count("M") == 1:
                pass
            else:
                landlord.append(cards)
                l_card += 1
        for i in "123456789XJQK":
            if farmer.count(i) == 4 or ("B" in farmer and "M" in farmer):
                farmer_flag += 1
                break
        for i in "123456789XJQK":
            if landlord.count(i) == 4 or ("B" in landlord and "M" in landlord):
                landlord_flag += 1
                break
    return farmer_flag / 10000, landlord_flag / 10000


print("农民获得炸弹的概率为{:.2f}%,地主获得炸弹的概率为{:.2f}%".format(boom()[0] * 100, boom()[1] * 100))

三、代码分析

import random


# 导入random包

def boom():
    farmer_flag = 0
    landlord_flag = 0
    # 这个是农民和地主获得炸弹的概率
    for i in range(10000):
        # 次数跑1w次
        farmer = []
        landlord = []
        # 每次中的农民和地主的手牌集合
        f_card = 0
        # 农民手牌数
        while f_card < 17:
            # 如果农民手牌不足17张就一直循环
            card = random.choice("123456789XJQKBM")
            # 每张牌从扑克牌中随机选择,X代表10,B代表大王,M代表小王
            if farmer.count(card) >= 4:
                # 如果随机到的牌在牌堆里面已经有4张了就pass,确保不会有5张一样的牌
                pass
            elif card == "B" and farmer.count("B") == 1:
                # 随机到大王而牌堆里面已经有大王的就pass
                pass
            elif card == "M" and farmer.count("M") == 1:
                # 随机到小王而牌堆里面已经有小王的就pass
                pass
            else:
                farmer.append(card)
                f_card += 1
                # 只要没有上面那些异常情况就添加到手牌集合里面同时手牌数+1
        # 地主的这些同理,代码基本都一样
        l_card = 0
        while l_card < 20:
            card = random.choice("123456789XJQKBM")
            if landlord.count(card) >= 4:
                pass
            elif card == "B" and landlord.count("B") == 1:
                pass
            elif card == "M" and landlord.count("M") == 1:
                pass
            else:
                landlord.append(card)
                l_card += 1
        # 下面这些就是判断牌堆里面是否有炸弹
        for i in "123456789XJQK":
            if farmer.count(i) == 4 or ("B" in farmer and "M" in farmer):
                farmer_flag += 1
                break
                # 如果一张牌出现了4次也就是有炸弹或者农民的牌堆中同时有大小王就确定这个农民牌堆中有炸弹,并打断循环
        # 地主的也同理
        for i in "123456789XJQK":
            if landlord.count(i) == 4 or ("B" in landlord and "M" in landlord):
                landlord_flag += 1
                break
    return farmer_flag / 10000, landlord_flag / 10000
    # 因为跑了一万次,所以最后除一万来获得几率


print("农民获得炸弹的概率为{:.2f}%,地主获得炸弹的概率为{:.2f}%".format(boom()[0] * 100, boom()[1] * 100))
# 这个就是单纯的取值输出了

 四、代码思路

总体的来说就是在15种的54张卡牌里面里面随机给17张或者20张卡牌来模拟是否有炸弹,同时在随机给牌时要避免发了5张一模一样的牌和发了两张大王或者两张小王这种情况,最后判断牌堆里面是否有4张一样的炸弹或者同时有大小王这种情况,因为只要有炸弹就添加次数,没有就不加,break打断是因为有时候不一定只有一个炸弹,会有多个炸弹的这种可能,所以也要去除这种可能

五、代码演示

用以下代码来分别次数

farmer = sorted(farmer)
landlord = sorted(landlord)
# 排序牌堆
print(farmer)
print(landlord)
# 输出牌堆
print("当前农民有炸弹的次数:", farmer_flag)
print("当前地主有炸弹的次数:", landlord_flag)

 

最终结果是农民有68%左右的几率有炸弹,地主则是有82%左右

PS:概率意外的有些高啊,为啥我玩斗地主的时候炸弹好像不那么高嘞

欢迎其他想法来评论区讨论讨论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值