其他分享
首页 > 其他分享> > 模拟体育竞赛

模拟体育竞赛

作者:互联网

from random import *

#定义一个Info类,功能是打印介绍性信息,并且获得用户输入的两队伍能力值,模拟场次
class Info:
    def __init__(self):
        print('这个程序是模拟两支队伍A和B的排球比赛')
        print('程序运行需要A和B的能力值(以0到1之间的小数表示)')
    def GetInput(self):
        A = eval(input('请输入队伍A的能力值(0-1):'))
        B = eval(input('请输入队伍B的能力值(0-1):'))
        N = eval(input('模拟比赛场次:'))
        return A, B, N

#定义了一个OneGame类,功能是用来完成一场5局3胜制的比赛
class OneGame:
    def simOneGame(self, probA, probB):
        A_win, B_win, count = 0, 0, 1
        while not (A_win == 3 or B_win == 3):
            serving = choice(['A', 'B'])                   #这里我选择的是随机开球方
            scoreA, scoreB = 0, 0
            while not OneGame.Gameover(count, scoreA, scoreB):
                if serving == 'A':
                    if random() < probA:
                        scoreA += 1
                    else:
                        serving = 'B'
                else:
                    if random() < probB:
                        scoreB += 1
                    else:
                        serving = 'A'
            if scoreA > scoreB :
                A_win += 1
            else:
                B_win += 1
            if count == 5:
                count = 1
            count += 1
        return A_win, B_win

    @classmethod
    def Gameover(self, count, scoreA, scoreB):               #这个函数是用来判断比赛是否结束
        if count < 5:
            return (scoreA >= 25 or scoreB >= 25) and abs(scoreA - scoreB) >= 2
        else:
            return (scoreA >= 15 or scoreB >= 15) and abs(scoreA - scoreB) >= 2

#定义了一个NGame类,继承了OneGame的属性和方法,功能是完成N场5局3胜制比赛
class NGame(OneGame):
    def simNGames(self, n, A, B):
        winsA, winsB = 0, 0
        for i in range(n):
            win_numA, win_numB = self.simOneGame(A, B)
            if win_numA > win_numB:
                winsA += 1
            else:
                winsB += 1
        return winsA, winsB

#定义了一个PrintSummary类,功能是打印比赛结果
class PrintSummary:
    def __init__(self, N, winA, winB):
        print('竞技分析开始,共模拟{}场比赛'.format(N))
        print('队伍A获胜{}场比赛,占比{:.2f}%'.format(winA, winA/N * 100))
        print('队伍B获胜{}场比赛,占比{:.2f}%'.format(winB, winB/N * 100))

def main():
    match_info = Info()                         #创建一个Info对象
    A, B, N = match_info.GetInput()             #使用Info类的GetInput方法获得能力值和场次
    match = NGame()                             #创建一个NGame对象
    A_win, B_win = match.simNGames(N, A, B)     #获得A, B两队获胜的比赛场数
    PrintSummary(N, A_win, B_win)               #打印比赛结果
    input("please input any key to exit!")

main()

  

标签:count,体育竞赛,scoreA,scoreB,win,self,def,模拟
来源: https://www.cnblogs.com/hshjdkdmdklflcll/p/14021750.html