模擬體育競技

  1. 排球訓練

爲了使用方即可以安裝pyinstaller來方便本身使用dom

在cmd下輸入函數

pip install pyinstaller

就能夠自動安裝spa

目的:模仿不一樣的兩個隊伍進行模擬比賽設計

原理:經過輸入各自的能力值(Ⅰ),模擬比賽的進行( P ),最後輸出模擬的結果( O )code

P 簡介:經過產生隨機數獲得每局比賽的難度,若小於能力值則表示贏得本局比賽,反之輸掉本局比賽。orm

規則:① 每場比賽採用 5局3勝制。blog

② 前四局採用25分制,每一個隊只有在贏得至少25分,且同時超過對方2分時才勝一局。ip

③ 決勝局(第五局)採用15分制,先得到15分,且同時超過對方2分爲勝。utf-8

 

# -*- coding: utf-8 -*-
"""
Created on Sun May 12 23:15:03 2019

@author:zyp26
"""

import random
import os
def printInfo():
    print("zyp的這個程序模擬兩個選手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)

 

 

 結果get

 

 

 

 

  1. 籃球訓練

與排球類似的設計

此代碼與上述主要不一樣之處在於: GameOver(),其餘函數都相似

 

# -*- coding: utf-8 -*-
"""
Created on Thu May 16 19:45:17 2019

@author: zyp26
"""

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()

結果

相關文章
相關標籤/搜索