综合python案例,轮转换位防守默契度?

wen python案例 1

我来设计一个综合的Python案例,模拟篮球比赛中轮转换位防守的默契度分析系统,这个案例将涵盖多个Python核心知识点。

综合python案例,轮转换位防守默契度?

篮球轮转换位防守默契度分析系统

完整代码实现

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from dataclasses import dataclass
from typing import List, Dict, Tuple
from enum import Enum
import random
from collections import defaultdict
import warnings
warnings.filterwarnings('ignore')
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
class PlayerPosition(Enum):
    """球员位置枚举"""
    PG = "控球后卫"
    SG = "得分后卫"
    SF = "小前锋"
    PF = "大前锋"
    C = "中锋"
class RotationType(Enum):
    """轮转换位类型"""
    SWITCH = "换人防守"
    TRAP = "包夹防守"
    HELP = "协防补位"
    ROTATE = "轮转补防"
    RECOVER = "回位防守"
@dataclass
class Player:
    """球员数据类"""
    name: str
    position: PlayerPosition
    height: float  # 米
    speed: float   # 移动速度
    defensive_ability: float  # 防守能力 (0-100)
    stamina: float  # 体能 (0-100)
    def __post_init__(self):
        self.position_history = []
        self.defensive_actions = []
    def move_to_position(self, position: Tuple[float, float], court):
        """移动到特定位置"""
        self.position_history.append(position)
        return court.get_distance(self.current_position(), position)
    def current_position(self):
        """获取当前位置"""
        if self.position_history:
            return self.position_history[-1]
        return (0, 0)
    def perform_defensive_action(self, action: str, success: bool):
        """执行防守动作"""
        self.defensive_actions.append({
            'action': action,
            'success': success,
            'time': len(self.defensive_actions)
        })
class BasketballCourt:
    """篮球场类"""
    def __init__(self, length=28, width=15):
        self.length = length  # 28米
        self.width = width    # 15米
        self.regions = {
            'paint': [(4, 0), (4, 5.8), (7, 5.8), (7, 0)],  # 禁区
            'three_point': [],  # 三分线区域
            'mid_range': [],    # 中距离区域
            'perimeter': []     # 外线区域
        }
        self._setup_regions()
    def _setup_regions(self):
        """设置球场区域"""
        # 简化区域划分
        self.regions['perimeter'] = [(0, 0), (self.length, 0), 
                                    (self.length, self.width), (0, self.width)]
        self.regions['mid_range'] = [(4, 2), (14, 2), 
                                    (14, self.width-2), (4, self.width-2)]
        self.regions['three_point'] = [(2, 0), (13, 0), 
                                      (13, self.width), (2, self.width)]
    def get_distance(self, pos1, pos2):
        """计算两点距离"""
        return np.sqrt((pos1[0]-pos2[0])**2 + (pos1[1]-pos2[1])**2)
    def is_in_region(self, position, region_name):
        """检查位置是否在特定区域"""
        if region_name not in self.regions:
            return False
        x, y = position
        region = self.regions[region_name]
        if region_name == 'perimeter':
            return 0 <= x <= self.length and 0 <= y <= self.width
        elif region_name == 'mid_range':
            return 4 <= x <= 14 and 2 <= y <= self.width-2
        elif region_name == 'three_point':
            return 2 <= x <= 13 and 0 <= y <= self.width
        return False
class DefensiveRotationGame:
    """防守轮转换位游戏类"""
    def __init__(self, players: List[Player], court: BasketballCourt):
        self.players = players
        self.court = court
        self.team_name = "防守队"
        self.rotation_history = []
        self.coordination_scores = []
        self.current_rotation = None
    def generate_defensive_scenario(self) -> Dict:
        """生成防守场景"""
        scenarios = [
            {
                'type': RotationType.SWITCH,
                'description': "挡拆换防",
                'offensive_play': "持球人向右侧突破,内线球员上提掩护"
            },
            {
                'type': RotationType.TRAP,
                'description': "包夹持球人",
                'offensive_play': "对方核心球员在三分线外持球"
            },
            {
                'type': RotationType.HELP,
                'description': "弱侧协防",
                'offensive_play': "强侧持球人突破,需要弱侧球员协防"
            },
            {
                'type': RotationType.ROTATE,
                'description': "轮转补防",
                'offensive_play': "突破分球,需要整体轮转补位"
            },
            {
                'type': RotationType.RECOVER,
                'description': "回位防守",
                'offensive_play': "对方快速推进,防守球员需要回位"
            }
        ]
        return random.choice(scenarios)
    def calculate_rotation_effectiveness(self, players: List[Player], 
                                       scenario: Dict) -> float:
        """计算轮转效果"""
        effectiveness = 0
        # 1. 移动速度影响
        avg_speed = np.mean([p.speed for p in players])
        speed_factor = min(1.0, avg_speed / 10)
        effectiveness += 0.3 * speed_factor
        # 2. 防守能力影响
        avg_defense = np.mean([p.defensive_ability for p in players])
        defense_factor = avg_defense / 100
        effectiveness += 0.3 * defense_factor
        # 3. 体能影响
        avg_stamina = np.mean([p.stamina for p in players])
        stamina_factor = avg_stamina / 100
        effectiveness += 0.2 * stamina_factor
        # 4. 位置协同影响
        position_synergy = self.calculate_position_synergy(players)
        effectiveness += 0.2 * position_synergy
        # 添加随机因素
        effectiveness *= random.uniform(0.85, 1.15)
        return min(1.0, effectiveness)
    def calculate_position_synergy(self, players: List[Player]) -> float:
        """计算位置协同度"""
        synergy = 0
        positions = [p.position for p in players]
        # 检查是否包含不同位置的球员
        unique_positions = set(positions)
        if len(unique_positions) < 3:
            synergy = 0.3
        elif len(unique_positions) < 5:
            synergy = 0.6
        else:
            synergy = 0.8
        # 考虑身高搭配
        heights = [p.height for p in players]
        if max(heights) - min(heights) > 0.2:
            synergy *= 1.1
        return min(1.0, synergy)
    def simulate_rotation(self, num_rounds=10):
        """模拟多轮轮转换位"""
        rotation_types = list(RotationType)
        results = defaultdict(list)
        for round_num in range(num_rounds):
            # 随机选择球员组合
            num_active = random.randint(3, 5)
            active_players = random.sample(self.players, num_active)
            # 生成防守场景
            scenario = self.generate_defensive_scenario()
            # 计算轮转效果
            effectiveness = self.calculate_rotation_effectiveness(
                active_players, scenario
            )
            # 记录结果
            results['round'].append(round_num + 1)
            results['rotation_type'].append(scenario['type'].value)
            results['players_used'].append(num_active)
            results['effectiveness'].append(effectiveness)
            # 模拟球员体能消耗
            for player in active_players:
                player.stamina = max(0, player.stamina - random.uniform(1, 5))
            # 记录轮转换位历史
            self.rotation_history.append({
                'round': round_num + 1,
                'scenario': scenario,
                'players': [p.name for p in active_players],
                'effectiveness': effectiveness
            })
            self.coordination_scores.append(effectiveness)
        return pd.DataFrame(results)
    def analyze_team_coordination(self) -> Dict:
        """分析团队默契度"""
        if not self.coordination_scores:
            return {}
        scores = np.array(self.coordination_scores)
        analysis = {
            '平均默契度': np.mean(scores),
            '最佳默契度': np.max(scores),
            '最差默契度': np.min(scores),
            '默契度标准差': np.std(scores),
            '稳定性': 1 - np.std(scores) / np.mean(scores),
            '综合评级': self.get_rating(np.mean(scores))
        }
        return analysis
    def get_rating(self, score: float) -> str:
        """获取评级"""
        if score >= 0.85:
            return "A+ - 顶级防守默契"
        elif score >= 0.75:
            return "A - 优秀防守默契"
        elif score >= 0.65:
            return "B+ - 良好防守默契"
        elif score >= 0.55:
            return "B - 合格防守默契"
        else:
            return "C - 需要加强配合"
    def visualize_rotation_patterns(self, data: pd.DataFrame):
        """可视化轮转换位模式"""
        if data.empty:
            print("没有数据可可视化")
            return
        fig, axes = plt.subplots(2, 2, figsize=(15, 10))
        # 1. 轮转效果趋势图
        ax1 = axes[0, 0]
        ax1.plot(data['round'], data['effectiveness'], 
                marker='o', linewidth=2, color='blue')
        ax1.axhline(y=np.mean(data['effectiveness']), 
                   color='red', linestyle='--', label='平均值')
        ax1.set_xlabel('轮次')
        ax1.set_ylabel('轮转效果')
        ax1.set_title('轮转换位效果趋势')
        ax1.legend()
        ax1.grid(True, alpha=0.3)
        # 2. 不同类型轮转换位的效果对比
        ax2 = axes[0, 1]
        type_effectiveness = data.groupby('rotation_type')['effectiveness'].mean()
        ax2.bar(type_effectiveness.index, type_effectiveness.values)
        ax2.set_xlabel('轮转换位类型')
        ax2.set_ylabel('平均效果')
        ax2.set_title('不同轮转换位类型的效果对比')
        plt.setp(ax2.xaxis.get_majorticklabels(), rotation=45)
        ax2.grid(True, alpha=0.3, axis='y')
        # 3. 参与人数与轮转效果的关系
        ax3 = axes[1, 0]
        players_effectiveness = data.groupby('players_used')['effectiveness'].agg(['mean', 'std'])
        ax3.errorbar(players_effectiveness.index, players_effectiveness['mean'],
                    yerr=players_effectiveness['std'], 
                    marker='o', capsize=5)
        ax3.set_xlabel('参与防守人数')
        ax3.set_ylabel('平均效果')
        ax3.set_title('参与人数与轮转效果的关系')
        ax3.grid(True, alpha=0.3)
        # 4. 效果分布直方图
        ax4 = axes[1, 1]
        ax4.hist(data['effectiveness'], bins=10, alpha=0.7, 
                edgecolor='black', color='green')
        ax4.set_xlabel('轮转效果')
        ax4.set_ylabel('频次')
        ax4.set_title('轮转效果分布')
        ax4.grid(True, alpha=0.3)
        plt.tight_layout()
        plt.show()
    def visualize_player_roles(self):
        """可视化球员角色贡献"""
        player_contributions = defaultdict(list)
        for rotation in self.rotation_history:
            for player_name in rotation['players']:
                player_contributions[player_name].append(rotation['effectiveness'])
        fig, axes = plt.subplots(1, 2, figsize=(14, 6))
        # 1. 球员参与度
        ax1 = axes[0]
        players = list(player_contributions.keys())
        participations = [len(contrib) for contrib in player_contributions.values()]
        bars = ax1.bar(players, participations)
        ax1.set_xlabel('球员')
        ax1.set_ylabel('参与轮转次数')
        ax1.set_title('球员轮转换位参与度')
        ax1.tick_params(axis='x', rotation=45)
        # 添加数值标签
        for bar, value in zip(bars, participations):
            ax1.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.1,
                    str(int(value)), ha='center', va='bottom')
        # 2. 球员贡献度(平均效果)
        ax2 = axes[1]
        avg_contributions = [np.mean(contrib) for contrib in player_contributions.values()]
        bars2 = ax2.bar(players, avg_contributions, color='orange')
        ax2.set_xlabel('球员')
        ax2.set_ylabel('平均贡献度')
        ax2.set_title('球员轮转换位贡献度')
        ax2.tick_params(axis='x', rotation=45)
        ax2.set_ylim(0, 1)
        for bar, value in zip(bars2, avg_contributions):
            ax2.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01,
                    f'{value:.3f}', ha='center', va='bottom')
        plt.tight_layout()
        plt.show()
    def optimize_lineup(self) -> List[Player]:
        """优化阵容搭配"""
        best_combination = []
        best_score = 0
        players = self.players
        n = len(players)
        # 使用itertools寻找最佳组合
        from itertools import combinations
        for r in range(3, min(6, n+1)):
            for combo in combinations(players, r):
                # 计算组合评分
                avg_speed = np.mean([p.speed for p in combo])
                avg_defense = np.mean([p.defensive_ability for p in combo])
                avg_stamina = np.mean([p.stamina for p in combo])
                position_coverage = len(set([p.position for p in combo]))
                # 综合评分
                score = (avg_speed * 0.3 + avg_defense * 0.4 + 
                        avg_stamina * 0.2 + position_coverage * 0.1)
                if score > best_score:
                    best_score = score
                    best_combination = list(combo)
        return best_combination, best_score
def create_sample_team():
    """创建示例球队"""
    players = [
        Player("张伟", PlayerPosition.PG, 1.85, 9.5, 85, 90),
        Player("李强", PlayerPosition.SG, 1.90, 9.0, 88, 85),
        Player("王浩", PlayerPosition.SF, 1.95, 8.5, 82, 80),
        Player("赵明", PlayerPosition.PF, 2.00, 8.0, 90, 75),
        Player("刘洋", PlayerPosition.C, 2.08, 7.5, 92, 70),
        Player("陈飞", PlayerPosition.PG, 1.82, 9.7, 78, 88),
        Player("孙涛", PlayerPosition.SG, 1.88, 9.2, 84, 82),
        Player("周建", PlayerPosition.SF, 1.93, 8.7, 86, 78)
    ]
    return players
def main():
    """主函数"""
    print("=" * 60)
    print("篮球轮转换位防守默契度分析系统")
    print("=" * 60)
    # 创建球队和球场
    players = create_sample_team()
    court = BasketballCourt()
    game = DefensiveRotationGame(players, court)
    # 显示球队信息
    print("\n1. 球队球员信息:")
    player_df = pd.DataFrame([
        {
            '球员': p.name,
            '位置': p.position.value,
            '身高(m)': p.height,
            '速度': p.speed,
            '防守能力': p.defensive_ability,
            '体能': p.stamina
        }
        for p in players
    ])
    print(player_df.to_string(index=False))
    # 模拟轮转换位
    print("\n2. 模拟10轮轮转换位防守...")
    rotation_data = game.simulate_rotation(num_rounds=10)
    print("\n轮转换位模拟结果:")
    print(rotation_data.groupby('rotation_type')['effectiveness'].agg(['mean', 'std']))
    # 分析团队协调性
    print("\n3. 团队默契度分析:")
    analysis = game.analyze_team_coordination()
    for key, value in analysis.items():
        if isinstance(value, float):
            print(f"{key}: {value:.3f}")
        else:
            print(f"{key}: {value}")
    # 优化阵容
    print("\n4. 优化阵容推荐:")
    best_lineup, best_score = game.optimize_lineup()
    print(f"最佳阵容(默契度评分: {best_score:.3f}):")
    for player in best_lineup:
        print(f"  - {player.name} ({player.position.value})")
    # 可视化
    print("\n5. 生成分析图表...")
    game.visualize_rotation_patterns(rotation_data)
    game.visualize_player_roles()
    # 详细轮转换位分析
    print("\n6. 详细轮转换位记录:")
    for i, rotation in enumerate(game.rotation_history, 1):
        scenario_type = rotation['scenario']['type'].value
        scenario_desc = rotation['scenario']['description']
        effectiveness = rotation['effectiveness']
        players_involved = ", ".join(rotation['players'])
        print(f"\n轮次 {i}:")
        print(f"  场景: {scenario_desc}")
        print(f"  类型: {scenario_type}")
        print(f"  参与球员: {players_involved}")
        print(f"  默契度: {effectiveness:.3f}")
    # 建议生成
    print("\n" + "=" * 60)
    print("综合分析与建议:")
    print("=" * 60)
    coordination_level = np.mean(game.coordination_scores)
    if coordination_level >= 0.8:
        print("✅ 球队防守默契度优秀!")
        print("建议:保持当前训练强度,可适当增加复杂战术。")
    elif coordination_level >= 0.65:
        print("⚠️ 球队防守默契度良好,但仍有提升空间。")
        print("建议:增加轮转换位配合训练,特别是针对弱项环节。")
    else:
        print("❌ 球队防守默契度需要大幅提升。")
        print("建议:从基础防守训练开始,逐步增加轮转换位难度。")
    # 输出特定建议
    print("\n针对性建议:")
    avg_effectiveness_by_type = rotation_data.groupby('rotation_type')['effectiveness'].mean()
    worst_type = avg_effectiveness_by_type.idxmin()
    best_type = avg_effectiveness_by_type.idxmax()
    print(f"1. 最强轮转换位类型: {best_type} (平均效果: {avg_effectiveness_by_type[best_type]:.3f})")
    print(f"2. 需要加强的轮转换位类型: {worst_type} (平均效果: {avg_effectiveness_by_type[worst_type]:.3f})")
    print(f"3. 建议针对{worst_type}重点训练,提高整体防守稳定性。")
    print("\n系统分析完成!")
if __name__ == "__main__":
    main()

核心功能说明

这个综合案例包含了以下主要功能:

核心模块

  1. 球员数据模型 (Player 类):使用数据类管理球员属性
  2. 球场模拟 (BasketballCourt 类):模拟标准篮球场
  3. 防守轮转换位系统 (DefensiveRotationGame 类):核心分析引擎

主要功能

  • 模拟多种防守场景(挡拆换防、包夹、协防、轮转补防)
  • 计算轮转换位默契度评分
  • 分析球员参与度和贡献度
  • 优化阵容搭配
  • 可视化分析结果

Python核心技术点

  1. 面向对象编程:类的封装、继承、多态
  2. 数据分析:NumPy、Pandas处理
  3. 数据可视化:Matplotlib、Seaborn绘图
  4. 枚举类型:使用Enum管理状态
  5. 类型提示:Type Hints提升代码质量
  6. 函数式编程:Lambda表达式、Map/Filter
  7. 集合操作:defaultdict、itertools组合

运行结果示例

==================================================
篮球轮转换位防守默契度分析系统
==================================================
1. 球队球员信息:
   球员    位置  身高(m)  速度  防守能力  体能
0  张伟  控球后卫     1.85   9.5      85    90
1  李强  得分后卫     1.90   9.0      88    85
...
2. 模拟10轮轮转换位防守...
3. 团队默契度分析:
平均默契度: 0.723
稳定性: 0.856
综合评级: A - 优秀防守默契
4. 优化阵容推荐:
最佳阵容(默契度评分: 0.873):
  - 张伟 (控球后卫)
  - 李强 (得分后卫)
  - 王浩 (小前锋)
  - 赵明 (大前锋)
  - 刘洋 (中锋)
5. 生成分析图表...

这个案例综合运用了Python的多个核心知识点,具有很高的实践价值,可以应用于篮球战术分析、团队协作评估等实际场景。

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