程序设计方法论——以乒乓球竞技为例

今天,看到了关于解决问题的自顶向下的设计方法,以前在《软件工程》书里面也出现过“自顶向下”这种方式,但是一直没有深入理解这是什么意思,如何去使用该方法,今天看书,看到了一个实例,收获很大。以后,在自己设计算法或者做实验的时候,要对这种方法熟练掌握。特此记录。

书中,说的“乒乓球体育竞技分析”的实例。

规则:发球方(甲)发球,败,对方发球(乙);胜,加分,继续发球,直到一方分数为15分时,结束比赛。给出两人能力值,模拟比赛环境,分析最后赢球率。

总体设计:

(1)介绍比赛过程

(2)获取选手能力值

(3)把步骤2的值,带入模拟比赛环境

(4)获取步骤3的结果,给予展示

所以,要设计四个函数。

def main():
    rule_introduction() #说明 
    A,B,n = get_values() # 获取AB 和 比赛场数
    result_A,result_B = competition(A,B,n) #模拟进行比赛
    print_result(result_A,result_B,n) #输出比赛结果

至此,顶层设计结束。

(1)介绍比赛过程,这个函数比较简单,用print()就可以完成


def rule_introduction():
    print('模拟A和B比赛情况')
    print('需要输入A和B的能力值')

(2)获取AB能力值和比赛总次数,需要返回值

def get_values():
    a = eval(input('输入A的能力值(介于0,1之间):'))
    b = eval(input('输入B的能力值(介于0,1之间):'))
    n = eval(input('输入比赛场数'))
    return a,b,n

(3)模拟比赛环境是代码的核心,

应该为先进行一场模拟,返回A或者B胜,然后累计n场比赛,最后输出结果。这里,有更下的一层关系,【就是模拟一场比赛】

def competition(A,B,n):
    result_A = 0
    result_B = 0
    while n != 0: # 共计n局比赛
        result = one_competition(A,B)#模拟一场比赛
        if result == 'A':
            result_A += 1
        else:
            result_B += 1
        n -= 1
    return result_A,result_B

然后,根据第二层模拟全部比赛,设计模拟一场比赛的代码。

def one_competition(A,B): #模拟一局比赛
    scoreA = 0
    scoreB = 0
    flag = 'A'
    while scoreA < 15 and scoreB < 15:
        if flag == 'A': #判断A是否赢
            if random() < A/(A+B):
                scoreA = scoreA + 1
            else :
                flag = 'B'
        else:
            if random() < B/(A+B):
                scoreB = scoreB +1
            else:
                flag = 'A'
    return flag

(4)返回结果,展示

def print_result(result_A,result_B,n): #记录一局比赛结果
    print("共进行了{}场比赛,A赢了{}场,A的赢率为{}".format(n,result_A,(result_A/n)))
    print("共进行了{}场比赛,B赢了{}场,B的赢率为{}".format(n,result_B,(result_B/n))) 

至此,这个“乒乓球体育竞技”程序就完成了,调用main(),就可以了。

最后结果可以显示,虽然能力差距只有0.05,但是大约需要经历三场才能赢一场,所以A选手赢得一场三局或者五局的比赛就很小了,这也是乒乓球的魅力把~~很有趣的小例子,虽然代码量不大,但是自顶向下的设计方法,按照这个例子学了一遍。也反思了一下自己为什么老是把程序写的乱七八糟。

参考:《全国计算机等级考试-pyhton二级考试》

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Foneone

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值