模拟体育竞技分析

学习目标

    了解计算思维的概念
    掌握自顶向下的设计方法
    掌握自底向上的执行过程
    了解计算机生态和模块编程思想
    掌握Python第三方库的安装方法
    掌握Python源文件的打包方法

一、体育竞技分析实例:

1.设规则如下:

    21分制,三局两胜为佳
    每球得分制
    每回合中取胜的一方的一分
    双方均为20分时,领先对方2分一方获胜
    双方均为29分时,先到达30分一方获胜
    一局比赛中获胜方在下一局率先开球

2.Python 3.x 代码(自顶向下的设计方法)如下
from random import random

print("学号尾数08")

def printIntro():

    print("这个程序模拟两个选手A和B的羽毛球竞技比赛")
    print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
def getInputs():
    a = eval(input("请输入选手A的能力值(0-1): "))
    b = eval(input("请输入选手B的能力值(0-1): "))
    n = eval(input("模拟比赛的场次: "))
    m = eval(input("模拟次数:"))
    return a, b, n, m
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    scoreA_ls=[]
    scoreB_ls=[]
    for i in range(n):
        scoreA, scoreB = simOneGame(probA, probB)
        scoreA_ls.append(scoreA)
        scoreB_ls.append(scoreB)
        if scoreA > scoreB:
            winsA += 1
        else:
            winsB += 1
    return winsA, winsB,scoreA_ls,scoreB_ls
def gameOver(a,b):
    if(a>=20 or b>=20):
        if(abs(a-b)==2 and a<=29 and b<=29):
            return True
        else:
            return a==30 or b==30
    else:
        return False
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0
    serving = "A"
    while not gameOver(scoreA, scoreB):
        if serving == "A":
            if random() < probA:
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB
def printSummary(winsA, winsB,m,scoreA_ls,scoreB_ls):
    n = winsA + winsB
    print("模型模拟次数{}".format(m))
    print("竞技分析开始,共模拟{}场比赛".format(n))
    print("A选手各场次得分比分:")
    print(scoreA_ls)
    print("B选手各场次得分比分:")
    print(scoreB_ls)
    print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
    print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
def main():
    printIntro()
    probA, probB, n, m= getInputs()
    for i in range(m):
        winsA, winsB,scoreA_ls,scoreB_ls = simNGames(n, probA, probB)
        printSummary(winsA, winsB,m,scoreA_ls,scoreB_ls)

main()

3.运行输入及结果:

学号尾数08
这个程序模拟两个选手A和B的羽毛球竞技比赛
程序运行需要A和B的能力值(以0到1之间的小数表示)

请输入选手A的能力值(0-1): 0.5

请输入选手B的能力值(0-1): 0.5

模拟比赛的场次: 5

模拟次数:5
模型模拟次数5
竞技分析开始,共模拟5场比赛
A选手各场次得分比分:
[30, 24, 19, 30, 21]
B选手各场次得分比分:
[17, 30, 21, 16, 19]
选手A获胜3场比赛,占比60.0%
选手B获胜2场比赛,占比40.0%
模型模拟次数5
竞技分析开始,共模拟5场比赛
A选手各场次得分比分:
[27, 26, 21, 30, 20]
B选手各场次得分比分:
[25, 28, 19, 20, 22]
选手A获胜3场比赛,占比60.0%
选手B获胜2场比赛,占比40.0%
模型模拟次数5
竞技分析开始,共模拟5场比赛
A选手各场次得分比分:
[18, 20, 21, 30, 20]
B选手各场次得分比分:
[20, 18, 19, 19, 18]
选手A获胜4场比赛,占比80.0%
选手B获胜1场比赛,占比20.0%
模型模拟次数5
竞技分析开始,共模拟5场比赛
A选手各场次得分比分:
[30, 23, 20, 20, 18]
B选手各场次得分比分:
[16, 21, 18, 30, 20]
选手A获胜3场比赛,占比60.0%
选手B获胜2场比赛,占比40.0%
模型模拟次数5
竞技分析开始,共模拟5场比赛
A选手各场次得分比分:
[18, 18, 30, 19, 30]
B选手各场次得分比分:
[30, 20, 21, 21, 17]
选手A获胜2场比赛,占比40.0%
选手B获胜3场比赛,占比60.0%
二、使用pyinstaller对上述代码文件打包成可执行文件(可在没有安装Python的环境中运行)

方法如下:

    安装pyinstaller:在命令行(控制台)下用pip安装,如

    C:\Users\Benny>pip install pyinstaller

    打包

    :\>pyisntaller dpython.py 或

    :\>pyinstaller D:\codes\dpython.py

    生成一个独立可执行文件

    :\>pyinstaller -F dpython.py

     

     如果遇到生成文件运行后闪退的问题:可以在程序最后加上

    n=input("请输入按键退出")
5.截图如下
posted @ 2020-11-22 21:18  月亮上的垂耳喵  阅读(132)  评论(0)    收藏  举报