用python根据比赛规则模拟乒乓球比赛和篮球比赛(python 课本课后练习8.1和8.2)

本文档展示了如何使用Python编写一个程序,模拟乒乓球或篮球比赛,根据选手的能力值计算比赛结果。通过7局4胜制,实现模拟多场比赛并输出选手的胜率。
摘要由CSDN通过智能技术生成
from random import random#引用随机库
def main():
    printIntro()
    probA,probB, n = getInputs()
    winsA,winsB = simNGames(n,probA,probB)
    printSummary(winsA,winsB)

def printIntro():#打印程序介绍信息
    print("这个程序模拟两个选手A和B的乒乓球竞技比赛")#8.2则将乒乓球改为篮球
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")

def getInputs():#获得程序运行参数
    a = eval(input("请输入选手A的能力值(0-1):"))
    b = eval(input("请输入选手B的能力值(0-1):"))
    n = eval(input("模拟比赛的场次:"))
    return a, b, n

def simNGames(n, probA, probB):#进行N场比赛,每场比赛7局4胜制
    winsA, winsB = 0, 0
    for i in range(n):
         for j in range(7):          #进⾏7局4胜的⽐赛
             scoreA, scoreB = simOneGame(probA, probB)
             if scoreA > scoreB:
                winsA += 1
             else:
                winsB += 1
    return winsA, winsB

def simOneGame(probA, probB):#进行一场比赛
    scoreA, scoreB = 0, 0#开局得分都为0
    serving = "A"
    while not gameOver(scoreA, scoreB):#用循环执行比赛
        if scoreA == 10 and scoreB == 10:#篮球比赛则将10改为23
            return (simtwoGame2(probA, probB))
        if serving == "A":
            if random() < probA:#用随机数生成胜负
               scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB

def simtwoGame2(probA, probB):
    scoreA, scoreB = 10, 10#篮球同理改为23
    serving = "A"
    while not gameOver2(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random() < probB:
               scoreB += 1
            else:
                serving = "A"
    return scoreA,scoreB

def gameOver(a, b):#正常比赛结束
    return a == 11 or b == 11#篮球比赛则将11改为24

def gameOver2(a, b):#进行抢12比赛结束
    if abs((a-b)) >= 2:
       return a, b

def printSummary(winsA, winsB):#打印程序结果信息
    n = winsA + winsB
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))

main()#调用主函数

        相比于实例15,模拟乒乓球比赛和篮球比赛时,需要在原本定义的simNGames内加入一个7次的for循环进行7局4胜的判断。

        同时,要注意抢12的规则,在定义函数simOneGame时注意加入10:10(乒乓球比赛)或者23:23(篮球比赛)这种平局情况的判断,然后增加函数simtwoGame2进行决胜场的比赛。

        可以观察出增加的函数simtwoGame2和实例15的函数simtwoGame其实是一样的。

        为了使抢12的规则顺利进行下去,后面实际上还增加定义了函数gameOver2对应最后一场比赛的结束判断。

        乒乓球比赛与篮球比赛同样是7局4胜,唯一不同的是进行场数不同,乒乓球最多进行11场,篮球最多进行24场,所以在原来的场数部分进行修改即可相互转换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值