预测羽毛球队比赛成绩

前提引入

  计算思维是运用计算机科学的基础概念进行问题求解、系统设计、以及人类行为理解等涵盖计算机科学之广度的一系列思维活动,由周以真于2006年3月首次提出。

  模拟是用来解决现实世界问题的重要手段和技术。计算机可以通过模拟现实世界的运行过程提供一般情况下无法获得的信息。下面我们就来实战一下,用自顶向下的设计方法编写出预测羽毛球队比赛成绩的程序。

  使用计算机模拟解决问题的实例包括:天气预测、飞机设计、电影特效、核试验甚至军事对抗等。如果不采用计算机模拟,这些应用则需要极其复杂的实施过程,往往代价巨大。即使很简单的模拟也可以揭示一些困难问题的本质规律。

  自顶向下的设计方法将复杂的大问题分解为相对简单的小问题,找出每个问题的关键、重点所在,然后用精确的思维定性、定量地去描述问题。其核心本质是"分解"。

  

python学校举办校园歌手大赛 python歌星大赛评分_main函数

 

 

任务要求

  编写程序,模拟体育竞技分析

  C.羽毛球比赛规则

>21分制,3局2胜为佳

>每球得分制

>每回合中,取胜的一方加1分

>当双方均为20分时,领先对方2分的一方赢得该局比赛

>当双方均为29分时,先取得30分的一方赢得该局比赛

>一局比赛的获胜方在下一局率先发球

让我们来看看程序的执行效果

 

python学校举办校园歌手大赛 python歌星大赛评分_计算机科学_02

 

python学校举办校园歌手大赛 python歌星大赛评分_main函数_03

那么,下面我们就来实战一下,用自顶向下的设计方法编写出预测羽毛球队比赛成绩的程序

步骤一:顶层设计,我们先来设计main函数

 



from random import *
#顶层设计
def main():
    printIntroduce()#打印程序的介绍信息
    probabilityA,probabilityB,n=getInputs()#通过getsInputs函数来获取2个球员的能力值和比赛次数
    winsA,winsB=simulateNGames(n,probabilityA,probabilityB)#通过simulateNGames()求得2个球员在n次比赛中获胜的次数
    printSummary(winsA,winsB)#通过printSummary()来输出比赛的结果信息



 

步骤二:把main函数中的子函数逐一攻破

 



#第二阶段
def printIntroduce():
    print('这个程序模拟两个选手A和B的羽毛球竞技比赛')
    print('程序运行需要A和B的能力值')
    
def getInputs():
    a=eval(input('请输入选手A的能力值(0~1):'))
    b=eval(input('请输入选手B的能力值(0~1):'))
    n=eval(input('比赛胜利达到多少局获胜:'))
    return a,b,n

def simulateNGames(n,probabilityA,probabilityB):
    '''定义球员A,B赢得比赛的次数,初始值为0,
        通过for循环来模拟n次比赛
        用simulateOneGame()来模拟一场比赛'''
    winsA,winsB=0,0
    while not judge(n,winsA,winsB):
        '''返回本场比赛2个球员的得分,根据得分来确定本场比赛的胜负'''
        scoreA,scoreB=simulateOneGame(probabilityA,probabilityB)
        if scoreA>scoreB:
            winsA+=1
        else:
            winsB+=1
    return winsA,winsB

def printSummary(winsA,winsB):
    n=winsA+winsB
    print('\n比赛开始,共模拟%d场比赛'%n)
    print('选手A获胜{}场比赛,占比{:0.1%}'.format(winsA,winsA/n))
    print('选手B获胜{}场比赛,占比{:0.1%}'.format(winsB,winsB/n))



第三阶段



#第三阶段
def simulateOneGame(probabilityA,probabilityB):
    '''每场比赛,2个球员的得分初始为0,设定每场比赛总是A先发球,
        用random函数生成一个随机小数,范围在【0,1)内'''
    scoreA,scoreB=0,0
    starting='A'
    while not gameOver(scoreA,scoreB):
        if starting=='A':
            if random()<probabilityA:
                scoreA+=1
            else:
                scoreB+=1
                starting='B'
        else:
            if random()<probabilityB:
                
                scoreB+=1
            else:
                scoreB+=1
                starting='A'
    return scoreA,scoreB

def gameOver(a,b):
    '''任意一方达到20分就结束比赛'''
    if a>29 or b>29:
        return True
    elif a>20 or b>20:
        if abs(a-b)>1:
            return True
        else:
            return False
    
def judge(n,winsA,winsB):
    if winsA==n or winsB==n:
        return True
    else:
        return False

main()



心得:

每层设计中,参数和返回值如何设计是重点,其他细节部分可以暂时忽略。确定事件的重要特征而忽略其它细节过程称为抽象

自顶向下设计的第二阶段是实现或进一步抽象第2 层函数

python学校举办校园歌手大赛 python歌星大赛评分_计算机科学_04

 

 

 

 下面我们使用pyinstaller库来打包我们刚刚写的程序

使用cmd安装pyinstaller库,效果如下:

python学校举办校园歌手大赛 python歌星大赛评分_python_05

接下来我们为了方便,把源文件放到daydayup12138的文件夹:

python学校举办校园歌手大赛 python歌星大赛评分_自顶向下_06

 

然后cmd执行 pyinstaller C:\daydayup12138\temp003.py即可

python学校举办校园歌手大赛 python歌星大赛评分_python学校举办校园歌手大赛_07

然后,我们就可以顺藤摸瓜,找到我们打包后的应用程序文件

python学校举办校园歌手大赛 python歌星大赛评分_main函数_08