(1)采用排球比赛规则(学号尾号为4,5,6同学必做及格题)。
赛制规定:
前4局比赛采用25分制,每个队只有赢得至少25分,并同时超过对方2分时 ,才胜1局。
正式比赛采用5局3胜制,决胜局的比赛采用15分制,一队先得8分后,两队交换场区,按原位置顺序继续比赛到结束。
在决胜局(第五局)之比赛,先获15分并领先对方2分为胜。
#比赛模拟
import random
def print_intro(student_id_suffix):
print(f"学生学号后两位: {student_id_suffix}")
print("排球比赛模拟程序 - 本程序将模拟排球比赛过程,并计算两个球员(或球队)的获胜概率。")
def simulate_single_set(player1_ability, player2_ability):
score1, score2 = 0, 0
while True:
if random.random() < player1_ability / (player1_ability + player2_ability):
score1 += 1
else:
score2 += 1
if (score1 >= 25 and score1 - score2 >= 2) or (score2 >= 25 and score2 - score1 >= 2):
return max(score1, score2), min(score1, score2)
def simulate_match(player1_ability, player2_ability, matches):
wins_player1, wins_player2 = 0, 0
for _ in range(matches):
for _ in range(4):
score_winner, score_loser = simulate_single_set(player1_ability, player2_ability)
if score_winner == max(score_winner, score_loser):
wins_player1 += 1
else:
wins_player2 += 1
if wins_player1 == 2 or wins_player2 == 2:
break
else:
score_winner, score_loser = simulate_single_set(player1_ability, player2_ability)
if score_winner == max(score_winner, score_loser):
wins_player1 += 1
if wins_player1 == 3:
break
else:
wins_player2 += 1
if wins_player2 == 3:
break
return wins_player1, wins_player2
def main():
print_intro("04")
player1_ability = float(input("请输入球员1(或球队1)的能力值: "))
player2_ability = float(input("请输入球员2(或球队2)的能力值: "))
matches = int(input("请输入模拟比赛的次数: "))
wins_player1, wins_player2 = simulate_match(player1_ability, player2_ability, matches)
total_matches = wins_player1 + wins_player2
probability_player1 = wins_player1 / total_matches if total_matches > 0 else 0
probability_player2 = wins_player2 / total_matches if total_matches > 0 else 0
print(f"球员1(或球队1)获胜的次数: {wins_player1}")
print(f"球员2(或球队2)获胜的次数: {wins_player2}")
print(f"球员1(或球队1)的获胜概率: {probability_player1:.2%}")
print(f"球员2(或球队2)的获胜概率: {probability_player2:.2%}")
if __name__ == "__main__":
main()
(2)采用篮球或者足球规则模拟比赛,分析体育竞技规则,模拟比赛。(良好),基本要求同上。
#3.2 采用篮球或者足球规则模拟比赛,分析体育竞技规则,模拟比赛。
from math import fabs
from random import random
def printIntro():
print("模拟篮球比赛的代码分析")
print("这个程序模拟两支队伍A和B的篮球比赛")
print("学号后两位04")
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 gameOver(a,b):
return a>b or b>a
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving="B"
else:
if random() < probB:
scoreB += 1
else:
serving="A"
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()
(3)采用乒乓球、羽毛球、篮球、足球等规则中的一种。同时采用循环赛或者晋级赛形式,模拟分析4个队及以上体育竞技,并输出排名。建议可以采用面向对象方法或者改动上面程序。
#3.3 采用乒乓球、羽毛球、篮球、足球等规则中的一种。同时采用循环赛或者晋级赛形式,模拟分析4个队及以上体育竞技,并输出排名
from math import fabs
from random import random
def printIntro():
print("模拟羽毛球比赛的代码分析")
print("这个程序模拟两个选手A和B的羽毛球比赛")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
print("学号后两位04")
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 gameOver(a,b):
if (a==20 and b==20):
return a==22 or b==22
if(a==29 and b==29):
return a==30 or b==30
else:
return a==21 or b==21
def simOneGame(probA, probB):
scoreA, scoreB = 0, 0
serving = "A"
while not gameOver(scoreA, scoreB):
if serving == "A":
if random() < probA:
scoreA += 1
else:
serving="B"
else:
if random() < probB:
scoreB += 1
else:
serving="A"
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()