羽毛球比赛

1.将羽毛球比赛分析分解为以下几个小步骤

1.1打印程序的介绍性信息式
1.2获得程序运行参数:A(A的能力值),B(B的能力值),n(比赛场次)
1.3利用球员AB的能力值,模拟n场比赛
1.4输出球员AB获胜的场次及概率

2.将各个步骤定义成函数来实现:

    代码如下:

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.

author@foldline 学号:2018310143029
"""

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()来输出比赛的结果信息
    
#第二阶段
def printIntroduce():
    print('学号:2018310143029')
    print('这个程序模拟两个选手A和B的羽毛球竞技比赛')
    print('程序运行需要A和B的能力值')
    
def getInputs():
    a=eval(input('请输入选手A的能力值(0~1):'))
    b=eval(input('请输入选手A的能力值(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()

3.运行结果如图:

3.1.能力值高:

3.2.能力值低:

4.用pyinstaller打包可执行文件:

 

转载于:https://www.cnblogs.com/foldline/p/10870061.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值