比赛竞技模拟

import random
def printIntro():
    print("2019310143132")
    print("模拟乒乓球晋级赛")
    print("七局四胜制,一局共打11场")
    print("程序运行需要ABCD的能力值(以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):          
        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("第二轮开始")        #20200422记:以下为错误
    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)个人实力有限,难以判断该代码是否真实判断(是否正确的选出冠军)

4)   当一场比赛得分10平时我没有想到如何表述

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

202004221600 更:

import random
def printIntro():
    print("2019310143132")
    print("模拟乒乓球晋级赛")
    print("七局四胜制,一局共打11场")
    print("程序运行需要ABCD的能力值(以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()
    probE,probF=0,0
    winA,winB=Nround(probA, probB)
    winC,winD=Nround(probC, probD)
    print("-------------------")
    print("第一轮比赛开始")
    print("选手A获胜{}回合".format(winA))
    print("选手B获胜{}回合".format(winB))
    if winA>winB:
        print("A胜利")
        E='A'
        probE=probA
    else:
        print("B胜利")
        E='B'
        probE=probB
    print("选手C获胜{}回合".format(winC))
    print("选手D获胜{}回合".format(winD))
    if winC>winD:
        print("C胜利")
        F='C'
        probF=probC
    else:
        print("D胜利")
        F='D'
        probF=probD
    print("---------------------")
    print("第二轮开始")
    winE,winF=Nround(probE, probF)
    print("选手{}获胜{}回合".format(E,winE))
    print("选手{}获胜{}回合".format(F,winF))
    if winE>winF:
        print("{}胜利,为冠军".format(E))
    else:
        print("{}胜利,为冠军".format(F))
main()

受到登顶神“贾翊来编程”的反馈,发现自己错了一个地方。

在第一个代码中,我本人想法是通过E这个人来继承AB的胜者,F继承CD的胜者。然后再EF同台竞技。

显然在继承能力以及席位的过程中,发现有一些纰漏。(EF的胜场数为是AB对决得到)

在此感谢登顶神

附加内容:

运用pyinstaller打包可以执行的文件。

 pyinstaller 是一个十分有用的第三方库,它能够在Windows、Linux、等操作系统下将python 原文件打包,因为python脚本如果在没有安装python的电脑上,其代码不能运行,所以要将脚本打包成exe文件,使降低脚本对环境的依赖性,同时运行会更加迅速。

安装方法:在电脑的控制台上用pip工具安装,代码如下:

:>pip install pyinstaller

:>pip3 install pyinstaller


再或者可以通过 pyinstaller的官网进行下载。

利用 pyinstaller进行文件打包,该文件名为wenjian.py.打包输入代码为:

:>pip pyinstaller -F D:codeswenjian.py
原文地址:https://www.cnblogs.com/lalalala-fan/p/12747168.html