首页 > 其他 > 详细

比赛竞技模拟

时间:2020-04-21 19:38:00      阅读:57      评论:0      收藏:0      [点我收藏+]
import random
def printIntro():
    print("2019310143132")
    print("模拟乒乓球晋级赛")
    print("七局四胜制,一局共打11场")
    print("程序运行需要AB的能力值(以0到1之间的小数表示)")

def getInputs():
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手B的能力值(0-1): "))
    c = eval(input("请输入选手C的能力值(0-1): "))
    d = eval(input("请输入选手D的能力值(0-1): "))
    return a,b,c,d

def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random.random() < probA:
                scoreA += 1
            else:
                serving = "B"
        else:
            if random.random() < probB:
                scoreB += 1
            else:
                serving = "A"
    return scoreA, scoreB

def simNGames(probA, probB):
    winsA, winsB = 0, 0
    for i in range(7):              #胜11场
        scoreA, scoreB = simOneGame(probA, probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB

def gameOver(a, b):
    return a == 11 or b == 11
    
def oneround(probA, probB):
    roundA,roundB=0,0
    while not roundover(roundA,roundB):
        A,B=simNGames(probA, probB)
        if A>B:
            roundA+=1
        else:
            roundB+=1
        return roundA,roundB

def Nround(probA,probB):
    winsA, winsB = 0, 0
    for i in range(7):         
        scoreA, scoreB = oneround(probA,probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB
    
def roundover(a,b):
    return a == 4 or b == 4

def main():
    printIntro()
    probA,probB,probC,probD = getInputs()
    winA,winB=Nround(probA, probB)
    print("-------------------")
    print("第一轮比赛开始")
    print("选手A获胜{}回合".format(winA))
    print("选手B获胜{}回合".format(winB))
    if winA>winB:
        print("A胜利")
        E=A
    else:
        print("B胜利")
        E=B
    winC,winD=Nround(probC, probD)
    print("选手C获胜{}回合".format(winC))
    print("选手D获胜{}回合".format(winD))
    if winC>winD:
        print("C胜利")
        F=C
    else:
        print("D胜利")
        F=D
    print("---------------------")
    print("第二轮开始")
    winE=max(winA,winB)
    winF=max(winC,winD)
    winE,winF=Nround(probA, probB)
    print("选手{}获胜{}回合".format(E,winE))
    print("选手{}获胜{}回合".format(F,winF))
    if winE>winF:
        print("{}胜利,为冠军".format(E))
    else:
        print("{}胜利,为冠军".format(F))
main() 

技术分享图片

 

 

比赛模拟:

1)ABCD四人竞技,两两决斗出现冠军,其余忽略。

2)用random库模拟一场胜利条件。

3)胜利者产生-->N回合胜场-->单回合统计-->11场胜率统计-->单场胜利出现

 

反思:

1)借鉴其他大神思想,只是单纯把回合制的条件补齐

2)函数封装方面在个人设置的main函数做的不够好

3)个人实力有限,难以判断该代码是否真实判断(是否正确的选出冠军)

!!!如果大家有什么好建议务必与我分享>0<!!!

比赛竞技模拟

原文:https://www.cnblogs.com/lalalala-fan/p/12747168.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!