以体育竞技分析为例,IPO如下:
设计步骤:
#matchSim.py
from random import random#引入random库中的random函数
def simOneGame(proA,proB):#模拟每次比赛,若是A胜则A先拿到15分,即scoreA=15>screB
serving="A"#设第一场发球方为A
scoreA=scoreB=0#初始化每场A,B的分数
while not scoreA==15 or scoreB==15:#若A或B任意一方先拿到15分,即获胜,同时停止比赛;不然比赛就一直继续
if serving=="A":#若发球方为A
if random()screB
if scoreA>scoreB:
winsA+=1.0#若A胜,则A的获胜次数就+1
else:
winsB+=1.0#同上
return winsA,winsB#模拟n次后,返回A,B的获胜次数,以待输出
def printSummary(winsA,winsB):#输出A,B获胜的比赛的次数及概率
n=winsA+winsB
print "\nGames simulated:%d"%n#输出模拟比赛的场次:n次
a=winsA/n
b=winsB/n
print "Wins for A:{0}({1:0.1%})".format(winsA,a)
#{1:0.1%}:格式化第而2个数,保留一位小数,右对齐,以0作为补充。
print "Wins for B:{0}({1:0.1%})".format(winsB,b)
#输出B获胜次数,及概率
if __name__=='__main__':main()
#一般用来测试模块功能的,只有直接运行[python 模块.py]的时候才会运行这个
基本思想:从一个简单的程序或者一个程序组件开始,逐渐添加特性,直到其完全,满足要求。即首先设计、执行原型,然后再设计、执行并测试新特征,再将原型逐步扩展为最终的程序,在整个程序发展周期上通过设置很多小的环形结构改善程序功能。
基于原型的改善计划:
#matchSim_1.py
from random import random
def simOneGame():
scoreA=0
scoreB=0#初始化双方得分
serving="A"#设第一次的发球方为A
for i in range(30):#进行30回合的比赛
if serving=="A":
if random()<.5:#发球方始终有50%的胜率
scoreA+=1
else:
serving="B"
else:
if random()<.5:
scoreB+=1
else:#失败后,转换发球方
serving="A"
print scoreA,scoreB#输出比分
simOneGame()
#matchSim_2.py
from random import random
def simOneGame(proA,proB):
scoreA=0
scoreB=0#初始化双方得分
serving="A"#设第一次的发球方为A
for i in range(30):#进行30回合的比赛
if serving=="A":
if random()
#matchSim_3.py
from random import random
def simOneGame(proA,proB):
scoreA=0
scoreB=0#初始化双方得分
serving="A"#设第一次的发球方为A
while not gameOver(scoreA,scoreB):#若有A或B任意一方先拿到15分则立即停止本场比赛
if serving=="A":
if random()
#matchSim_4.py
from random import random
def simOneGame(proA,proB):
scoreA=0
scoreB=0#初始化双方得分
serving="A"#设第一次的发球方为A
while not gameOver(scoreA,scoreB):#若有A或B任意一方先拿到15分则立即停止本场比赛
if serving=="A":
if random()screB
if scoreA>scoreB:
winsA+=1.0#若A胜,则A的获胜次数就+1
else:
winsB+=1.0#同上
print winsA,winsB#输出每个球员赢得的比赛次数
return winsA,winsB#模拟n次后,返回A,B的获胜次数,以待输出
simNGames(500,0.5,0.5)
#matchSim_5.py
from random import random
def simOneGame(proA,proB):
scoreA=0
scoreB=0#初始化双方得分
serving="A"#设第一次的发球方为A
while not gameOver(scoreA,scoreB):#若有A或B任意一方先拿到15分则立即停止本场比赛
if serving=="A":
if random()screB
if scoreA>scoreB:
winsA+=1.0#若A胜,则A的获胜次数就+1
else:
winsB+=1.0#同上
return winsA,winsB#模拟n次后,返回A,B的获胜次数,以待输出
def main():
print"The program simulates a game between two"
print"There are two players,A and B"
print"Probability(a number between 0and 1)is used"#打印比赛的介绍性信息
#获得运行需要的参数:A,B的能力值,模拟比赛场次
proA=eval(raw_input("What is the prob,player A wins?"))#获取A的能力值
proB=eval(raw_input("What is the prob,player B wins?"))#获取B的能力值
n=eval(raw_input("How many games to simulate?"))#获取模拟比赛场次
winsA,winsB=simNGames(n,proA,proB)#模拟比赛过程
n=winsA+winsB
#输出比赛结果及概率
print "\nGames simulated:%d"%n#输出模拟比赛的场次:n次
print "Wins for A:{0}({1:0>1}%)".format(winsA,winsA/n*100)
print "Wins for B:{0}({1:0>1}%)".format(winsB,winsB/n*100)
main()
以上代码,按照1-5的顺序即为原型开发体育竞技分析的过程。
螺旋式设计方法在处理新的或者不熟悉的特性或技术时及其有效,有助于用最少的代价实现程序的核心功能。
螺旋式开发与自顶向下的设计方式是互补的。