今天,看到了关于解决问题的自顶向下的设计方法,以前在《软件工程》书里面也出现过“自顶向下”这种方式,但是一直没有深入理解这是什么意思,如何去使用该方法,今天看书,看到了一个实例,收获很大。以后,在自己设计算法或者做实验的时候,要对这种方法熟练掌握。特此记录。
书中,说的“乒乓球体育竞技分析”的实例。
规则:发球方(甲)发球,败,对方发球(乙);胜,加分,继续发球,直到一方分数为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二级考试》