体育竞技模拟比赛
Posted sgzhang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了体育竞技模拟比赛相关的知识,希望对你有一定的参考价值。
乒乓球比赛基本规则:
一方首先具有发球权,双方连续击打,球落地则该回合结束。如果输掉这一回合的是发球方,双方均不加分,但发球权要交给另一方。如果发球方赢得了这一回合,则发球方赢得1分,并继续拥有发球权。比赛总共进行n 局。一局比赛中,先得11分的一方为胜方,10平后,先多得2分得一方为胜方,胆大的淘汰赛采用七局四胜制,双打的淘汰赛和团体赛采用五局三胜制。
采用自顶向下的程序设计
步骤一:打印程序的介绍性信息
步骤二:获得运行需要的参数,即porbA,porbB,n
步骤三:利用球员A和B得能力值probA和probB,模拟n次比赛
步骤四:输出球员A和B得获胜比赛得场次及概率
def main():
printIntro()##输出介绍信息
probA,probB,n=getInputs()##获得用户输入,通过函数将语句及输入格式等细节封装或隐藏调用getInputs函数获取变量n,probA,probB的值。这个函数必须 作为主程序给返回这些值
winsA,winsB=simNGames(n,probA,probB)##需要使用probA,probB模拟n场比赛,设计一个simNGames函数模拟比赛并返回结果
printsummary(winsA,winsB)##输出结果
代码
# -*- coding: utf-8 -*-
"""
Created on Sat May 11 16:37:13 2019
"""
Created on Sat May 11 16:37:13 2019
@author: 18605
"""
"""
#e15.1MatchAnalysis.py
from random import random
def printIntro():#打印程序的介绍性信息
print("33号程序模拟两个选手A和B的乒乓球竞技比赛")
print("33号程序运行需要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):#利用A,B的的能力值模拟N场比赛
winsA,winsB=0,0
for i in range(n):
pingpangA,pingpangB=simOneGame(probA,probB)#simOneGame函数用于模拟一场比赛
if(pingpangA>pingpangB):#计数循环,记录每个成员赢了多少局比赛
winsA+=1
else:
winsB+=1
return winsA,winsB
def gameOver(a,b):#比赛结束的条件(再一局比赛中,先得11分者为胜方;10平后,先得2分的一方为胜方)
if(a-b==2 and a>=10 and b>=10):
return True
elif(b-a==2 and a>=10 and b>=10):
return True
if a==11 or b==11:
return True
else:
return False
def simOneGame(probA,probB):#用于模拟一场比赛
pingpangA,pingpangB=0,0
serving="A"#先由A发球
while not gameOver(pingpangA,pingpangB):
if(serving==‘A‘):
if random() < probA:#通过随机数和概率确定发球放是否赢得比分(random()<prob)
pingpangA += 1#若A赢得比分,则发球权不变
else:
serving=‘B‘#反之发球权给B
else:
if random() < probB:
pingpangB += 1
else:
serving="A"
return pingpangA,pingpangB
def printsummary(winsA,winsB):#输出A,B获胜的比赛场次及概率
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()
from random import random
def printIntro():#打印程序的介绍性信息
print("33号程序模拟两个选手A和B的乒乓球竞技比赛")
print("33号程序运行需要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):#利用A,B的的能力值模拟N场比赛
winsA,winsB=0,0
for i in range(n):
pingpangA,pingpangB=simOneGame(probA,probB)#simOneGame函数用于模拟一场比赛
if(pingpangA>pingpangB):#计数循环,记录每个成员赢了多少局比赛
winsA+=1
else:
winsB+=1
return winsA,winsB
def gameOver(a,b):#比赛结束的条件(再一局比赛中,先得11分者为胜方;10平后,先得2分的一方为胜方)
if(a-b==2 and a>=10 and b>=10):
return True
elif(b-a==2 and a>=10 and b>=10):
return True
if a==11 or b==11:
return True
else:
return False
def simOneGame(probA,probB):#用于模拟一场比赛
pingpangA,pingpangB=0,0
serving="A"#先由A发球
while not gameOver(pingpangA,pingpangB):
if(serving==‘A‘):
if random() < probA:#通过随机数和概率确定发球放是否赢得比分(random()<prob)
pingpangA += 1#若A赢得比分,则发球权不变
else:
serving=‘B‘#反之发球权给B
else:
if random() < probB:
pingpangB += 1
else:
serving="A"
return pingpangA,pingpangB
def printsummary(winsA,winsB):#输出A,B获胜的比赛场次及概率
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()
显示结果
以上是关于体育竞技模拟比赛的主要内容,如果未能解决你的问题,请参考以下文章