体育竞技分析
一、程序总体框架及步骤:
步骤1:打印程序的介绍性信息
步骤2:获得程序运行参数:probA,probB,n
步骤3:利用球员A和B的能力值,模拟n局比赛
步骤4:输出球员A和B获得比赛的场次和概率
框架表示:
二、程序设计(自顶向下):
代码简单介绍:
函数名称
函数说明
printInfo()
打印程序的介绍信息
getInputs()
获得用户输入的参数
printResult(n, winsA, winsB)
输出模拟比赛的结果
simNGames(n, probA, probB)
模拟n场比赛
simOneGame(probA, probB)
模拟一场比赛,包括五局,采取五局三胜制
simAGame(N, probA, probB)
模拟一局比赛
GameOver(N, scoreA, scoreB)
定义一局比赛的结束条件
具体函数代码:
顶层设计:
defmain():
printIntro()
probA , probB , n=getInputs()
winsA , winsB=simNGames(n, probA, probB)
printSummary(winsA, winsB)
步骤一:printIntro()函数
defprintInfo():print("这个程序模拟两个选手A和B的体育竞技比赛")print("程序需要两个选手的能力值0-1")print("规则:")print("作者: 学号:")
步骤二:getInputs()函数
defgetInput():
a= eval(input("请输入选手A的能力值(0-1):"))
b= eval(input("请输入选手B的能力值(0-1):"))
m=eval(input("比赛的局数:"))
n= eval(input("模拟比赛的场次:"))return a,b,m,n
步骤三:simNGames()函数
defmain():
printIntro()
probA,probB,n=getInputs()
winA,winB=simNGames(n,probA,probB)
printSummary(winsA,winsB)
步骤四:printSummary()函数
defprintSummary(winsA,winsB):
n= winsA +winsBprint("竞技分析开始,共模拟{}场比赛".format(n))print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))
三、羽毛球竞技程序设计实例:
比赛规则·
1. 21 分制,3局2胜为佳2. 每球得分制3. 每回合中,取胜的一方加 1 分4. 当双方均为 20 分时,领先对方 2 分的一方赢得该局比赛5. 当双方均为 29 分时,先取得 30 分的一方赢得该局比赛6. 一局比赛的获胜方在下一局率先发球
#体育竞技
from random importrandomdefmain():
printInfo()
probA,probB,m,n=getInput()
winsA,winsB=simNGames(m,n,probA,probB)
printSummary(winsA,winsB)defprintInfo():print("这个程序模拟两个选手A和B的羽毛球竞技比赛")print("程序需要两个选手的能力值0-1")print("规则:三局两胜--21分制")print("作者:阮满欢 学号:47")defgetInput():
a= eval(input("请输入选手A的能力值(0-1):"))
b= eval(input("请输入选手B的能力值(0-1):"))
m=eval(input("比赛的局数:"))
n= eval(input("模拟比赛的场次:"))returna,b,m,ndefprintSummary(winsA,winsB):
n= winsA +winsBprint("竞技分析开始,共模拟{}场比赛".format(n))print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA,winsA/n))print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB,winsB/n))defsimNGames(m,n,probA,probB):
winsA,winsB=0,0
wa,wb=0,0for i inrange(n):for i inrange(m):
scoreA,scoreB=simOneGame(probA,probB)if scoreA >scoreB:
wa+= 1
else:
wb+= 1
if wa==2:
winsA+=1wa,wb=0,0break
if wb==2:
winsB+=1wa,wb=0,0break
returnwinsA,winsBdefsimOneGame(probA,probB):
scoreA,scoreB=0,0
serving= "A"
while notgameOver(scoreA,scoreB):if serving == "A":if random()
scoreA+= 1
else:
serving= "B"
else:if random()
scoreB+= 1
else:
serving= "A"
returnscoreA,scoreBdefgameOver(a,b):if(a>=20 or b>=20):if(abs(a-b)==2 and a<=29 and b<=29):returnTrueelse:return a==30 or b==30
else:return False
main()
运行结果:
三、程序打包
使用pyinstaller打包,把Python脚本打包成可执行的文件。即把.py文件打包成.exe文件,则可以直接运行结果。
1.首先要安装pyinstaller库
在cmd中输入下面一句代码:
pip install pyinstaller
2.使用pyinstaller时;在上述代码的main函数的最后加上 input() 语句,防止程序一运行完就自动退出。
(记得在代码后加input()语句)
四、篮球比赛模拟实例
赛事规则:
1.1 篮球比赛
篮球比赛由两个队参加,每队出场5名队员。每队目标是在对方球篮得分,并阻止对方队在本方球篮得分。
篮球比赛由裁判员、记录台人员和技术代表(如到场)管理。
1.2 球篮:本方/对方
被某队进攻的球篮是对方的球篮,由某队防守的球篮是本方的球篮。
1.3 比赛的胜者
在比赛时间结束时得分较多的队,将是比赛的胜者。
#-*- coding: utf-8 -*-
"""Created on Mon May 13 19:46:23 2019
@author: 18 EliO FanG"""
from math importfabsfrom random importrandomdefprintIntro():'''function: 打印程序的介绍信息'''
print("模拟篮球比赛的代码分析")print("这个程序模拟两支队伍A和B的篮球比赛")print("程序运行需要A和B的能力值(以0到1之间的小数表示)")print("作者:阮满欢 47")defgetInputs():
a= eval(input("请输入A队的能力值(0-1):"))
b= eval(input("请输入B队的能力值(0-1):"))
n= eval(input("模拟比赛的场次:"))returna, b, ndefsimNGames(n, probA, probB):
winsA, winsB=0, 0for i inrange(n):
scoreA, scoreB=simOneGame(probA, probB)if scoreA >scoreB:
winsA+= 1
else:
winsB+= 1
returnwinsA, winsBdefgameOver(a,b):return a>b or b>adefsimOneGame(probA, probB):
scoreA, scoreB=0, 0
serving= "A"
while notgameOver(scoreA, scoreB):if serving == "A":if random()
scoreA+= 1
else:
serving="B"
else:if random()
scoreB+= 1
else:
serving="A"
returnscoreA, scoreBdefprintSummary(winsA, winsB):
n= winsA +winsBprint("篮球比赛分析开始,共模拟{}场比赛".format(n))print("A队获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))print("B队获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))defmain():
printIntro()
probA, probB, n=getInputs()
winsA, winsB=simNGames(n, probA, probB)
printSummary(winsA, winsB)
main()
运行结果:
四、篮球晋级赛模拟
importrandomdef bsxx():#比赛信息输出
string1="模拟体育竞技分析 模拟人:xiayiLL"string2="模拟篮球竞技分析"string3="篮球比赛规则如下:"string4="篮球比赛由两个队参加,每队出场5名队员。每队目标是在对方球篮得分,并阻止对方队在本方球篮得分。"string5="比赛采用4节制,得分最多的队伍获胜。"string6="若比赛结束,比分仍然相同,则进入加时赛"string7="加时赛规则如下:"string8="加时赛分为5分钟一场,球权由跳球决定,在时限内比分高的一方获胜,若时限内还未分出胜负,则继续进行加时赛,球权由第一次加时赛未获球权方拥有,如此往返,直至分出胜负为止。"
print(string1)print()print(string2)print(string3)print(string4)print(string5)print(string6)print(string7)print(string8)print()def getinput():#获取数据
print("为了更好的模拟比赛数据,请输入两支队伍的运动员的能力值(0-1之间)")print("请输入第一支队伍的各位运动员能力值")
A1=eval(input("请输入第一位运动员的综合能力值:"))
A2=eval(input("请输入第二位运动员的综合能力值:"))
A3=eval(input("请输入第三位运动员的综合能力值:"))
A4=eval(input("请输入第四位运动员的综合能力值:"))
A5=eval(input("请输入第五位运动员的综合能力值:"))print("请输入第二支队伍的各位运动员能力值")
B1=eval(input("请输入第一位运动员的综合能力值:"))
B2=eval(input("请输入第二位运动员的综合能力值:"))
B3=eval(input("请输入第三位运动员的综合能力值:"))
B4=eval(input("请输入第四位运动员的综合能力值:"))
B5=eval(input("请输入第五位运动员的综合能力值:"))
n=eval(input("请输入模拟的次数:"))returnA1,A2,A3,A4,A5,B1,B2,B3,B4,B5,ndef onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5):#一节比赛的得分
scoreA,scoreB=0,0
list1=(2,3)for k in range(5):#设每个人在一节中能有5次投篮的机会
if random.random()<=A1:
scoreA+=random.choice(list1)#投中2分球或者3分球的几率是随机的
if random.random()<=A2:
scoreA+=random.choice(list1)if random.random()<=A3:
scoreA+=random.choice(list1)if random.random()<=A4:
scoreA+=random.choice(list1)if random.random()<=A5:
scoreA+=random.choice(list1)if random.random()<=B1:
scoreB+=random.choice(list1)if random.random()<=B2:
scoreB+=random.choice(list1)if random.random()<=B3:
scoreB+=random.choice(list1)if random.random()<=B4:
scoreB+=random.choice(list1)if random.random()<=B5:
scoreB+=random.choice(list1)returnscoreA,scoreBdef onegame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5):#一场比赛的总得分
sA1,sB1=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
sA2,sB2=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
sA3,sB3=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
sA4,sB4=onejie(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
scoreA=sA1+sA2+sA3+sA4
scoreB=sB1+sB2+sB3+sB4returnscoreA,scoreBdef allgame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n):#模拟所有场次比赛
teamA,teamB,p=0,0,0for i inrange(n):
scoreA,scoreB=onegame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)if scoreA>scoreB:
teamA+=1
elif scoreA
teamB+=1
else:
t1,t2=overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)
teamA+=t1
teamB+=t2returnteamA,teamBdef overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5):#设加时赛中,每人能投2次球
scoreA,scoreB,t1,t2,p1,p2=0,0,0,0,0,0
list1=(2,3)for k in range(2):if random.random()<=A1:
scoreA+=random.choice(list1)if random.random()<=A2:
scoreA+=random.choice(list1)if random.random()<=A3:
scoreA+=random.choice(list1)if random.random()<=A4:
scoreA+=random.choice(list1)if random.random()<=A5:
scoreA+=random.choice(list1)if random.random()<=B1:
scoreB+=random.choice(list1)if random.random()<=B2:
scoreB+=random.choice(list1)if random.random()<=B3:
scoreB+=random.choice(list1)if random.random()<=B4:
scoreB+=random.choice(list1)if random.random()<=B5:
scoreB+=random.choice(list1)if scoreA>scoreB:
t1+=1
elif scoreA
t2+=1
else:
t1,t2=overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5)returnt1,t2defalysis(n,teamA,teamB):print("模拟竞赛分析开始,共模拟{}场比赛".format(n))print("团队A获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100))print("团队B获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100))print("分析完毕")print()defalysis1(n,teamA,teamB):print("模拟竞赛分析开始,共模拟{}场比赛".format(n))print("团队C获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100))print("团队D获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100))print("分析完毕")print()defalysis2(n,teamA,teamB):print("模拟竞赛分析开始,共模拟{}场比赛".format(n))print("决赛队伍1获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100))print("决赛队伍2获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100))print("分析完毕")print()defmain():
x=1bsxx()while x==1:print("开始模拟请按1 结束程序请按2")
i=eval(input())if i==1:
x1=x2=x3=x4=0print("队伍A:队伍B")
A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n=getinput()
teamA,teamB=allgame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n)
alysis(n,teamA,teamB)print("队伍C:队伍D")
C1,C2,C3,C4,C5,D1,D2,D3,D4,D5,m=getinput()
teamC,teamD=allgame(C1,C2,C3,C4,C5,D1,D2,D3,D4,D5,m)
alysis1(m,teamC,teamD)if teamA>teamB:print("队伍A晋级")
m1,m2,m3,m4,m5=A1,A2,A3,A4,A5
x1=1
else:print("队伍B晋级")
m1,m2,m3,m4,m5=B1,B2,B3,B4,B5
x2=1
if teamC>teamD:print("队伍C晋级")
n1,n2,n3,n4,n5=C1,C2,C3,C4,C5
x3=1
else:print("队伍D晋级")
n1,n2,n3,n4,n5=D1,D2,D3,D4,D5
x4=1num1,num2=allgame(m1,m2,m3,m4,m5,n1,n2,n3,n4,n5,1000)
alysis2(1000,num1,num2)if num1>num2:if x1==1:print("队伍A取得胜利")elif x2==1:print("队伍B取得胜利")else:if x3==1:print("队伍C取得胜利")elif x4==1:print("队伍D取得胜利")print()elif i==2:break
else:print("输入错误,请重试")
main()