181122 Python学习日记——体育竞技模拟(IPO模式)

上次也写了一个关于顶层设计的体育竞技模拟的程序,但是学习后感觉还是不对,所以重新编辑了一下,再理一理思路。
首先有一个主程序main()
往下依次把问题分解为:
1.打印基本信息(介绍规则,所需信息等等)
2.获取必要参数(回合/场次,双方对手的能力值)
3.计算要求场次下A,B的胜率,场次
4.输出结果介绍
———————————————分割线——————————————————
定义顶层函数

def main():    #顶层设计
    printIntro()
    probA,probB,n = getInput()
    winsA,winsB = simNGame(n,probA,probB)
    printOutput(winsA,winsB)

可以看到main()下有四个函数:
第一个是printIntro()

printIntro()    #输出基本信息

具体如下:

def printIntro():
    print('该程序模拟两名队员的比赛')
    print('有A,B两名球员')
    print('各自的能力值用(0,1)之间的数字表示')

第二个是getInput():

def getInput():
    probA = eval(input('请输入A球员的能力值:'))
    probB = eval(input('请输入B球员的能力值:'))
    n = eval(input('请输入模拟的场次:'))
    return probA,probB,n

返回三个值:A的能力值,B的能力值,模拟的场次
得到基本参数后就可以进行n回合的计算
由于n个回合可以看作是一个回合的n次循环运行,所以要定义一个1次循环的记分模式:simNGame(n,probA,probB):

def simNGame(n,probA,probB):
    winsA = 0;winsB = 0;i = 0
    while i < n:
        scoreA , scoreB = simOneGame(probA,probB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
        i += 1
    return winsA,winsB

scoreA和scoreB的值由一次回合的得分决定
一次回合的代码如下:

def simOneGame(probA,probB):
    import random
    scoreA = 0
    scoreB = 0
    serving = 'A'
    while scoreA != 15 and scoreB != 15:
        if serving == 'A':
            if random.random() < probA:
                scoreA += 1
            else:
                scoreB += 1
                serving = 'B'
        else:
            if random.random() < probB:
                scoreB += 1
            else:
                scoreA += 1
                serving == 'A'
    return scoreA,scoreB

这样基本工作就已经完成了,来到最后一个函数printOutput(winsA,winsB):

def printOutput(winsA,winsB):
    total = winsA+winsB
    print('模拟的总场次为:',total)
    print('A选手的获胜场次为{},胜率为{}'.format(winsA,winsA/total))
    print('B选手的获胜场次为{},胜率为{}'.format(winsB,winsB/total))

这样就完成啦,调用结果

main()

就好啦
这是一道非常经典的面向过程的题目。
但现代编程中,面向对象更符合一般认识世界描述世界的方式,所以面向对象已成主流编程方式,面向过程仅在处理具体,规则明确,程序具体的事件模拟时有所使用,其余基本被面向对象取代。
所以最近我也在加紧学习面向对象编程,使用类,实例等方式定义一个对象。

你可能感兴趣的:(181122 Python学习日记——体育竞技模拟(IPO模式))