体育竞技分析

时间:2021-10-24 23:36:12

一、体育竞技分析

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()
体育竞技分析

结果如下:

体育竞技分析