比赛规则

任务目标

  模拟排球竞技比赛,并且得出模拟结果

  比赛规则如下

     前4局比赛采用25分制,每个队只有至少赢得25分,并且同时超过对方2分时,才胜一局

     正式比赛采用5局3胜制,决胜局的比赛采用15分制,1队先得8分,两队交换场地,按原位置顺序继续进行比赛到结束

     在决胜局(第5局)的比赛,先获15分并领先对方2分为胜

  输入如下代码

  

  1 from random import random
  2 def printIntro():
  3     print("这个程序模拟两个选手A和B的排球竞技比赛")
  4     print("程序需要A和B的能力值(0到1之间的小数表示)")
  5 def getInputs():
  6     a=eval(input("请输入选手A的能力值(0-1):"))
  7     b=eval(input("请输入选手B的能力值(0-1):"))
  8     n=eval(input("模拟比赛场次:"))
  9     return a,b,n
 10 def simNGames(n,probA,probB):
 11     winsA,winsB=0,0
 12     for i in range(n):
 13         scoreA,scoreB=simOneGame(probA,probB)
 14         if scoreA>scoreB:
 15             winsA+=1
 16         else:
 17             winsB+=1
 18     return winsA,winsB
 19 def gameOver(a,b):
 20     if (a>25 and abs(a-b)>=2 )or(b>25 and abs(a-b)>=2):
 21         return True
 22     else:
 23         return False
 24 def simOneGame(probA,probB):
 25     scoreA,scoreB=0,0
 26     serving="A"
 27     while not gameOver(scoreA,scoreB):
 28         if serving=="A":
 29             if random() < probA:
 30                 scoreA += 1
 31             else:
 32                 serving="B"
 33         else:
 34             if random() < probB:
 35                 scoreB += 1
 36             else:
 37                 serving="A"
 38     return scoreA,scoreB
 39 def final(probA,probB):
 40     winsA,winsB=simNGames1(4,probA,probB)
 41     printSummary(winsA,winsB)
 42     if not winsA==3 or winsB==3:
 43         if winsA==winsB==2:
 44             winsA1,winsB1=simOneGame1(probA,probB)
 45             finalprintSummary(winsA,winsB)
 46     else:
 47         finalprintSummary(winsA,winsB)
 48 def simNGames1(n,probA,probB):
 49     winsA,winsB=0,0
 50     for i in range(n):
 51         scoreA,scoreB=simOneGame2(probA,probB)
 52         if winsA==3 or winsB==3:
 53             break
 54         if scoreA>scoreB:
 55             winsA+=1
 56         else:
 57             winsB+=1
 58     return winsA,winsB
 59 def simOneGame2(probA,probB):
 60     scoreA,scoreB=0,0
 61     serving="A"
 62     while not GG(scoreA,scoreB):
 63         if serving=="A":
 64             if random() < probA:
 65                 scoreA += 1
 66             else:
 67                 serving="B"
 68         else:
 69             if random() < probB:
 70                 scoreB += 1
 71             else:
 72                 serving="A"
 73     return scoreA,scoreB
 74 def simOneGame1(probA,probB):
 75     scoreA,scoreB=0,0
 76     serving="A"
 77     while not finalGameOver(scoreA,scoreB):
 78         if serving=="A":
 79             if random() < probA:
 80                 scoreA += 1
 81             else:
 82                 serving="B"
 83         else:
 84             if random() < probB:
 85                 scoreB += 1
 86             else:
 87                 serving="A"
 88     return scoreA,scoreB
 89 def GG(a,b):
 90     return a==3 or b==3
 91 def finalGameOver(a,b):
 92     if (a>15 and abs(a-b)>=2 )or(b>15 and abs(a-b)>=2):
 93         return True
 94     else:
 95         return False
 96 def finalprintSummary(winsA,winsB):
 97     n=winsA+winsB
 98     if n>=4:
 99         print("进行最终决赛")
100         if winsA>winsB:
101             print("最终决赛由A获胜")
102         else:
103             print("最终决赛由B获胜")
104     else:
105         if winsA>winsB:
106             print("最终决赛由A获胜")
107         else:
108             print("最终决赛由B获胜")
109 def printSummary(winsA,winsB):
110     n=winsA+winsB
111     print("竞技分析开始,共模拟{}场比赛".format(n))
112     print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
113     print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
114 def main():
115     printIntro()
116     probA,probB,n=getInputs()
117     winsA,winsB=simNGames(n,probA,probB)
118     printSummary(winsA,winsB)
119     final(probA,probB)
120 main()

输出结果如右下角

    

猜你喜欢

转载自www.cnblogs.com/qq1079179226/p/10865181.html