兵乓球比賽

2022-07-11 18:57:11 字數 4785 閱讀 1112

from random import random

from pandas import dataframe

from time import time

class sportcompetitionanalyze:

def printinfo(self):

'''function: 列印程式的介紹資訊

'''print("".format("產品簡介"))

print("產品名稱: 桌球競技模擬分析器(採取單打淘汰賽制)")

print("產品概述: 通過輸入多個隊伍的能力值(0到1之間的小數表示),能夠模擬多次多個隊伍的桌球競技比賽,從而得出各自的勝率!")

print("".format("模擬開始"))

def getinputs_for_singal(self):

'''function: 獲得使用者輸入的引數 獲得單打各隊員的能力值

'''self.n = eval(input("請輸入需要模擬比賽的場數:"))

self.probabilitylist_original = list(map(eval, input("(注:通過輸入的次序進行兩兩配對, 即前兩個分別為隊員a和b;以此類推。)\n\

請輸入各隊員的能力值(0~1), 請用英文逗號隔開(輸入個數為2的倍數): ").split(',')))

self.probabilitylist = self.probabilitylist_original

self.probnum = len(self.probabilitylist)

def getinputs_for_double(self):

'''function: 獲得使用者輸入的引數 獲得雙打各隊伍各隊員的能力值

probabilitylist: 使用各隊伍中兩隊員的平均能力值作為該隊伍的能力值 --- 雙打

probabilitylist_original: 儲存原生的各隊員能力值, 後續可用

'''self.probabilitylist, self.probabilitylist_original = ,

self.n = eval(input("請輸入需要模擬比賽的場數:"))

original = list(map(eval, input("(注:通過輸入的次序進行四四配對, 即前四個為隊伍a和b;以此類推。)\n\

請輸入各隊員的能力值(0~1), 請用英文逗號隔開(輸入個數為4的倍數): ").split(',')))

for i in range(0, len(original), 2):

self.probnum = len(self.probabilitylist)

def printresult(self):

'''function: 輸出模擬比賽的結果

data: 儲存每支的比賽資訊

'''print("".format("模擬結束"))

print("競技分析結束,每組共模擬{}場比賽。".format(self.n))

data =

for i in range(self.probnum):

tmplist =

datasheet = dataframe(data , index=list(range(1, self.probnum+1)), columns=list(["ability", "wins", "rate"]))

#datasheet.sort_values(by="wins", inplace=true) # 對比賽勝率rate進行排序, 會混亂比賽隊伍的關係, 因此不採用

print(datasheet)

def simngames(self, games, wins):

'''function: 模擬n場比賽

probwinslist: 儲存每支隊伍贏得比賽的場數 的列表

wina, winb: 隊伍a和b在一場比賽中獲勝的局數

winsa, winsb: 隊伍a和b贏得比賽的場數,總共n場

'''self.probwinslist =

for i in range(0, self.probnum, 2):

print("隊員:", i+1, 'vs' ,i+2, "比賽中...")

winsa, winsb = 0, 0

for _ in range(self.n):

wina, winb = self.simonegame(self.probabilitylist[i], self.probabilitylist[i+1], games, wins)

if wina > winb:

winsa += 1

else:

winsb += 1

def simonegame(self, proba, probb, games, wins):

'''function: 模擬一場比賽 》 games局 wins勝

單打比賽,包括七局,採取七局四勝制

雙打比賽,包括五局,採取五局三勝制

scorea, scoreb: 分別為隊伍a和b一局比賽的分數

wina, winb: 分別為隊伍a和b一場比賽贏的局數

return: 返回雙方贏的局數

'''wina, winb = 0, 0

for _ in range(games):

scorea, scoreb = self.simagame(proba, probb)

if scorea > scoreb:

wina += 1

else:

winb += 1

if wina >=wins or winb >= wins:

break

return wina, winb

def simagame(self, proba, probb):

'''function: 模擬一局比賽

proba, probb: 分別為隊伍a和b的能力值

return: 返回隊伍a和b在本局比賽中獲得的分數

'''scorea, scoreb = 0, 0

serving = 'a' # 發球方

servingnum = 2 # 每方的發球次數

while not self.gameover(scorea, scoreb):

if scorea >= 10 and scoreb >= 10:

servingnum = 1

for _ in range(servingnum):

if random() > proba:

scoreb += 1

else:

scorea += 1

serving = 'b'

for _ in range(servingnum):

if random() > probb:

scorea += 1

else:

scoreb += 1

serving = 'a'

return scorea, scoreb

def gameover(self, scorea, scoreb):

'''function: 定義贏得一局的條件: 先得11分為勝,10平後,多得2分為勝

'''if scorea >= 11 or scoreb >= 11:

return (abs(scorea-scoreb)>=2)

elif (scorea == 10 and scoreb > 11) or (scoreb == 10 and scorea > 11):

return (abs(scorea-scoreb)>=2)

else:

return 0

def print_menu():

print("程式簡介:模擬桌球競技")

print("程式功能:\n\t1. 模擬多隊員進行單打比賽\n\t2. 模擬多隊伍多隊員進行雙打比賽")

while 1:

choose = input("功能選擇:no.")

if choose in ['1', '2']:

return eval(choose)

else:

print("輸入有誤, 請重新輸入!")

def simgamemenu():

choose = print_menu()

if choose == 1:

pingpong = sportcompetitionanalyze()

pingpong.printinfo()

pingpong.getinputs_for_singal()

time = time()

pingpong.simngames(7, 4)

print("模擬用時: s".format(time()-time))

pingpong.printresult()

else:

pingpong = sportcompetitionanalyze()

pingpong.printinfo()

pingpong.getinputs_for_double()

time = time()

pingpong.simngames(5, 3)

print("模擬用時: s".format(time()-time))

NOIP普及組 2003 兵乓球

華華通過以下方式進行分析,首先將比賽每個球的勝負列成一張表,然後分別計算在11分制和21分制下,雙方的比賽結果 截至記錄末尾 比如現在有這麼乙份記錄,其中w表示華華獲得一分,l表示華華對手獲得一分 wwwwwwwwwwwwwwwwwwwwwwlw 在11分制下,此時比賽的結果是華華第一局11比0獲勝...

兵乒球比賽模擬python作業

from random import random def printintro 列印程式介紹資訊 print 20信計2班 甘發亮 50號 桌球比賽規則程式設計如下 print 這個程式模擬兩個選手a和b的某種競技比賽 print 程式執行需要a和b的能力值 以0到1之間的小數表示 def get...

羽毛球比賽模擬

encoding utf 8 模擬羽毛球競技 比賽規則 2.前四局採用21分制,每個隊只有在贏得至少21分,且同時超過對方2分時才勝一局 from random import random from time import time def printinfo function 列印程式的介紹資訊 ...