自顶向下(体育竞技分析)MOOC

本文介绍了一个使用Python编写的程序,通过计算思维和抽象方法,模拟两个选手A和B在特定比赛规则下的竞技,自动执行多场比赛并分析结果。程序包括输入选手能力值、比赛场次,以及模拟比赛并输出获胜场次和比例的功能。
摘要由CSDN通过智能技术生成

体育竞技分析

计算思维:抽象+自动化
模拟
抽象比赛过程+自动化执行N场比赛
自顶向下(解决复杂问题的有效方法)
1. 将一个总问题表达为若干小问题组成形式
2. 使用同样的方法进一步分解小问题
3. 直至,小问题可以用计算机简单明了解决
顶层设计:自顶向下最重要的就是顶层设计。以体育竞技分析为例。可以从问题的IPO描述开始。
大多数程序都可以简单将IPO描述直接用到程序结构设计中,体育竞技分析,从用户得到参数模拟比赛,最后输出结果。

# step1 输出介绍信息
# step2 获取用户输入
# step3 使用probA, probB模拟n场比赛,返回AB球员赢得比赛的结果。
# step4 输出结果
def main():
	printIntro()
	probA, probB, n = getInputs()
	winsA, winsB = simNGames(n, probA, probB)
	printSummary(winsA, winsB)
程序总体框架及步骤:

体育竞技分析

from random import random
# 打印程序的介绍信息式printIntro()
def printIntro():
	print("这个程序模拟两个选手A和B的竞技比赛")
	print("程序需要运行A和B的能力值(0到1之间的小数)")

# 获得程序运行参数,选手A B赢得概率,比赛场次:ProbA, ProbB, n getInputs()
def getInputs():
	a = eval(input("请输入选手A的能力值(0-1):"))
	b = eval(input("请输入选手B的能力值(0-1):"))
	n = eval(input("模拟比赛的场次:"))
	return a, b, n

# 输出球员A和B获胜比赛的场次及概率printSummary()
def printSummary(winsA, winsB):
	n = winsA+winsB
	print('竞技分析开始,共模拟{}场比赛。'.format(n))
	print("选手A赢了{}场,占比{:0.1%}".format(winsA, winsA/n))
	print("选手B赢了{}场, 占比{:0.1%}".format(winsB, winsB/n))
			
# 利用球员A和B的能力值,模拟n局比赛simNGames(),跟踪记录每个球员赢得了多少比赛

def simNGame(n, probA, probB):
	winsA, winsB = 0, 0
	for i in range(n):
		scoreA, scoreB = simOneGame(probA, probB)
		if scoreA > scoreB:
			winsA += 1
		else:
			winsB += 1
	return winsA, winsB
# 比赛规则:计分办法 比赛采用三局两胜制,每局为15分,采用每球得分制,即由赢的一方直接得分,发球,先得15分的为胜一局

def simOneGame( probA, probB):
	scoreA, scoreB = 0, 0
	serving = 'A'
	while not gameOver(scoreA, scoreB):
		if serving == "A":
			if random() < probA:
				scoreA += 1
			else:
				serving = "B"
		else:
			if random() < probB:
				scoreB += 1
			else:
				serving = "A"
		return scoreA, scoreB
# 一场比赛结束条件
def gameOver(scoreA, scoreB):
	return scoreA == 15 or scoreB == 15

最后调用函数即可。

main()

程序运行结果
模拟比赛结果输出

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值