排球比赛规则的程序化

一、排球比赛规则

比赛采用每球得分制,前4局以先得25分,并同时超出对方2分的队获胜。

决胜局以先得15分,并同时超出对方2分的队获胜。正式比赛采用五局三胜制。

二、实现排球比赛规则的简单程序

from random import random
def printIntro():
    print("36号程序员的程序模拟两个选手A和B的排球比赛")
    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):
    winsA,winsB=0,0
    for i in range(n):
        scoreA,scoreB=simOneGame(probA,probB)
        if scoreA>scoreB:
            winsA+=1
        else:
            winsB+=1
    return winsA,winsB
def gameOver1(a,b):
    return (a>=25 and a-b>2) or (b>=25 and b-a>2)
def gameOver2(a,b):
    return (a>=15 and a-b>2) or (b>=15 and b-a>2)
def simOneGame(probA,probB):
    
    for i in range (5):
        winsA,winsB=0,0
        scoreA,scoreB=0,0
        serving="A"
        while not gameOver1(scoreA,scoreB):
            if serving=="A":
                if random()<probA:
                    scoreA+=1
                else:
                    scoreB+=1
                    serving="B"
            else:
                if random()<probB:
                    scoreB+=1
                else:
                    serving="A"
                    scoreA+=1
            if scoreA>scoreB:
                winsA+=1
            else:
                winsB+=1
            if winsA==3 or winsB==3:
                break
            if winsA==2 and winsB==2:
                simtowGame(probA,probB)
    return winsA,winsB
def simtowGame(probA,probB):
    
    for i in range (1):
        scoreA,scoreB=0,0
        serving="A"
        while not gameOver2(scoreA,scoreB):
            if serving=="A":
                if random()<probA:
                    scoreA+=1
                else:
                    scoreB+=1
                    serving="B"
            else:
                if random()<probB:
                    scoreB+=1
                else:
                    serving="A"
                    scoreA+=1
    return scoreA,scoreB
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))
def main():
    printIntro()
    probA,probB,n=getInputs()
    winsA,winsB=simNGames(n,probA,probB)
    printSummary(winsA,winsB)
main()

•效果图

• 打包后的exe文件

 

posted @ 2019-05-14 18:59  半松  阅读(263)  评论(0编辑  收藏  举报