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

wen python案例 2

本文目录导读:

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

  1. 基础版本
  2. 进阶版本(包含更多功能)
  3. 使用说明
  4. 如何运行

我来帮你创建一个统计篮球关门防守(Closeout)成功次数的Python程序,关门防守是指防守球员快速冲向持球进攻球员,阻止其投篮或突破的防守动作。

基础版本

class CloseoutDefense:
    def __init__(self):
        self.attempts = 0          # 总防守次数
        self.successful = 0        # 成功次数
        self.failed = 0            # 失败次数
        self.details = []          # 详细记录
    def record_defense(self, defender_name, offender_name, result, quarter, minute):
        """
        记录一次关门防守
        :param defender_name: 防守球员姓名
        :param offender_name: 进攻球员姓名
        :param result: 'success' 成功, 'fail' 失败
        :param quarter: 第几节
        :param minute: 比赛时间(分钟)
        """
        self.attempts += 1
        if result == 'success':
            self.successful += 1
        else:
            self.failed += 1
        record = {
            'defender': defender_name,
            'offender': offender_name,
            'result': result,
            'quarter': quarter,
            'minute': minute,
            'attempt_num': self.attempts
        }
        self.details.append(record)
    def get_success_rate(self):
        """计算成功率"""
        if self.attempts == 0:
            return 0
        return (self.successful / self.attempts) * 100
    def get_player_stats(self, player_name):
        """获取特定球员的防守统计"""
        player_attempts = 0
        player_success = 0
        for record in self.details:
            if record['defender'] == player_name:
                player_attempts += 1
                if record['result'] == 'success':
                    player_success += 1
        if player_attempts == 0:
            return 0, 0, 0  # 尝试次数, 成功次数, 成功率
        return player_attempts, player_success, (player_success/player_attempts)*100
    def print_summary(self):
        """打印统计摘要"""
        print("=" * 50)
        print("关门防守统计报告")
        print("=" * 50)
        print(f"总防守次数: {self.attempts}")
        print(f"成功次数: {self.successful}")
        print(f"失败次数: {self.failed}")
        print(f"成功率: {self.get_success_rate():.1f}%")
        print("=" * 50)
    def print_player_stats(self):
        """打印各球员统计"""
        players = set(record['defender'] for record in self.details)
        print("\n球员个人统计:")
        print("-" * 50)
        for player in players:
            attempts, success, rate = self.get_player_stats(player)
            print(f"{player}: 防守{attempts}次, 成功{success}次, 成功率{rate:.1f}%")
# 使用示例
def main():
    # 创建统计对象
    defense = CloseoutDefense()
    # 模拟记录几次防守数据
    # 参数: 防守球员, 进攻球员, 结果, 节数, 分钟
    defense.record_defense("王明", "李强", 'success', 1, 5)
    defense.record_defense("王明", "张伟", 'success', 1, 8)
    defense.record_defense("刘洋", "李强", 'fail', 1, 12)
    defense.record_defense("王明", "赵磊", 'success', 2, 3)
    defense.record_defense("刘洋", "张伟", 'success', 2, 6)
    defense.record_defense("王明", "李强", 'fail', 2, 9)
    defense.record_defense("陈杰", "赵磊", 'success', 3, 2)
    defense.record_defense("刘洋", "李强", 'success', 3, 5)
    defense.record_defense("王明", "张伟", 'success', 4, 1)
    defense.record_defense("陈杰", "赵磊", 'fail', 4, 4)
    # 打印统计报告
    defense.print_summary()
    defense.print_player_stats()
    # 显示详细记录
    print("\n详细防守记录:")
    print("-" * 50)
    for record in defense.details:
        result_text = "成功" if record['result'] == 'success' else "失败"
        print(f"第{record['attempt_num']}次: {record['defender']}防守{record['offender']} "
              f"- {result_text} (第{record['quarter']}节 {record['minute']}分钟)")
if __name__ == "__main__":
    main()

进阶版本(包含更多功能)

import pandas as pd
import matplotlib.pyplot as plt
from datetime import datetime
import json
class AdvancedCloseoutDefense(CloseoutDefense):
    def __init__(self, game_id=None):
        super().__init__()
        self.game_id = game_id or datetime.now().strftime("%Y%m%d_%H%M%S")
        self.defense_types = {}  # 防守方式统计
        self.offensive_players = {}  # 进攻球员统计
    def record_defense(self, defender_name, offender_name, result, quarter, minute, 
                      defense_type='standard', notes=''):
        """
        高级版本记录防守
        defense_type: 'standard'(标准), 'aggressive'(侵略性), 'conservative'(保守)
        """
        super().record_defense(defender_name, offender_name, result, quarter, minute)
        # 记录防守方式
        if defense_type not in self.defense_types:
            self.defense_types[defense_type] = {'attempts': 0, 'success': 0}
        self.defense_types[defense_type]['attempts'] += 1
        if result == 'success':
            self.defense_types[defense_type]['success'] += 1
        # 记录进攻球员
        if offender_name not in self.offensive_players:
            self.offensive_players[offender_name] = {'attempts': 0, 'success': 0}
        self.offensive_players[offender_name]['attempts'] += 1
        if result == 'success':
            self.offensive_players[offender_name]['success'] += 1
        # 在详细记录中添加更多信息
        if self.details:
            self.details[-1].update({
                'defense_type': defense_type,
                'notes': notes
            })
    def get_offensive_player_stats(self, player_name):
        """获取被防守球员的数据"""
        if player_name in self.offensive_players:
            stats = self.offensive_players[player_name]
            return stats['attempts'], stats['success']
        return 0, 0
    def get_defense_type_stats(self):
        """获取不同防守方式的统计"""
        stats = {}
        for def_type, data in self.defense_types.items():
            rate = (data['success']/data['attempts']*100) if data['attempts'] > 0 else 0
            stats[def_type] = {
                'attempts': data['attempts'],
                'success': data['success'],
                'success_rate': rate
            }
        return stats
    def generate_report(self, filename=None):
        """生成详细的报告"""
        if not filename:
            filename = f"closeout_report_{self.game_id}.json"
        report = {
            'game_id': self.game_id,
            'summary': {
                'total_attempts': self.attempts,
                'successful': self.successful,
                'failed': self.failed,
                'success_rate': self.get_success_rate()
            },
            'details': self.details,
            'defense_types': self.get_defense_type_stats(),
            'offensive_stats': self.offensive_players
        }
        with open(filename, 'w', encoding='utf-8') as f:
            json.dump(report, f, ensure_ascii=False, indent=2)
        return filename
    def plot_statistics(self):
        """绘制统计图表"""
        # 球员成功率对比
        players = set(record['defender'] for record in self.details)
        player_data = {}
        for player in players:
            attempts, success, rate = self.get_player_stats(player)
            player_data[player] = rate
        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
        # 第一张图:球员成功率
        ax1.bar(player_data.keys(), player_data.values())
        ax1.set_title('球员关门防守成功率')
        ax1.set_xlabel('防守球员')
        ax1.set_ylabel('成功率 (%)')
        ax1.set_ylim(0, 100)
        # 第二张图:防守方式统计
        def_stats = self.get_defense_type_stats()
        def_types = list(def_stats.keys())
        def_rates = [def_stats[t]['success_rate'] for t in def_types]
        ax2.bar(def_types, def_rates)
        ax2.set_title('不同防守方式成功率')
        ax2.set_xlabel('防守方式')
        ax2.set_ylabel('成功率 (%)')
        ax2.set_ylim(0, 100)
        plt.tight_layout()
        plt.savefig(f'closeout_stats_{self.game_id}.png')
        plt.show()
        return f'closeout_stats_{self.game_id}.png'
# 使用示例
def advanced_example():
    # 创建高级统计对象
    defense = AdvancedCloseoutDefense(game_id="20240115_001")
    # 模拟更详细的数据
    defense.record_defense("王明", "李强", 'success', 1, 3, 'aggressive', "抢断成功")
    defense.record_defense("王明", "张伟", 'success', 1, 6, 'standard', "干扰投篮")
    defense.record_defense("刘洋", "李强", 'fail', 1, 10, 'conservative', "被突破")
    defense.record_defense("王明", "赵磊", 'success', 2, 2, 'standard', "造成失误")
    defense.record_defense("刘洋", "张伟", 'success', 2, 5, 'aggressive', "封盖")
    defense.record_defense("王明", "李强", 'fail', 2, 8, 'standard', "犯规")
    defense.record_defense("陈杰", "赵磊", 'success', 3, 1, 'standard', "干扰投篮")
    # 打印统计
    defense.print_summary()
    defense.print_player_stats()
    # 打印进攻球员统计
    print("\n进攻球员被防守情况:")
    for player in defense.offensive_players:
        attempts, success = defense.get_offensive_player_stats(player)
        rate = (success/attempts*100) if attempts > 0 else 0
        print(f"{player}: 被防守{attempts}次, 成功破坏{success}次, 效率{rate:.1f}%")
    # 生成报告
    report_file = defense.generate_report()
    print(f"\n报告已生成: {report_file}")
    # 绘制图表(如果安装了matplotlib)
    try:
        chart_file = defense.plot_statistics()
        print(f"统计图表已生成: {chart_file}")
    except ImportError:
        print("未安装matplotlib,跳过图表生成")
if __name__ == "__main__":
    choice = input("选择版本 (1-基础版, 2-高级版): ")
    if choice == '2':
        advanced_example()
    else:
        main()

使用说明

  1. 基础版本:适合快速统计,主要功能包括:

    • 记录每次防守
    • 计算成功率
    • 按球员统计
  2. 高级版本:增加更多功能:

    • 支持不同防守方式
    • 生成JSON格式报告
    • 生成统计图表
    • 记录进攻球员数据

如何运行

# 保存文件为 closeout_defense.py
python closeout_defense.py

这个程序可以帮助统计关门防守的成功次数、成功率,以及分析不同球员和防守方式的效果,你可以根据实际需要调整代码中的记录方式和统计维度。

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