zoukankan      html  css  js  c++  java
  • 体育竞技模拟比赛

    乒乓球比赛基本规则:

    一方首先具有发球权,双方连续击打,球落地则该回合结束。如果输掉这一回合的是发球方,双方均不加分,但发球权要交给另一方。如果发球方赢得了这一回合,则发球方赢得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输入

    成功!!! 

  • 相关阅读:
    关于直播的技术整理2
    关于直播的技术整理
    android drawable size
    Could not find gradle wrapper within android sdk
    基于开源Red5搭建的视频直播平台
    Cannot find module 'rxjs/operators/share'
    Cannot find type definition file for '.svn'
    Ionic国际化解决方案
    本博客停止更新改用wordperss
    Powershell批量安装SNMP服务
  • 原文地址:https://www.cnblogs.com/SGzhang/p/10854319.html
Copyright © 2011-2022 走看看