在中国大学mooc上学习python有一段时间了,终于到了整合的阶段,嵩天老师课程上给出来了一个双方选手模拟比赛的实例。程序为输入双方选手的能力(0-1),模拟n轮比赛的进行,得到双方获胜的统计情况。我在此基础上进行了一些修改
1.加入了数据有效性核验
2.输入数据试错退出机制
3.退出时间倒计时
关键代码如下所示:
def getInput_player(player):
global MaxAllowRetryNum
for tryies in range(MaxAllowRetryNum+1):
prob=input("请输入选手{}的能力值(0-1):".format(player))
try:
prob=float(eval(prob))
if prob >= 0 or prob <= 1:
break
else:
print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
except:
print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
continue
if tryies==MaxAllowRetryNum:
for i in range(5):
print("\r所有次数已用完,程序将在{}秒后退出".format(5-i),end="")
sleep(1)
print("\n")
quit()
return prob
全文代码如下:
#playGames.py
#coding = utf-8
from random import random
from time import sleep
global MaxAllowRetryNum
MaxAllowRetryNum=3#允许的试错次数,设置为全局变量
#输出程序相关信息
def printIntro():
print("这个程序模拟两个选手A和B的某种能力值")
print("程序运行需要A和B的能力值(以0到1之间的小数表示)")
print("每位选手的能力值最多允许有3次的错误输入机会")
#用户输入数据接口,输入的数据为选手名字和其对应的能力值(0-1),总比赛轮数
#此处将输入划分为两个主要功能部分,一处为输入选手信息,一处为输入比赛轮数
def getInputs():
a=getInput_player("A")
b=getInput_player("B")
n=getinput_num()
return a,b,n
#输入选手信息
#此处为关键修改后的代码
#若输入为0-1的小数,程序正常退出并返回能力值
#若输入为不在取值区间的小数或者其他字符串,要求用户重新输入,并提示剩余试错机会
#当所有的试错机用完,整个程序将进入五秒倒计时并强制退出,
def getInput_player(player):
global MaxAllowRetryNum
for tryies in range(MaxAllowRetryNum+1):
prob=input("请输入选手{}的能力值(0-1):".format(player))
try:
prob=float(eval(prob))#若输入为其他字符串,则执行except语句
if prob >= 0 or prob <= 1:#若为数字,对数值大小进行进一步查验
break
else:
print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
except:
print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
#若试错次数达到上限,则进入程序退出机制
if tryies==MaxAllowRetryNum:
for i in range(5):
print("\r所有次数已用完,程序将在{}秒后退出".format(5-i),end="")
sleep(1)
print("\n")
quit()
return prob
#输入统计的比赛轮数
#见输入选手信息部分代码
def getinput_num():
global MaxAllowRetryNum
for tryies in range(MaxAllowRetryNum+1):
num=input("请输入比赛轮数:")
try:
num=int(eval(num))
if num > 0:
break
else:
print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies),end="")
except:
print("请核对输入信息,还剩余{}次机会".format(MaxAllowRetryNum-tryies))
if tryies==MaxAllowRetryNum:
for i in range(5):
print("\r所有次数已用完,程序将在{}秒后退出".format(5-i))
sleep(1)
print("\n")
quit()
return num
#输出统计信息
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))
#统计比赛信息
def simNGames(n,probA,probB):
winsA,winsB=0,0
for i in range(n):
scoreA,scoreB=simOneNGame(probA,probB)
if scoreA> scoreB:
winsA += 1
else:
winsB += 1
return winsA,winsB
#模拟单轮比赛
#A起手,若随机函数值小于A能力值,A得一分,否则将起手权给B,A不扣分;B同理
#若达到比赛结束条件,即一方先达到15分,该轮比赛结束
def simOneNGame(probA,probB):
scoreA,scoreB=0,0
serving="A"
while not gameOver(scoreA,scoreB):
if serving == "A":
if random()
可以在此基础上再次修改,如更改游戏单轮中的规则,添加需要的统计信息等
参考链接:https://www.icourse163.org/learn/BIT-268001?tid=1206073223#/learn/content (第八周内容实例13)