1. 程式人生 > 其它 >採用排球比賽規則-26

採用排球比賽規則-26

from random import random
def printIntro():
  print("26號程式設計師的程式模擬兩個選手A和B的排球比賽")
  print("程式需要A和B的能力值(以0到1之間的小數表示)")
def getInputs():
  a=eval(input("請輸入選手A的能力值(0—1):"))
  b=eval(input("請輸入選手B的能力值(0—1):"))
  n=eval(input("模擬比賽的場次:"))
  return a,b,n
def simNGames(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
def gameOver1(a,b):
  return (a>=25 and a-b>2) or (b>=25 and b-a>2)
def gameOver2(a,b):
  return (a>=15 and a-b>2) or (b>=15 and b-a>2)
def simOneGame(probA,probB):

  for i in range (5):
    winsA,winsB=0,0
    scoreA,scoreB=0,0
    serving="A"
    while not gameOver1(scoreA,scoreB):
      if serving=="A":
        if random()<probA:
          scoreA+=1
        else:
          scoreB+=1
          serving="B"
      else:
        if random()<probB:
          scoreB+=1
        else:
          serving="A"
          scoreA+=1
      if scoreA>scoreB:
        winsA+=1
      else:
        winsB+=1
      if winsA==3 or winsB==3:
        break
      if winsA==2 and winsB==2:
        simtowGame(probA,probB)
  return winsA,winsB
def simtowGame(probA,probB):

  for i in range (1):
    scoreA,scoreB=0,0
    serving="A"
    while not gameOver2(scoreA,scoreB):
      if serving=="A":
        if random()<probA:
          scoreA+=1
        else:
          scoreB+=1
          serving="B"
      else:
        if random()<probB:
          scoreB+=1
        else:
          serving="A"
          scoreA+=1
  return scoreA,scoreB
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 main():
  printIntro()
  probA,probB,n=getInputs()
  winsA,winsB=simNGames(n,probA,probB)
  printSummary(winsA,winsB)

main()