Python案例统计关门防守成功几次?

wen python案例 1

本文目录导读:

Python案例统计关门防守成功几次?

  1. 实现方案
  2. 运行结果示例
  3. 主要功能特点

我来帮你实现一个统计关门防守(close-out defense)成功次数的Python案例。

实现方案

class CloseOutDefense:
    """关门防守统计类"""
    def __init__(self):
        self.defense_records = []  # 防守记录
        self.success_count = 0     # 成功次数
        self.total_count = 0       # 总次数
    def record_defense(self, player_name, is_success, details=""):
        """记录一次关门防守
        Args:
            player_name: 防守球员姓名
            is_success: 是否成功
            details: 防守细节说明
        """
        record = {
            'player': player_name,
            'success': is_success,
            'details': details,
            'timestamp': len(self.defense_records) + 1  # 序号
        }
        self.defense_records.append(record)
        self.total_count += 1
        if is_success:
            self.success_count += 1
    def get_stats(self):
        """获取统计数据"""
        success_rate = (self.success_count / self.total_count * 100) if self.total_count > 0 else 0
        return {
            'total_defenses': self.total_count,
            'success_count': self.success_count,
            'fail_count': self.total_count - self.success_count,
            'success_rate': f"{success_rate:.1f}%"
        }
    def get_player_stats(self, player_name):
        """获取特定球员的防守统计"""
        player_records = [r for r in self.defense_records if r['player'] == player_name]
        total = len(player_records)
        success = sum(1 for r in player_records if r['success'])
        if total > 0:
            return {
                'player': player_name,
                'total': total,
                'success': success,
                'fail': total - success,
                'rate': f"{(success/total*100):.1f}%"
            }
        return None
    def show_all_records(self):
        """显示所有防守记录"""
        print("=" * 50)
        print("        关门防守记录统计")
        print("=" * 50)
        for i, record in enumerate(self.defense_records, 1):
            status = "✓ 成功" if record['success'] else "✗ 失败"
            print(f"#{i:2d} | 球员: {record['player']:6s} | {status} | {record['details']}")
        print("=" * 50)
        stats = self.get_stats()
        print(f"总防守次数: {stats['total_defenses']}")
        print(f"成功次数: {stats['success_count']}")
        print(f"失败次数: {stats['fail_count']}")
        print(f"成功率: {stats['success_rate']}")
        print("=" * 50)
# 测试案例 - 模拟篮球比赛数据
def simulate_basketball_game():
    """模拟一场篮球比赛中的关门防守数据"""
    defense_tracker = CloseOutDefense()
    # 模拟多个防守回合
    scenarios = [
        # (球员, 是否成功, 描述)
        ("张伟", True, "成功迫使对手传球失误"),
        ("李强", True, "逼迫对手仓促出手不中"),
        ("王明", False, "被对手突破得分"),
        ("赵华", True, "成功干扰三分投篮"),
        ("张伟", True, "造成对手进攻犯规"),
        ("李强", False, "被对手造犯规"),
        ("王明", True, "成功封盖投篮"),
        ("赵华", True, "迫使对手24秒违例"),
        ("张伟", False, "被对手假动作晃过"),
        ("李强", True, "成功抢断传球"),
        ("王明", True, "逼迫对手传失误球"),
        ("赵华", False, "对手命中高难度投篮"),
        ("张伟", True, "成功预判突破路线"),
        ("李强", True, "迫使对手停球"),
        ("王明", False, "被对手传球助攻"),
    ]
    for player, success, detail in scenarios:
        defense_tracker.record_defense(player, success, detail)
    return defense_tracker
# 高级版 - 支持更多功能
class AdvancedCloseOutDefense(CloseOutDefense):
    """增强版关门防守统计"""
    def __init__(self):
        super().__init__()
        self.player_stats = {}  # 球员详细统计
        self.time_periods = []  # 时间阶段统计
    def record_defense_with_time(self, player, is_success, quarter, minute, details=""):
        """带时间记录的防守"""
        record = {
            'player': player,
            'success': is_success,
            'quarter': quarter,
            'minute': minute,
            'details': details,
            'timestamp': len(self.defense_records) + 1
        }
        self.defense_records.append(record)
        self.total_count += 1
        # 更新球员统计
        if player not in self.player_stats:
            self.player_stats[player] = {'total': 0, 'success': 0}
        self.player_stats[player]['total'] += 1
        if is_success:
            self.success_count += 1
            self.player_stats[player]['success'] += 1
    def analyze_by_quarter(self):
        """按节次分析防守效果"""
        quarter_stats = {}
        for record in self.defense_records:
            q = record['quarter']
            if q not in quarter_stats:
                quarter_stats[q] = {'total': 0, 'success': 0}
            quarter_stats[q]['total'] += 1
            if record['success']:
                quarter_stats[q]['success'] += 1
        print("\n=== 各节次关门防守分析 ===")
        for q, stats in quarter_stats.items():
            rate = (stats['success'] / stats['total'] * 100) if stats['total'] > 0 else 0
            print(f"第{q}节: 总共{stats['total']}次, 成功{stats['success']}次, 成功率{rate:.1f}%")
    def get_hot_streak(self, player=None):
        """获取连续成功防守记录"""
        records = self.defense_records if not player else \
                  [r for r in self.defense_records if r['player'] == player]
        max_streak = 0
        current_streak = 0
        for record in records:
            if record['success']:
                current_streak += 1
                max_streak = max(max_streak, current_streak)
            else:
                current_streak = 0
        return max_streak
# 主程序
if __name__ == "__main__":
    print("=== 基本版关门防守统计 ===")
    game_stats = simulate_basketball_game()
    game_stats.show_all_records()
    # 查看特定球员统计
    print("\n=== 张伟个人统计 ===")
    zhang_stats = game_stats.get_player_stats("张伟")
    if zhang_stats:
        for key, value in zhang_stats.items():
            print(f"{key}: {value}")
    # 使用高级版
    print("\n\n=== 高级版关门防守统计 ===")
    advanced = AdvancedCloseOutDefense()
    # 模拟更多带时间的数据
    game_data = [
        # (球员, 成功, 节次, 分钟, 描述)
        ("张伟", True, 1, 3, "成功干扰投篮"),
        ("李强", False, 1, 5, "被突破"),
        ("王明", True, 1, 8, "造成对手失误"),
        ("张伟", True, 2, 2, "迫使传球失误"),
        ("李强", True, 2, 6, "成功封盖"),
        ("王明", False, 2, 9, "对手三分命中"),
        ("张伟", True, 3, 1, "抢断成功"),
        ("李强", True, 3, 4, "逼迫走步违例"),
    ]
    for data in game_data:
        advanced.record_defense_with_time(*data)
    # 显示结果
    advanced.show_all_records()
    advanced.analyze_by_quarter()
    print(f"\n张伟最长连续成功防守: {advanced.get_hot_streak('张伟')}次")

运行结果示例

=== 基本版关门防守统计 ===
==================================================
        关门防守记录统计
==================================================
# 1 | 球员: 张伟   | ✓ 成功 | 成功迫使对手传球失误
# 2 | 球员: 李强   | ✓ 成功 | 逼迫对手仓促出手不中
# 3 | 球员: 王明   | ✗ 失败 | 被对手突破得分
... (省略中间数据)
#15 | 球员: 王明   | ✗ 失败 | 被对手传球助攻
==================================================
总防守次数: 15
成功次数: 10
失败次数: 5
成功率: 66.7%
==================================================
=== 张伟个人统计 ===
player: 张伟
total: 4
success: 3
fail: 1
rate: 75.0%

主要功能特点

  1. 基础统计:记录总次数、成功/失败次数、成功率
  2. 个人统计:查看特定球员的防守数据
  3. 详细记录:保存每次防守的具体情况
  4. 高级分析:按节次、时间段分析防守效果
  5. 连胜统计:计算连续成功防守的次数

这个案例可以应用在篮球比赛分析、训练评估等场景中。

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