from random import random
def printIntro(): #打印程序介绍信息
print("23谢宝谊进行比赛分析结果:")
print("这个程序模拟两个队伍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): # 进行N场比赛
winsA, winsB = 0, 0
for i in range(n):
for j in range(5): #进行5局3胜的比赛
scoreA, scoreB = simOneGame(probA, probB)
if scoreA > scoreB:
winsA += 1
else:
winsB += 1
return winsA, winsB
def gameOver(a,b): #正常比赛结束
return a==11 or b==11
def gameOver2(a,b): #进行抢12比赛结束
return a==12 or b==12
def simOneGame(probA, probB): #进行一场比赛
scoreA, scoreB = 0, 0 #初始化AB的得分
serving = "A"
while not gameOver(scoreA, scoreB): #用while循环来执行比赛
if scoreA==10 and scoreB==10:
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
serving = "A" #假如先让队伍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 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()
![]()
# -*- encoding:utf-8 -*-
'''
模拟足球竞技
@author: bpf
'''
# 比赛规则:
# 1. 比赛分为两场,每场为45分钟
# 上半场: 一方挑选进攻的球门,另一方获得开球权
# 下半场: 互换攻守方向,上半场没获得开球权的一方获得开球权
# 2. 在进球后开球时,开球方为失球一方
# 3. 在没有违反任何比赛规则时,进攻球队得分。
# 4. 比赛结束时得分多的球队获胜,如果两队得分相同或均未得分,比赛为平局。
from random import random, randint
from time import time
def printInfo():
'''
function: 打印程序的介绍信息
'''
print("{:*^70}".format("产品简介"))
print("足球竞技模拟")
print("通过输入2个队伍A和B的能力值(0到1之间的小数表示),能够模拟多次2个队伍A和B的排球竞技比赛,从而得出各自的胜率!")
print("23号谢宝谊")
print("{:*^70}".format("模拟开始"))
def getInputs():
'''
function: 获得用户输入的参数
'''
probA = eval(input("请输入队伍A的能力值(0~1):"))
probB = eval(input("请输入队伍B的能力值(0~1):"))
n = eval(input("请输入需要模拟比赛的场次数:"))
return probA, probB, n
def printResult(n, via, winsA, winsB):
'''
function: 输出模拟比赛的结果
'''
print("{:*^70}".format("模拟结束"))
print("竞技分析开始,共模拟{}场比赛。".format(n))
print(">>>队伍A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))
print(">>>队伍B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
print(">>>两队平局{}场,占比{:0.1%}".format(via,via/n))
def simNGames(n, probA, probB):
'''
function: 模拟n场比赛
n: 模拟n场比赛
probA, probB: 分别为队伍A和B的能力值
winsA, winsB: 队伍A和B赢得比赛的场数,总共n场
'''
via, winsA, winsB = 0, 0, 0
for _ in range(n):
scoreA, scoreB = simOneGame(probA, probB)
if scoreA == scoreB:
via += 1
elif scoreA > scoreB:
winsA += 1
else:
winsB += 1
return via, winsA, winsB
def simOneGame(probA, probB):
'''
function: 模拟一场比赛, 分上半场和下半场
probA, probB: 分别为队伍A和B的能力值
scoreA, scoreB: 分别为队伍A和B一场比赛的分数
return: 返回队伍A和B在本场比赛中获得的分数
'''
winA, winB = 0, 0
for N in range(2):
scoreA, scoreB = simAGame(N, probA, probB)
winA += scoreA
winB += scoreB
return winA, winB
def simAGame(N, probA, probB):
'''
function: 模拟半场比赛
probA, probB: 分别为队伍A和B的能力值
scoreA, scoreB: 分别为队伍A和B半场比赛的分数
return: 返回队伍A和B在本半场比赛中获得的分数
'''
scoreA, scoreB = 0, 0
if N == 0:
serving = 'A' # 发球方
else:
serving = 'B'
for _ in range(gameOver()):
if serving == 'A':
if random() < probA:
scoreA += 1
serving = 'B'
else:
if random() < probB:
scoreB += 1
serving = 'A'
return scoreA, scoreB
def gameOver():
'''
function: 定义半场比赛的结束条件
通过randint产生一个随机数作为半场比赛的回合数, 若达到半场比赛的回合数则结束比赛
return: 若比赛结束的条件成立返回真,否则为假
'''
return randint(3, 10)
if __name__ == "__main__":
printInfo()
probA, probB, n = getInputs()
Time = time()
via, winsA, winsB = simNGames(n, probA, probB)
print("模拟用时: {:.1f}s".format(time()-Time))
printResult(n, via, winsA, winsB)
![]()
from random import random
def printIntro(): #打印程序介绍信息
print("23号谢宝谊进行比赛分析结果:")
print("这个程序模拟两个选手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): # 进行N场比赛
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 gameOver(a,b): #正常比赛结束
return a==11 or b==11
def gameOver2(a,b): #进行抢12比赛结束
if abs((a-b))>=2:
return a,b
def simOneGame(probA, probB): #进行一场比赛
scoreA, scoreB = 0, 0 #初始化AB的得分
serving = "A"
while not gameOver(scoreA, scoreB): #用while循环来执行比赛
if scoreA==10 and scoreB==10:
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
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 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)
n=input("输入任何数")
main()
![]()