综合实时python案例,比分还会改写吗?

wen python案例 1

这是一个很好的问题!让我为你提供一个实时比分追踪的Python综合案例,并回答“比分还会改写吗”这个问题。

综合实时python案例,比分还会改写吗?

实时比分追踪系统

场景设定

假设我们在追踪一场NBA篮球赛,由于是实时数据流,比分确实会不断改写!

import random
import time
from datetime import datetime
from typing import Dict, List, Optional
import threading
from dataclasses import dataclass, field
from enum import Enum
class GameStatus(Enum):
    NOT_STARTED = "未开始"
    FIRST_QUARTER = "第一节"
    SECOND_QUARTER = "第二节"
    HALFTIME = "中场休息"
    THIRD_QUARTER = "第三节"
    FOURTH_QUARTER = "第四节"
    FINISHED = "比赛结束"
@dataclass
class Team:
    name: str
    score: int = 0
    timeouts: int = 6  # NBA每队6个暂停
    fouls: int = 0
    def add_score(self, points: int):
        self.score += points
@dataclass
class Game:
    home_team: Team
    away_team: Team
    status: GameStatus = GameStatus.NOT_STARTED
    current_quarter: int = 0
    game_time_remaining: int = 12 * 60  # 12分钟一节,以秒计
    events_log: List[str] = field(default_factory=list)
    is_live: bool = True
    def get_score_text(self) -> str:
        """获取当前比分"""
        return f"{self.home_team.name} {self.home_team.score} : {self.away_team.score} {self.away_team.name}"
    def log_event(self, event: str):
        """记录比赛事件"""
        timestamp = datetime.now().strftime("%H:%M:%S")
        self.events_log.append(f"[{timestamp}] {event}")
        print(f"🏀 {event}")
class RealTimeScoreTracker:
    """实时比分追踪器"""
    def __init__(self, home_team_name: str, away_team_name: str):
        self.game = Game(
            home_team=Team(name=home_team_name),
            away_team=Team(name=away_team_name)
        )
        self.history = []  # 存储历史比分快照
        self.is_running = True
    def record_snapshot(self):
        """记录当前比分快照"""
        snapshot = {
            'time': datetime.now(),
            'score': self.game.get_score_text(),
            'status': self.game.status.value
        }
        self.history.append(snapshot)
    def simulate_scoring(self):
        """模拟得分事件"""
        if not self.game.is_live:
            return
        # 根据比赛时间决定得分概率
        time_factor = max(0.1, self.game.game_time_remaining / (12 * 60))
        score_chance = 0.3 * time_factor
        if random.random() < score_chance:
            team = random.choice([self.game.home_team, self.game.away_team])
            points = random.choice([2, 2, 3, 1])  # 权重:2分球更常见
            # 1分代表罚球,2分代表普通投篮,3分代表三分球
            if points == 1:
                team.add_score(1)
                self.game.log_event(f"🎯 {team.name} 罚球命中!+1分")
            elif points == 2:
                team.add_score(2)
                self.game.log_event(f"🏀 {team.name} 2分命中!+2分")
            else:
                team.add_score(3)
                self.game.log_event(f"🔥 {team.name} 三分出手!+3分")
            self.record_snapshot()
            return points
        return 0
    def update_game_status(self):
        """更新比赛状态"""
        if not self.game.is_live:
            return
        self.game.game_time_remaining -= 1
        if self.game.game_time_remaining <= 0:
            if self.game.status in [GameStatus.FIRST_QUARTER, GameStatus.SECOND_QUARTER, 
                                   GameStatus.THIRD_QUARTER]:
                self.game.current_quarter += 1
                if self.game.current_quarter == 2:
                    self.game.status = GameStatus.HALFTIME
                    self.game.log_event("⏰ 中场休息!")
                elif self.game.current_quarter < 4:
                    if self.game.current_quarter == 1:
                        self.game.status = GameStatus.FIRST_QUARTER
                    elif self.game.current_quarter == 3:
                        self.game.status = GameStatus.THIRD_QUARTER
                    self.game.log_event(f"⏰ 第{self.game.current_quarter}节开始!")
                elif self.game.current_quarter == 4:
                    self.game.status = GameStatus.FOURTH_QUARTER
                    self.game.game_time_remaining = 12 * 60
                elif self.game.current_quarter > 4:
                    # 加时赛
                    self.game.game_time_remaining = 5 * 60
                    self.game.log_event("⚡ 进入加时赛!")
            elif self.game.status == GameStatus.HALFTIME:
                self.game.status = GameStatus.THIRD_QUARTER
                self.game.current_quarter = 3
                self.game.game_time_remaining = 12 * 60
                self.game.log_event("⏰ 下半场开始!")
            elif self.game.status == GameStatus.FOURTH_QUARTER:
                if self.game.home_team.score == self.game.away_team.score:
                    self.game.game_time_remaining = 5 * 60
                    self.game.log_event("⚡ 常规时间战平,进入加时!")
                else:
                    self.finish_game()
    def finish_game(self):
        """结束比赛"""
        self.game.status = GameStatus.FINISHED
        self.game.is_live = False
        self.game.log_event(f"🏆 比赛结束!最终比分:{self.game.get_score_text()}")
        # 判断胜负
        if self.game.home_team.score > self.game.away_team.score:
            winner = self.game.home_team.name
        elif self.game.home_team.score < self.game.away_team.score:
            winner = self.game.away_team.name
        else:
            winner = "双方打平"
        self.game.log_event(f"👑 获胜方:{winner}")
    def run_live_simulation(self, duration_seconds: int = 60):
        """运行实时模拟"""
        print("🎬 比赛开始!")
        self.game.status = GameStatus.FIRST_QUARTER
        self.game.current_quarter = 1
        self.game.log_event(f"比赛开始:{self.game.home_team.name} VS {self.game.away_team.name}")
        start_time = time.time()
        tick = 0
        while self.game.is_live and (time.time() - start_time) < duration_seconds:
            tick += 1
            self.simulate_scoring()
            self.update_game_status()
            # 每10个tick显示一次当前比分
            if tick % 10 == 0:
                print(f"\n📊 当前比分:{self.game.get_score_text()}")
                print(f"🕐 状态:{self.game.status.value} | 剩余时间:{self.game.game_time_remaining//60}:{self.game.game_time_remaining%60:02d}")
                print("-" * 50)
            # 控制模拟速度
            time.sleep(0.1)  # 模拟真实时间流逝
        # 确保比赛结束
        if self.game.is_live:
            self.finish_game()
        self.show_final_report()
    def show_final_report(self):
        """显示最终报告"""
        print(f"\n{'='*60}")
        print("🏁 比赛最终报告")
        print(f"{'='*60}")
        print(f"最终比分:{self.game.get_score_text()}")
        print(f"比赛状态:{self.game.status.value}")
        print(f"共记录得分事件:{len(self.game.events_log)} 次")
        # 分析比分变化轨迹
        if len(self.history) > 0:
            scores = [h['score'] for h in self.history]
            print(f"\n比分变化轨迹:")
            for i, snapshot in enumerate(self.history[-5:], 1):
                print(f"  第{i}次快照:{snapshot['score']} ({snapshot['time'].strftime('%H:%M:%S')})")
# 使用示例
if __name__ == "__main__":
    tracker = RealTimeScoreTracker("湖人", "勇士")
    tracker.run_live_simulation(duration_seconds=30)  # 模拟30秒比赛时间

比分当然还会改写! 这个案例展示了:

  1. 实时数据流:像真实比赛一样,比分持续变化
  2. 事件驱动:进球、犯规、暂停等事件推动数据更新
  3. 状态管理:从开始到结束的完整比赛流程
  4. 历史记录:保存比分变化轨迹
  5. 真实模拟:包含NBA规则(节次、时间、加时等)

在实际应用中(如体育数据API、金融行情、物联网数据),你只需要将 simulate_scoring() 替换为真实的数据源接收即可,比分追踪的核心在于实时性历史趋势分析,这正是数据科学的核心价值所在!

抱歉,评论功能暂时关闭!