程序设计题--比赛模拟

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

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值