一、体育竞技分析
1. 简介: 模拟不同的两个队伍进行排球的模拟比赛。
2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ),最后输出模拟的结果( O )。
P 简介:通过产生随机数得到每局比赛的难度,若小于能力值则表示赢得本局比赛,反之输掉本局比赛。
3. 规则简介:
① 每场比赛采用 5局3胜制。
② 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局。
③ 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜。
4. 准备就绪,就差代码来实现了
插入代码之前,先对代码做个简单的介绍:
| printInfo() | 打印程序的介绍信息 |
| getInputs() | 获得用户输入的参数 |
| simNGames(n, probA, probB) | 模拟n场比赛 |
| simOneGame(probA, probB) | 模拟一场比赛,包括五局,采取五局三胜制 |
| simAGame(N, probA, probB) | 模拟一局比赛 |
| GameOver(N, scoreA, scoreB) | 定义一局比赛的结束条件 |
| printResult(n, winsA, winsB) | 输出模拟比赛的结果 |
行了。直接上代码
# -*- coding: utf-8 -*-
"""
Created on Sun May 12 23:15:03 2019
@author: guo'yu'yi
"""
import random
import os
def printInfo():
print("gyy的这个程序模拟两个选手A和B的某种竞技比赛 : ")
print("需要A和B的能力值(以0到1之间的小数表示):")
def getInputs():
proA=eval(input("请输入选手A的能力值(0-1):"))
proB=eval(input("请输入选手B的能力值(0-1):"))
n=eval(input("模拟比赛的场次:"))
return proA,proB,n
def simNGames(proA, proB, n):
countA,countB=0,0
for i in range(n):
if SimOneGame(proA, proB)==1:
countA+=1
else:
countB+=1
return countA, countB
def SimOneGame(proA, proB):
temp=0.5
while temp==0.5:
temp=random.random()
if temp<0.5:
serve="A"
else:
serve="B"
setA,setB=0,0
while not gameOver(setA,setB):
scoreA,scoreB=0, 0
while not setOver(scoreA, scoreB,setA+setB+1):
if serve=="A":
if random.random()<proA:
scoreA+=1
else:
scoreB+=1
serve="B"
else:
if random.random()<proB:
scoreB+=1
else:
scoreA+=1
serve="A"
if scoreA>scoreB:
setA+=1
else:
setB+=1
return (1 if (setA > setB) else 0)
def setOver(scoreA, scoreB,sets):
if sets==5:
if scoreA>=15 or scoreB>=15:
if(abs(scoreA-scoreB)>=2):
return True
else:
return False
else:
return False
else:
if scoreA>=25 or scoreB>=25:
if(abs(scoreA-scoreB)>=2):
return True
else:
return False
else:
return False
def gameOver(setA,setB):
if setA==3 or setB==3:
return True
else:
return False
def printSummary(countA, countB):
print("选手A获胜{0}场比赛,占比{1:.2f}%".format(countA, countA/(countA + countB)*100))
print("选手B获胜{0}场比赛,占比{1:.2f}%".format(countB, countB/(countA + countB)*100))
if __name__ == "__main__":
printInfo()
proA, proB, n = getInputs()
print("竞技分析开始,共模拟{}场比赛".format(n))
countA, countB = simNGames(proA, proB, n)
printSummary(countA, countB)
结果如下:

二、排球比赛
1,比赛规则
比赛采用每球得分制,前4局以先得25分,并同时超出对方2分的队获胜。
决胜局以先得15分,并同时超出对方2分的队获胜。正式比赛采用五局三胜制。
2、实现排球比赛规则的简单程序
from random import random
def printIntro():
print("36号程序员的程序模拟两个选手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):
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 gameOver1(a,b):
return (a>=25 and a-b>2) or (b>=25 and b-a>2)
def gameOver2(a,b):
return (a>=15 and a-b>2) or (b>=15 and b-a>2)
def simOneGame(probA,probB):
for i in range (5):
winsA,winsB=0,0
scoreA,scoreB=0,0
serving="A"
while not gameOver1(scoreA,scoreB):
if serving=="A":
if random()<probA:
scoreA+=1
else:
scoreB+=1
serving="B"
else:
if random()<probB:
scoreB+=1
else:
serving="A"
scoreA+=1
if scoreA>scoreB:
winsA+=1
else:
winsB+=1
if winsA==3 or winsB==3:
break
if winsA==2 and winsB==2:
simtowGame(probA,probB)
return winsA,winsB
def simtowGame(probA,probB):
for i in range (1):
scoreA,scoreB=0,0
serving="A"
while not gameOver2(scoreA,scoreB):
if serving=="A":
if random()<probA:
scoreA+=1
else:
scoreB+=1
serving="B"
else:
if random()<probB:
scoreB+=1
else:
serving="A"
scoreA+=1
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()
•效果图

• 打包后的exe文件

三,下面是篮球比赛的模拟,这段代码和书上的类似
# -*- coding: utf-8 -*-
"""
Created on Tue May 14 19:45:17 2019
@author: guo'yu'yi
"""
from random import *
def printIntro():
print("这个程序模拟两个队伍A和B的篮球比赛")
print("这个程序需要A和B的能力值(0-1)")
def getInputs():
a=eval(input('A的能力值为:'))
b=eval(input("B的能力值为:"))
n=eval(input("比赛的场次为:"))
return a,b,n
def gameover(i,k):
if i>k:
return True
return False
def one(a,b):
scorea,scoreb=0,0
x='A'
i=1
k=randint(10,40)
while not gameover(i,k):
if x=='A':
if random()<a:
scorea+=2
else:
x='B'
else:
if random()<b:
scoreb+=2
else:
x='A'
i+=1
return scorea,scoreb
def ones(probA,probB):
wa,wb=0,0
for j in range(4):
xa,xb=one(probA,probB)
wa+=xa
wb+=xb
while wa==wb:
xa,xb=jiashisai(probA,probB)
wa+=xa
wb+=xb
return wa,wb
def jiashisai(a,b):
scorea,scoreb=0,0
i=1
x='A'
while not gameover(i,randint(1,5)):
if x=='A':
if random()<a:
scorea+=2
else:
x='B'
else:
if random()<b:
scoreb+=2
else:
x='A'
i+=1
return scorea,scoreb
def simNGames(n,probA,probB):
a,b=0,0
for i in range(n):
x,y=ones(probA,probB)
if x>y:
a+=1
else:
b+=1
return a,b
def printSummary(a,b,n):
print("A赢了{}场 B赢了{}场 共{}".format(a,b,n))
print("A赢的概率为{:0.1%} B赢的概率为{:0.1%}".format(a/n,b/n))
def main():
printIntro()
probA,probB,n=getInputs()
winsA,winsB=simNGames(n,probA,probB)
printSummary(winsA,winsB,n)
main()
结果如下:

