import random def printIntro(): print("2019310143132") print("模拟乒乓球晋级赛") print("七局四胜制,一局共打11场") print("程序运行需要ABCD的能力值(以0到1之间的小数表示)") def getInputs(): a = eval(input("请输入选手A的能力值(0-1): ")) b = eval(input("请输入选手B的能力值(0-1): ")) c = eval(input("请输入选手C的能力值(0-1): ")) d = eval(input("请输入选手D的能力值(0-1): ")) return a,b,c,d def simOneGame(probA, probB): scoreA, scoreB = 0, 0 serving = "A" while not gameOver(scoreA, scoreB): if serving == "A": if random.random() < probA: scoreA += 1 else: serving = "B" else: if random.random() < probB: scoreB += 1 else: serving = "A" return scoreA, scoreB def simNGames(probA, probB): winsA, winsB = 0, 0 for i in range(7): scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB def gameOver(a, b): return a == 11 or b == 11 def oneround(probA, probB): roundA,roundB=0,0 while not roundover(roundA,roundB): A,B=simNGames(probA, probB) if A>B: roundA+=1 else: roundB+=1 return roundA,roundB def Nround(probA,probB): winsA, winsB = 0, 0 for i in range(7): scoreA, scoreB = oneround(probA,probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB def roundover(a,b): return a == 4 or b == 4 def main(): printIntro() probA,probB,probC,probD = getInputs() winA,winB=Nround(probA, probB) print("-------------------") print("第一轮比赛开始") print("选手A获胜{}回合".format(winA)) print("选手B获胜{}回合".format(winB)) if winA>winB: print("A胜利") E='A' else: print("B胜利") E='B' winC,winD=Nround(probC, probD) print("选手C获胜{}回合".format(winC)) print("选手D获胜{}回合".format(winD)) if winC>winD: print("C胜利") F='C' else: print("D胜利") F='D' print("---------------------") print("第二轮开始") #20200422记:以下为错误 winE=max(winA,winB) winF=max(winC,winD) winE,winF=Nround(probA, probB)
print("选手{}获胜{}回合".format(E,winE)) print("选手{}获胜{}回合".format(F,winF)) if winE>winF: print("{}胜利,为冠军".format(E)) else: print("{}胜利,为冠军".format(F)) main()
比赛模拟:
1)ABCD四人竞技,两两决斗出现冠军,其余忽略。
2)用random库模拟一场胜利条件。
3)胜利者产生-->N回合胜场-->单回合统计-->11场胜率统计-->单场胜利出现
反思:
1)借鉴其他大神思想,只是单纯把回合制的条件补齐
2)函数封装方面在个人设置的main函数做的不够好(两两竞赛应该可以再划分一个函数)
3)个人实力有限,难以判断该代码是否真实判断(是否正确的选出冠军)
4) 当一场比赛得分10平时我没有想到如何表述
!!!如果大家有什么好建议务必与我分享>0<!!!
202004221600 更:
import random def printIntro(): print("2019310143132") print("模拟乒乓球晋级赛") print("七局四胜制,一局共打11场") print("程序运行需要ABCD的能力值(以0到1之间的小数表示)") def getInputs(): a = eval(input("请输入选手A的能力值(0-1): ")) b = eval(input("请输入选手B的能力值(0-1): ")) c = eval(input("请输入选手C的能力值(0-1): ")) d = eval(input("请输入选手D的能力值(0-1): ")) return a,b,c,d def simOneGame(probA, probB): scoreA, scoreB = 0, 0 serving = "A" while not gameOver(scoreA, scoreB): if serving == "A": if random.random() < probA: scoreA += 1 else: serving = "B" else: if random.random() < probB: scoreB += 1 else: serving = "A" return scoreA, scoreB def simNGames(probA, probB): winsA, winsB = 0, 0 for i in range(7): #胜11场 scoreA, scoreB = simOneGame(probA, probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB def gameOver(a, b): return a == 11 or b == 11 def oneround(probA, probB): roundA,roundB=0,0 while not roundover(roundA,roundB): A,B=simNGames(probA, probB) if A>B: roundA+=1 else: roundB+=1 return roundA,roundB def Nround(probA,probB): winsA, winsB = 0, 0 for i in range(7): scoreA, scoreB = oneround(probA,probB) if scoreA > scoreB: winsA += 1 else: winsB += 1 return winsA, winsB def roundover(a,b): return a == 4 or b == 4 def main(): printIntro() probA,probB,probC,probD = getInputs() probE,probF=0,0 winA,winB=Nround(probA, probB) winC,winD=Nround(probC, probD) print("-------------------") print("第一轮比赛开始") print("选手A获胜{}回合".format(winA)) print("选手B获胜{}回合".format(winB)) if winA>winB: print("A胜利") E='A' probE=probA else: print("B胜利") E='B' probE=probB print("选手C获胜{}回合".format(winC)) print("选手D获胜{}回合".format(winD)) if winC>winD: print("C胜利") F='C' probF=probC else: print("D胜利") F='D' probF=probD print("---------------------") print("第二轮开始") winE,winF=Nround(probE, probF) print("选手{}获胜{}回合".format(E,winE)) print("选手{}获胜{}回合".format(F,winF)) if winE>winF: print("{}胜利,为冠军".format(E)) else: print("{}胜利,为冠军".format(F)) main()
受到登顶神“贾翊来编程”的反馈,发现自己错了一个地方。
在第一个代码中,我本人想法是通过E这个人来继承AB的胜者,F继承CD的胜者。然后再EF同台竞技。
显然在继承能力以及席位的过程中,发现有一些纰漏。(EF的胜场数为是AB对决得到)
在此感谢登顶神
附加内容:
运用pyinstaller打包可以执行的文件。
pyinstaller 是一个十分有用的第三方库,它能够在Windows、Linux、等操作系统下将python 原文件打包,因为python脚本如果在没有安装python的电脑上,其代码不能运行,所以要将脚本打包成exe文件,使降低脚本对环境的依赖性,同时运行会更加迅速。
安装方法:在电脑的控制台上用pip工具安装,代码如下:
:>pip install pyinstaller
或
:>pip3 install pyinstaller
再或者可以通过 pyinstaller的官网进行下载。
利用 pyinstaller进行文件打包,该文件名为wenjian.py.打包输入代码为:
:>pip pyinstaller -F D:codeswenjian.py