預測球隊比賽成績

来源:https://www.cnblogs.com/deng11/archive/2020/04/18/12727193.html
-Advertisement-
Play Games

本文嘗試採用自頂向下的設計方法進行體育競技分析。自頂向下即將一個複雜問題分解成幾個問題,再細分成一個個具體的小問題,從而來解決複雜問題。 一、採用乒乓球比賽規則(學號尾號為3必做題) 比賽規則:(1)一局比賽:在一局比賽中,先得11分的一方為勝方:10平後,先多得2分的一方為勝方。 (2)一場比賽: ...


本文嘗試採用自頂向下的設計方法進行體育競技分析。自頂向下將一個複雜問題分解成幾個問題,再細分成一個個具體的小問題,從而來解決複雜問題。

一、採用乒乓球比賽規則(學號尾號為3必做題)

比賽規則:(1)一局比賽:在一局比賽中,先得11分的一方為勝方:10平後,先多得2分的一方為勝方。

(2)一場比賽:單打的淘汰賽為七局四勝制,雙打淘汰賽或團體賽為五局三勝制。

1、將體育競技分析分解為以下幾個小步驟

1.1列印程式的介紹性信息式

1.2獲得程式運行參數:probA(A的能力值),probB(B的能力值),n(比賽場次)

1.3利用球員AB的能力值,模擬n場比賽

1.4輸出球員AB獲勝的場次及概率

1.5用pyinstaller打包可執行文件

 

2、將各個步驟定義成函數來實現

 

2.1 主體函數:

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

2.2 自定義函數:

#列印程式介紹信息
def printIntro():
    print("19信計2班23號鄧若言")
    print("這個程式模擬兩個選手A和B的乒乓球比賽")
    print("程式運行需要A和B的能力值(以0到1之間的小數表示)")

#獲得程式運行參數
def printInputs():
    a = eval(input("請輸入選手A的能力值(0-1): "))
    b = eval(input("請輸入選手B的能力值(0-1): "))
    n = eval(input("模擬比賽的場次: "))
    return a, b, n

# 進行N場比賽
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        for j in range(7):           #進行7局4勝的比賽
            scoreA, scoreB = simOneGame(probA, probB)
            if scoreA > scoreB:
                winsA += 1
            else:
                winsB += 1
    return winsA,winsB


 #進行一場比賽
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0           #初始化AB的得分
    serving = "A"                 
    while not gameOver(scoreA, scoreB):     #用while迴圈來執行比賽
        if scoreA==10 and scoreB==10:
            return(simOneGame2(probA,probB))
        if serving == "A":
            if random() < probA:            ##用隨機數生成勝負
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB

def simOneGame2(probA,probB):
    scoreA,scoreB=10,10
    serving = "A"
    while not gameOver2(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(a,b):               #正常比賽結束
    return a==11 or b==11
def gameOver2(a,b):              #進行搶12比賽結束
   if abs((a-b))>=2:
       return a,b


#輸出數據
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))

  

2.3 合併

from random import random

#列印程式介紹信息
def printIntro():
    print("19信計2班23號鄧若言")
    print("這個程式模擬兩個選手A和B的乒乓球比賽")
    print("程式運行需要A和B的能力值(以0到1之間的小數表示)")

#獲得程式運行參數
def printInputs():
    a = eval(input("請輸入選手A的能力值(0-1): "))
    b = eval(input("請輸入選手B的能力值(0-1): "))
    n = eval(input("模擬比賽的場次: "))
    return a, b, n

# 進行N場比賽
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        for j in range(7):           #進行7局4勝的比賽
            scoreA, scoreB = simOneGame(probA, probB)
            if scoreA > scoreB:
                winsA += 1
            else:
                winsB += 1
    return winsA,winsB


 #進行一場比賽
def simOneGame(probA, probB):
    scoreA, scoreB = 0, 0           #初始化AB的得分
    serving = "A"                 
    while not gameOver(scoreA, scoreB):     #用while迴圈來執行比賽
        if scoreA==10 and scoreB==10:
            return(simOneGame2(probA,probB))
        if serving == "A":
            if random() < probA:            ##用隨機數生成勝負
                scoreA += 1
            else:
                serving="B"
        else:
            if random() < probB:
                scoreB += 1
            else:
                serving="A"
    return scoreA, scoreB

def simOneGame2(probA,probB):
    scoreA,scoreB=10,10
    serving = "A"
    while not gameOver2(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(a,b):               #正常比賽結束
    return a==11 or b==11
def gameOver2(a,b):              #進行搶12比賽結束
   if abs((a-b))>=2:
       return a,b


#輸出數據
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 = printInputs()
    winsA, winsB = simNGames(n, probA, probB)
    printSummary(winsA, winsB)

main()

  

單人賽預測結果如下: 

 

 

 當該比賽是雙人賽或者團體賽時,將 自定義函數simNGames(n,proA,proB)  稍作修改,改動如下:

# 進行N場比賽
def simNGames(n, probA, probB):
    winsA, winsB = 0, 0
    for i in range(n):
        for j in range(5):           #進行5局3勝的比賽
            scoreA, scoreB = simOneGame(probA, probB)
            if scoreA > scoreB:
                winsA += 1
            else:
                winsB += 1
    return winsA,winsB

結果如下:

2.4 打包可執行文件

在控制台輸入  Pyinstaller  -F  xxx(pyw文件路徑,我的是 D://我愛學習/python3/作業/moni.py)

可在對應路徑下找到exe文件:

 二、採用籃球比賽規則

比賽規則:

(1)籃球比賽由兩個隊參加,每隊出場5名隊員。每隊目標是在對方球籃得分,並阻止對方隊在本方球籃得分。

(2)籃球比賽由裁判員、記錄台人員和技術代表(如到場)管理。

(3)被某隊進攻的球籃是對方的球籃,由某隊防守的球籃是本方的球籃。

(4)在比賽時間結束時得分較多的隊,將是比賽的勝者。

 分析步驟基本同上,僅模擬比賽的自定義函數 simNGames(n,proA,proB) ,SimOneGame(proA,proB)和gameOver(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 simOneGame(probA, probB):
    scoreA, scoreB = 0, 0           #初始化AB的得分
    serving = "A"                 
    while not gameOver(scoreA, scoreB):     #用while迴圈來執行比賽
        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(a,b):
    return a>b or b>a

 合併後效果如下:

 

 

 

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • REST:即 Representational State Transfer。(資源)表現層狀態轉化 。是目前最流行的一種互聯網軟體架構。它結構清晰、符合標準、易於理解、擴展方便, 所以正得到越來越多網站的採用。使用 REST 風格的請求方式,可以簡化 url,達到使用同一個 url 不同請求方式來 ...
  • HTTP 405 的錯誤提示:消息 JSP 只允許 GET、POST 或 HEAD。Jasper 還允許 OPTIONS 的解決方法 ...
  • A - Balloons 題意:本題的題意比較簡單,簡單說就是分數字,使得A得到的數字之和大於B得到的數字之和,然後輸出分給A的數字的下標。 題解:要註意特判n==1和n==2的情況,屬於簽到題。 代碼: #include<iostream> #include<algorithm> #include ...
  • 按照計劃,這篇開始嘗試用elastic4s來做一系列索引管理和搜索操作示範。前面提過,elastic4s的主要功能之一是通過組合Dsl語句形成json請求。那麼我們先試試組合一些Dsl語句,再想辦法產生出json請求文本,然後在kibana控制臺中驗證它的正確性。 首先看看elastic4s提供的一 ...
  • 如何在抖音上找到漂亮小姐姐 抖音機器人 最近沉迷於抖音無法自拔,常常花好幾個小時在抖音漂亮小姐姐身上。 為了高效、直接地找到漂亮小姐姐,我用 Python + ADB 做了一個 Python 抖音機器人 Douyin-Bot。 特性 [x] 自動翻頁 [x] 顏值檢測 [x] 人臉識別 [x] 自動 ...
  • 我的LeetCode:https://leetcode cn.com/u/ituring/ 我的LeetCode刷題源碼[GitHub]:https://github.com/izhoujie/Algorithmcii LeetCode 11. 盛最多水的容器 題目 給你 n 個非負整數 a1,a2 ...
  • 前言 文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:Python測試社區 1目 標 場 景 平時在工作過程中,偶爾會需要大量的 手機號碼,去測試一些具體的業務功能,為了保證測試的有效性,手機號碼的 真實性 尤為的重要。 那 ...
  • 在微信開放平臺 【管理中心/應用詳情】 設置的 【開發信息】 【授權回調域】 只要填定功能變數名稱,不帶https://,不帶具體的頁面,就可以了,不需要填完整的請求路徑, 如圖: 在https://open.weixin.qq.com/connect/qrconnect?appid=你的APPID&red ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...