排球比赛规则

题目:赛制规定:

前四局比赛采用25分制,每个队只有赢得至少25分,并同时超过对方3分时,才胜一局。

正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按原位置顺序比赛到结束。

在决胜局(第五局)之比赛,先获15分并领先对方2分为胜。

 

该问题的IPO描述如下:
输入:两个球员(球员A和球员B)的能力概率,模拟比赛的场次

处理:模拟比赛过程

输出:球员A和B分别赢得球赛的概率

 

程序如下:

# -*- encoding:utf-8 -*-

'''

模拟排球竞技

@author: bpf

'''

# 比赛规则:

# 1. 采用5局3胜制

# 2. 前四局采用25分制,每个队只有在赢得至少25分,且同时超过对方2分时才胜一局

# 3. 决胜局(第五局)采用15分制,先获得15分,且同时超过对方2分为胜

 

from random import random

def printInfo():

'''

打印程序的功能信息

'''

print(" 这个程序模拟2个队伍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 NGames(n, probA, probB):

'''

模拟n场比赛

'''

winA, winB = 0, 0

for _ in range(n):

scoreA, scoreB = OneGame(probA, probB)

if scoreA > scoreB:

winA += 1

else:

winB += 1

return winA, winB

 

def OneGame(probA, probB):

'''

模拟一场比赛,包括五局

'''

scoreA, scoreB, N = 0, 0, 0

serving = 'A'

while not GameOver(N, scoreA, scoreB):

if serving == 'A':

if random() > probA:

scoreB += 1

serving = 'B'

else:

scoreA += 1

if serving == 'B':

if random() > probB:

scoreA += 1

serving = 'A'

else:

scoreB += 1

N += 1

return scoreA, scoreB

 

def GameOver(N, a, b):

'''

定义赢得一局的条件

N: 当前局次(第五局为决胜局)

'''

if N <= 4:

return (a>=25 and b>=25 and abs(a-b)>=2)

else:

return (a>=15 and b>=15 and abs(a-b)>=2)

 

def printResult(n, winA, winB):

print("竞技分析开始,共模拟{}场比赛".format(n))

print("队伍A获胜{}场比赛,占比{:0.1%}".format(winA,winA/n))

print("队伍B获胜{}场比赛,占比{:0.1%}".format(winB,winB/n))

 

if __name__ == "__main__":

printInfo()

probA, probB, n = getInputs()

winA, winB = NGames(n, probA, probB)

printResult(n, winA, winB)

 

输出结果:

这个程序模拟两个选手A和B的某种竞技比赛

程序运行需要A和B的能力值(以0到1之间的小数表示)

 

请输入选手A的能力值:0.45

 

请输入选手B的能力值:0.6

 

模拟比赛的场次:4

竞技分析开始,共模拟5场比赛

选手A获胜1场比赛,占比20.0%

选手B获胜4场比赛,占比80.0%

原文地址:https://www.cnblogs.com/panqiaoyan/p/10855113.html