本文目录导读:

我来帮你创建一个统计篮球关门防守(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()
使用说明
-
基础版本:适合快速统计,主要功能包括:
- 记录每次防守
- 计算成功率
- 按球员统计
-
高级版本:增加更多功能:
- 支持不同防守方式
- 生成JSON格式报告
- 生成统计图表
- 记录进攻球员数据
如何运行
# 保存文件为 closeout_defense.py python closeout_defense.py
这个程序可以帮助统计关门防守的成功次数、成功率,以及分析不同球员和防守方式的效果,你可以根据实际需要调整代码中的记录方式和统计维度。