python 选手比赛模拟

在中国大学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()<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


def main():
    printIntro()
    probA,probB,n = getInputs()
    winsA,winsB = simNGames(n,probA,probB)
    printSummary(winsA,winsB)

main()

可以在此基础上再次修改,如更改游戏单轮中的规则,添加需要的统计信息等

参考链接:https://www.icourse163.org/learn/BIT-268001?tid=1206073223#/learn/content (第八周内容实例13)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值