足球模拟
作者:互联网
1 # 比赛规则: 2 # 1. 比赛分为两场,每场为45分钟 3 # 上半场: 一方挑选进攻的球门,另一方获得开球权 4 # 下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权 5 # 2. 在进球后开球时,开球方为失球一方 6 # 3. 在没有违反任何比赛规则时,进攻球队得分。 7 # 4. 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。 8 9 from random import random, randint 10 from time import time 11 def printInfo(): 12 ''' 13 function: 打印程序的介绍信息 14 ''' 15 print("{:*^70}".format("产品简介")) 16 print("足球竞技模拟") 17 print("通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!") 18 print("17号杨冬圆") 19 print("{:*^70}".format("模拟开始")) 20 21 def getInputs(): 22 ''' 23 function: 获得用户输入的参数 24 ''' 25 probA = eval(input("请输入队伍A的能力值(0~1):")) 26 probB = eval(input("请输入队伍B的能力值(0~1):")) 27 n = eval(input("请输入需要模拟比赛的场次数:")) 28 return probA, probB, n 29 30 def printResult(n, via, winsA, winsB): 31 ''' 32 function: 输出模拟比赛的结果 33 ''' 34 print("{:*^70}".format("模拟结束")) 35 print("竞技分析开始,共模拟{}场比赛。".format(n)) 36 print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n)) 37 print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n)) 38 print(">>>两队平局{}场,占比{:0.1%}".format(via,via/n)) 39 40 def simNGames(n, probA, probB): 41 ''' 42 function: 模拟n场比赛 43 n: 模拟n场比赛 44 probA, probB: 分别为队伍A和B的能力值 45 winsA, winsB: 队伍A和B赢得比赛的场数,总共n场 46 ''' 47 via, winsA, winsB = 0, 0, 0 48 for _ in range(n): 49 scoreA, scoreB = simOneGame(probA, probB) 50 if scoreA == scoreB: 51 via += 1 52 elif scoreA > scoreB: 53 winsA += 1 54 else: 55 winsB += 1 56 return via, winsA, winsB 57 58 def simOneGame(probA, probB): 59 ''' 60 function: 模拟一场比赛, 分上半场和下半场 61 probA, probB: 分别为队伍A和B的能力值 62 scoreA, scoreB: 分别为队伍A和B一场比赛的分数 63 return: 返回队伍A和B在本场比赛中获得的分数 64 ''' 65 winA, winB = 0, 0 66 for N in range(2): 67 scoreA, scoreB = simAGame(N, probA, probB) 68 winA += scoreA 69 winB += scoreB 70 return winA, winB 71 72 def simAGame(N, probA, probB): 73 ''' 74 function: 模拟半场比赛 75 probA, probB: 分别为队伍A和B的能力值 76 scoreA, scoreB: 分别为队伍A和B半场比赛的分数 77 return: 返回队伍A和B在本半场比赛中获得的分数 78 ''' 79 scoreA, scoreB = 0, 0 80 if N == 0: 81 serving = 'A' # 发球方 82 else: 83 serving = 'B' 84 for _ in range(gameOver()): 85 if serving == 'A': 86 if random() < probA: 87 scoreA += 1 88 serving = 'B' 89 else: 90 if random() < probB: 91 scoreB += 1 92 serving = 'A' 93 return scoreA, scoreB 94 95 def gameOver(): 96 ''' 97 function: 定义半场比赛的结束条件 98 通过randint产生一个随机数作为半场比赛的回合数, 若达到半场比赛的回合数则结束比赛 99 return: 若比赛结束的条件成立返回真,否则为假 100 ''' 101 return randint(3, 10) 102 103 if __name__ == "__main__": 104 printInfo() 105 probA, probB, n = getInputs() 106 Time = time() 107 via, winsA, winsB = simNGames(n, probA, probB) 108 print("模拟用时: {:.1f}s".format(time()-Time)) 109 printResult(n, via, winsA, winsB)
标签:比赛,scoreB,probB,probA,print,足球,模拟,scoreA 来源: https://www.cnblogs.com/yuanyuanprincess/p/14021344.html