python-体育(羽毛球)竞技模拟
作者:互联网
体育竞技分析
一、程序总体框架及步骤:
步骤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) | 定义一局比赛的结束条件 |
具体函数代码:
顶层设计:
def main(): printIntro() probA , probB , n = getInputs() winsA , winsB = simNGames(n, probA, probB) printSummary(winsA, winsB)
步骤一:printIntro()函数
def printInfo(): print("这个程序模拟两个选手A和B的体育竞技比赛") print("程序需要两个选手的能力值0-1") print("规则:") print("作者: 学号:")
步骤二:getInputs()函数
def getInput(): a = eval(input("请输入选手A的能力值(0-1):")) b = eval(input("请输入选手B的能力值(0-1):")) m=eval(input("比赛的局数:")) n = eval(input("模拟比赛的场次:")) return a,b,m,n
步骤三:simNGames()函数
def main(): printIntro() probA,probB,n=getInputs() winA,winB=simNGames(n,probA,probB) printSummary(winsA,winsB)
步骤四:printSummary()函数
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))
三、羽毛球竞技程序设计实例:
比赛规则·
1. 21 分制,3局2胜为佳
2. 每球得分制
3. 每回合中,取胜的一方加 1 分
4. 当双方均为 20 分时,领先对方 2 分的一方赢得该局比赛
5. 当双方均为 29 分时,先取得 30 分的一方赢得该局比赛
6. 一局比赛的获胜方在下一局率先发球
#体育竞技
from random import random
def main(): printInfo() probA,probB,m,n = getInput() winsA,winsB = simNGames(m,n,probA,probB) printSummary(winsA,winsB) main()
def printInfo(): print("这个程序模拟两个选手A和B的羽毛球竞技比赛") print("程序需要两个选手的能力值0-1") print("规则:三局两胜--21分制") print("作者:阮满欢 学号:470.67") def getInput(): a = eval(input("请输入选手A的能力值(0-1):")) b = eval(input("请输入选手B的能力值(0-1):")) m=eval(input("比赛的局数:")) n = eval(input("模拟比赛的场次:")) return a,b,m,n 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 simNGames(m,n,probA,probB): winsA,winsB = 0,0 wa,wb=0,0 for i in range(n): for i in range(m): scoreA,scoreB = simOneGame(probA,probB) if scoreA > scoreB: wa += 1 else: wb += 1 if wa==2: winsA+=1 wa,wb=0,0 break if wb==2: winsB+=1 wa,wb=0,0 break return winsA,winsB def simOneGame(probA,probB): scoreA,scoreB = 0,0 serving = "A" while not gameOver(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 gameOver(a,b): if(a>=20 or b>=20): if(abs(a-b)==2 and a<=29 and b<=29): return True else: return a==30 or b==30 else: return False
运行结果:
三、程序打包
使用pyinstaller打包,把Python脚本打包成可执行的文件。即把.py文件打包成.exe文件,则可以直接运行结果。
1.首先要安装pyinstaller库
在cmd中输入下面一句代码:
pip install pyinstaller
2.使用pyinstaller时;在上述代码的main函数的最后加上 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 import fabs from random import random def printIntro(): ''' function: 打印程序的介绍信息 ''' print("模拟篮球比赛的代码分析") print("这个程序模拟两支队伍A和B的篮球比赛") print("程序运行需要A和B的能力值(以0到1之间的小数表示)") print("作者:阮满欢 47") 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): winsA, winsB = 0, 0 for i in range(n): scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB def gameOver(a,b): return a>b or b>a def simOneGame(probA, probB): scoreA, scoreB = 0, 0 serving = "A" while not gameOver(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()
运行结果:
四、篮球晋级赛模拟
import random def 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("请输入模拟的次数:")) return A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n def 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) return scoreA,scoreB def 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+sB4 return scoreA,scoreB def allgame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5,n):#模拟所有场次比赛 teamA,teamB,p=0,0,0 for i in range(n): scoreA,scoreB=onegame(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5) if scoreA>scoreB: teamA+=1 elif scoreA<scoreB: teamB+=1 else: t1,t2=overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5) teamA+=t1 teamB+=t2 return teamA,teamB def 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<scoreB: t2+=1 else: t1,t2=overtime(A1,A2,A3,A4,A5,B1,B2,B3,B4,B5) return t1,t2 def alysis(n,teamA,teamB): print("模拟竞赛分析开始,共模拟{}场比赛".format(n)) print("团队A获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100)) print("团队B获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100)) print("分析完毕") print() def alysis1(n,teamA,teamB): print("模拟竞赛分析开始,共模拟{}场比赛".format(n)) print("团队C获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100)) print("团队D获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100)) print("分析完毕") print() def alysis2(n,teamA,teamB): print("模拟竞赛分析开始,共模拟{}场比赛".format(n)) print("决赛队伍1获得{}场胜利,共占比{:.2f}%".format(teamA,teamA/n*100)) print("决赛队伍2获得{}场胜利,共占比{:.2f}%".format(teamB,teamB/n*100)) print("分析完毕") print() def main(): x=1 bsxx() while x==1: print("开始模拟请按1 结束程序请按2") i=eval(input()) if i==1: x1=x2=x3=x4=0 print("队伍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=1 num1,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()
标签:winsB,winsA,羽毛球,python,print,eval,竞技,input,def 来源: https://www.cnblogs.com/ruanmh/p/12749085.html