Python体育竞技模拟与程序打包实战:从乒乓球到篮球分析

Leo
Leo
发布时间:2026-10-13 | 2人浏览过
原创

本文介绍如何使用Python进行体育竞技分析,涵盖乒乓球与篮球比赛的模拟逻辑。详细解析自顶向下设计方法,实现基于能力值的胜负概率计算,并演示利用PyInstaller将Python脚本打包为独立可执行文件(exe)的完整流程,包括常用参数说明及部署建议。

Python体育竞技模拟与PyInstaller打包实战:从乒乓球到篮球分析

本文旨在展示如何利用Python语言进行体育竞技数据的模拟与分析,进而预测球队或选手的比赛成绩。

体育竞技分析的IPO模型

首先介绍体育竞技分析的基本IPO(输入-处理-输出)模型。

输入部分(Input)包括两名选手的能力值以及模拟比赛的总次数。其中,选手的能力值定义为发球方赢得该回合的概率,

例如,若某选手能力值为0.8,则其在发球时有80%的概率赢得这一分。

处理过程(Process)涉及对比赛全过程的模拟计算。

输出部分(Output)为两名选手各自获胜的概率统计结果。

该体育竞技程序的设计采用了自顶向下的开发策略。

自顶向下设计是解决复杂工程问题的有效方法,其核心步骤如下。


自顶向下设计的基本思想示意图如下。


乒乓球比赛规则模拟

接下来,我们首先基于乒乓球比赛的规则进行模拟。

在单局比赛中,率先获得11分的一方获胜;若比分达到10平,则需领先对手2分的一方获胜。

整场比赛采用七局四胜制。

具体的Python实现代码如下。


# -*- coding: utf-8 -*-
"""
Created on Wed May 15 12:49:17 2019
@author: moyulin
"""
from random import random
def printIntro():
  print("BY 2018310143103")
  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("请输入模拟比赛的局数: "))
  return a, b, n
def simNGames(n, probA, probB):
  WinsA, WinsB = 0, 0
  winsA, winsB = 0, 0
  for i in range(1,n+1):
    scoreA, scoreB = simOneGame(probA, probB)
    if scoreA > scoreB:
      winsA += 1
    else:
      winsB += 1
    if i%7==0:
      if winsA>winsB:
        WinsA+=1
        print("单打第{}场胜利的为A".format(int(i/7)))
      else:
        WinsB+=1
        print("单打第{}场胜利的为B".format(int(i/7)))
      winsA,winsB=0,0
  return WinsA, WinsB
def gameOver(a,b):
  if a>=10 and b>=10:
    if abs(a-b)==2:
      return True
  if a<10 or b<10:
    if a==11 or b==11:
      return True
  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:
        scoreB +=1
        serving="B"
    else:
      if random() < probB:
        scoreB += 1
      else:
        scoreA += 1
        serving="A"
    return scoreA, scoreB
def printSummary(winsA, winsB):
  n = winsA + winsB
  print("竞技分析开始,共模拟{}场比赛".format(n))
  print("选手A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
  print("选手B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
def main():
  printIntro()
  probA, probB, n = getInputs()
  WinsA, WinsB = simNGames(n, probA, probB)
  printSummary(WinsA, WinsB)
main()

程序运行后的输出结果如下所示。


使用PyInstaller打包应用程序

第三部分介绍如何使用PyInstaller工具将Python应用程序打包,使其能够在没有Python环境的设备上运行。

首先通过Win+R快捷键打开命令行窗口(CMD)。

第一步是安装PyInstaller库。

pip install pyinstaller

安装完成后即可使用该工具,以下介绍PyInstaller的部分常用使用方法。

-F或--onefile:将代码打包为单个可执行文件,适用于代码集中在一个.py文件的情况;若涉及多个.py文件,不建议使用此选项。

-D或--onedir:打包为包含多个依赖文件的目录,适合以框架形式编写的工具代码,便于后期维护,个人推荐此方式。

-K或--tk:在部署时包含TCL/TK图形界面支持。

-a或--ascii:不包含编码信息,在支持Unicode的Python版本中默认包含所有编码。

-d或--debug:生成用于调试的可执行文件版本。

-w、--windowed或--noconsole:使用Windows子系统执行,启动程序时不打开命令行窗口(仅适用于Windows系统)。

-c、--nowindowed或--console:默认行为,启动时显示命令行窗口。

第二步,在命令行中执行打包命令。

具体输入格式如下。

pyinstaller -F C:\#py文件地址

打包过程的界面显示如图例所示。

 

执行完毕后,返回根目录可查看生成的dist文件夹,其中包含可直接运行的exe文件,具体效果如图。

 

篮球比赛模拟分析

第四部分展示基于Python的篮球体育竞技模拟分析。

假设比赛规则为任何一方率先获得100分即判定获胜。

对应的Python代码如下。


from random import random
def printIntro():
  print("by 2018310143103")
  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("模拟比赛的场次: "))
  return a, b, n
def simNGames(n, probA, probB):
  winsA, winsB = 0, 0
  for i in range(n):
    scoreA, scoreB = simOneGame(probA, probB)
    if scoreA > scoreB:
      winsA += 1
    else:
      winsB += 1
  return winsA, winsB
def gameOver(a,b):
  return a==100 or b==100
def simOneGame(probA, probB):
  scoreA, scoreB = 0, 0
  serving = "A"
  while not gameOver(scoreA, scoreB):
    if serving == "A":
      if random() < probA:
        scoreA += 1
      else:
        scoreB += 1
    else:
      if random() < probB:
        scoreB += 1
      else:
        scoreA += 1
    return scoreA, scoreB
def printSummary(winsA, winsB):
  n = winsA + winsB
  print("竞技分析开始,共模拟{}场比赛".format(n))
  print("队A获胜{}场比赛,占比{:0.1%}".format(winsA, winsA/n))
  print("队B获胜{}场比赛,占比{:0.1%}".format(winsB, winsB/n))
def main():
  printIntro()
  probA, probB, n = getInputs()
  winsA, winsB = simNGames(n, probA, probB)
  printSummary(winsA, winsB)
main()

该模拟程序的运行结果如下。

总结。

以上内容介绍了使用Python进行体育竞技分析及预测球队成绩的方法,希望能对读者有所帮助。如有任何疑问,欢迎留言,小编会及时回复。感谢大家对本站的支持! 如果您觉得本文对您有帮助,欢迎转载,请注明出处,谢谢!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表