zoukankan      html  css  js  c++  java
  • 比赛竞技模拟

    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
  • 相关阅读:
    Java 的 多态和构造方法
    java 的 抽象类、接口
    java 的 封装 、继承
    eclipse的安装和基本使用、面向对象、类和对象
    方法的重载、引用数据类型、 ArrayList集合
    SQL单行函数
    JAVA
    mysql约束
    MYSQL的常用属性
    mysql的索引
  • 原文地址:https://www.cnblogs.com/lalalala-fan/p/12747168.html
Copyright © 2011-2022 走看看