体育竞技模拟比赛

乒乓球比赛基本规则:

一方首先具有发球权,双方连续击打,球落地则该回合结束。如果输掉这一回合的是发球方,双方均不加分,但发球权要交给另一方。如果发球方赢得了这一回合,则发球方赢得1分,并继续拥有发球权。比赛总共进行n 局。一局比赛中,先得11分的一方为胜方,10平后,先多得2分得一方为胜方,胆大的淘汰赛采用七局四胜制,双打的淘汰赛和团体赛采用五局三胜制。

采用自顶向下的程序设计

步骤一:打印程序的介绍性信息

步骤二:获得运行需要的参数,即porbA,porbB,n

步骤三:利用球员A和B得能力值probA和probB,模拟n次比赛

步骤四:输出球员A和B得获胜比赛得场次及概率

def main():

  printIntro()##输出介绍信息

  probA,probB,n=getInputs()##获得用户输入,通过函数将语句及输入格式等细节封装或隐藏调用getInputs函数获取变量n,probA,probB的值。这个函数必须              作为主程序给返回这些值

  winsA,winsB=simNGames(n,probA,probB)##需要使用probA,probB模拟n场比赛,设计一个simNGames函数模拟比赛并返回结果

  printsummary(winsA,winsB)##输出结果

代码

# -*- coding: utf-8 -*-
"""
Created on Sat May 11 16:37:13 2019
@author: 18605
"""
#e15.1MatchAnalysis.py
from random import random
def printIntro():#打印程序的介绍性信息
    print("33号程序模拟两个选手A和B的乒乓球竞技比赛")
    print("33号程序运行需要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):#利用A,B的的能力值模拟N场比赛
    winsA,winsB=0,0
    for i in range(n):
        pingpangA,pingpangB=simOneGame(probA,probB)#simOneGame函数用于模拟一场比赛
        if(pingpangA>pingpangB):#计数循环,记录每个成员赢了多少局比赛
            winsA+=1
        else:
            winsB+=1
    return winsA,winsB
def gameOver(a,b):#比赛结束的条件(再一局比赛中,先得11分者为胜方;10平后,先得2分的一方为胜方)
    if(a-b==2 and a>=10 and b>=10):
        return True
    elif(b-a==2 and a>=10 and b>=10):
        return True
    if a==11 or b==11:
        return True
    else:
        return False
def simOneGame(probA,probB):#用于模拟一场比赛
    pingpangA,pingpangB=0,0
    serving="A"#先由A发球
    while not gameOver(pingpangA,pingpangB):
        if(serving=='A'):
            if random() < probA:#通过随机数和概率确定发球放是否赢得比分(random()<prob)
                pingpangA += 1#若A赢得比分,则发球权不变
            else:
                serving='B'#反之发球权给B
        else:
            if random() < probB:
                pingpangB += 1
            else:
                serving="A"
    return pingpangA,pingpangB
def printsummary(winsA,winsB):#输出A,B获胜的比赛场次及概率
    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打包

在cmd中输入pyinstaller -F Filename.py(Filename写文件名)

打包截图

成功打包成exe可执行文件

运行

想要不闪退在程序后加input输入

成功!!! 

原文地址:https://www.cnblogs.com/SGzhang/p/10854319.html