本文目录导读:

我来创建一个Python案例,统计足球比赛中球员使用假动作晃过防守球员的次数。
基础版本:简单统计
class FakeMoveTracker:
def __init__(self):
# 初始化统计字典
self.fake_moves = {
'body_feint': 0, # 身体虚晃
'step_over': 0, # 踩单车
'cryuff_turn': 0, # 克鲁伊夫转身
'roulette': 0, # 马赛回旋
'rainbow': 0, # 彩虹过人
'elastico': 0, # 弹球过人
}
self.total_success = 0 # 总成功次数
self.total_attempts = 0 # 总尝试次数
def record_attempt(self, move_type, success=True):
"""
记录一次假动作尝试
Args:
move_type: 假动作类型
success: 是否成功晃过防守
"""
self.total_attempts += 1
if success:
self.fake_moves[move_type] += 1
self.total_success += 1
print(f"记录到{move_type}: {'成功' if success else '失败'}")
def get_statistics(self):
"""返回统计结果"""
stats = {
'总尝试次数': self.total_attempts,
'成功晃过次数': self.total_success,
'成功率': f"{(self.total_success / self.total_attempts * 100):.1f}%" if self.total_attempts > 0 else "0%",
'各动作详情': self.fake_moves
}
return stats
# 使用示例
tracker = FakeMoveTracker()
tracker.record_attempt('body_feint', True)
tracker.record_attempt('step_over', True)
tracker.record_attempt('cryuff_turn', False)
tracker.record_attempt('roulette', True)
tracker.record_attempt('elastico', True)
print("\n=== 统计数据 ===")
stats = tracker.get_statistics()
for key, value in stats.items():
print(f"{key}: {value}")
进阶版本:包含球员和比赛信息
from datetime import datetime
import json
class AdvancedFakeMoveTracker:
def __init__(self, player_name, match_date=None):
self.player_name = player_name
self.match_date = match_date or datetime.now().strftime("%Y-%m-%d")
self.events = [] # 存储所有事件
self.skill_types = {
'左右变向': 0,
'背后扣球': 0,
'踩单车': 0,
'假射真扣': 0,
'人球分过': 0,
'转身过人': 0
}
def add_event(self, skill_type, opponent_name, position, success=True):
"""
添加假动作事件
Args:
skill_type: 技能类型
opponent_name: 被晃过的防守球员名字
position: 位置(如中场/禁区等)
success: 是否成功
"""
event = {
'timestamp': datetime.now().strftime("%H:%M:%S"),
'skill': skill_type,
'against': opponent_name,
'position': position,
'success': success
}
self.events.append(event)
if success:
self.skill_types[skill_type] += 1
return event
def generate_report(self):
"""生成详细报告"""
report = {
'球员': self.player_name,
'比赛日期': self.match_date,
'总尝试': len(self.events),
'成功次数': sum(1 for e in self.events if e['success']),
'失败次数': sum(1 for e in self.events if not e['success']),
'成功率': f"{(sum(1 for e in self.events if e['success']) / len(self.events) * 100):.1f}%" if self.events else "0%",
'技能统计': self.skill_types,
'被晃过的球员': self.get_victims_list()
}
return report
def get_victims_list(self):
"""获取被晃过的球员列表"""
victims = {}
for event in self.events:
if event['success']:
name = event['against']
if name in victims:
victims[name] += 1
else:
victims[name] = 1
return victims
def save_to_file(self, filename=None):
"""保存数据到文件"""
if not filename:
filename = f"{self.player_name}_statistics.json"
report = self.generate_report()
with open(filename, 'w', encoding='utf-8') as f:
json.dump(report, f, ensure_ascii=False, indent=2)
print(f"数据已保存到 {filename}")
# 使用示例
tracker = AdvancedFakeMoveTracker("C罗", "2024-01-15")
# 添加事件
tracker.add_event('踩单车', '后卫1', '中场', True)
tracker.add_event('左右变向', '后卫2', '禁区', True)
tracker.add_event('假射真扣', '中卫', '边路', True)
tracker.add_event('踩单车', '后卫1', '中场', False) # 这次失败了
tracker.add_event('转身过人', '门将', '禁区', True)
# 生成报告
report = tracker.generate_report()
print("\n=== 高级统计报告 ===")
for key, value in report.items():
print(f"{key}: {value}")
# 保存到文件
tracker.save_to_file()
可视化版本:实时追踪
import matplotlib.pyplot as plt
import numpy as np
class VisualFakeMoveTracker:
def __init__(self):
self.minutes = [] # 记录比赛时间(分钟)
self.success_moves = [] # 存储成功假动作
self.failed_moves = [] # 存储失败假动作
self.best_moves = [] # 精彩动作
def record_move(self, minute, skill_type, success=True, is_highlight=False):
"""记录假动作"""
self.minutes.append(minute)
move = (minute, skill_type)
if success:
self.success_moves.append(move)
else:
self.failed_moves.append(move)
if is_highlight and success:
self.best_moves.append(move)
def visualize_statistics(self):
"""可视化统计数据"""
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 时间线分布
ax1 = axes[0, 0]
minutes = list(range(1, 91))
success_counts = [sum(1 for m in self.success_moves if m[0] == min) for min in minutes]
failed_counts = [sum(1 for m in self.failed_moves if m[0] == min) for min in minutes]
ax1.bar(minutes, success_counts, label='成功', alpha=0.7)
ax1.bar(minutes, failed_counts, label='失败', alpha=0.7, bottom=success_counts)
ax1.set_title('比赛时间线分布')
ax1.set_xlabel('比赛分钟')
ax1.set_ylabel('次数')
ax1.legend()
# 2. 技能类型统计
ax2 = axes[0, 1]
skill_names = []
success_count = []
failed_count = []
all_skills = list(set([m[1] for m in self.success_moves + self.failed_moves]))
for skill in all_skills:
skill_names.append(skill)
success_count.append(sum(1 for m in self.success_moves if m[1] == skill))
failed_count.append(sum(1 for m in self.failed_moves if m[1] == skill))
x_pos = np.arange(len(skill_names))
width = 0.35
ax2.bar(x_pos - width/2, success_count, width, label='成功', alpha=0.7)
ax2.bar(x_pos + width/2, failed_count, width, label='失败', alpha=0.7)
ax2.set_title('技能类型统计')
ax2.set_xticks(x_pos)
ax2.set_xticklabels(skill_names)
ax2.legend()
# 3. 成功率饼图
ax3 = axes[1, 0]
total_success = len(self.success_moves)
total_failed = len(self.failed_moves)
ax3.pie([total_success, total_failed], labels=['成功', '失败'],
autopct='%1.1f%%', colors=['lightgreen', 'lightcoral'])
ax3.set_title('成功率分布')
# 4. 精彩动作
ax4 = axes[1, 1]
if self.best_moves:
best_skills = [m[1] for m in self.best_moves]
skill_set = list(set(best_skills))
counts = [best_skills.count(s) for s in skill_set]
ax4.bar(skill_set, counts, color='gold')
ax4.set_title('精彩动作统计')
ax4.set_xlabel('技巧类型')
ax4.set_ylabel('次数')
else:
ax4.text(0.5, 0.5, '暂无精彩动作', ha='center')
ax4.set_title('精彩动作统计')
plt.tight_layout()
plt.show()
# 使用示例
visual_tracker = VisualFakeMoveTracker()
# 模拟比赛数据
skills = ['踩单车', '变向', '转身', '人球分过']
for minute in range(1, 91, 5): # 每5分钟记录一次
if np.random.random() > 0.6: # 40%概率有动作
is_success = np.random.random() > 0.3 # 70%成功率
skill = np.random.choice(skills)
visual_tracker.record_move(minute, skill, is_success,
is_highlight=success := np.random.random() > 0.8)
# 显示统计
visual_tracker.visualize_statistics()
实战模拟版本
import random
from collections import defaultdict
class MatchSimulator:
def __init__(self, player_name):
self.player_name = player_name
self.stats = defaultdict(lambda: {'attempts': 0, 'success': 0})
self.total_attacks = 0
self.total_defenders_fooled = 0
def simulate_match(self, minutes=90):
"""
模拟一场比赛
"""
match_log = []
for minute in range(1, minutes + 1):
# 每1-3分钟可能有一次进攻机会
if random.random() < 0.2: # 20%概率有进攻
self.total_attacks += 1
attack = self.simulate_attack(minute)
match_log.append(attack)
return match_log
def simulate_attack(self, minute):
"""
模拟一次进攻
"""
# 随机选择假动作类型
move_types = [
'身体虚晃', '变向过人', '踩单车',
'假射真扣', '转身过人', '人球分过'
]
move_type = random.choice(move_types)
# 计算成功率(基础成功率70%,随机浮动)
success_rate = 0.7 + random.uniform(-0.2, 0.2)
success = random.random() < success_rate
# 更新统计
attempt_info = {
'minute': minute,
'move': move_type,
'attempts': 1,
'success': success
}
self.stats[move_type]['attempts'] += 1
if success:
self.stats[move_type]['success'] += 1
self.total_defenders_fooled += 1
# 可能一次进攻连续晃过多人
extra_defenders = random.randint(0, 2)
for i in range(extra_defenders):
self.total_defenders_fooled += 1
return attempt_info
def get_detailed_statistics(self):
"""
获取详细统计
"""
report = {
'球员': self.player_name,
'总进攻次数': self.total_attacks,
'总晃过防守次数': self.total_defenders_fooled,
'平均每次进攻晃过': f"{(self.total_defenders_fooled / self.total_attacks):.2f}" if self.total_attacks > 0 else "0",
'技能明细': {}
}
for skill, data in self.stats.items():
success_rate = (data['success'] / data['attempts'] * 100) if data['attempts'] > 0 else 0
report['技能明细'][skill] = {
'尝试': data['attempts'],
'成功': data['success'],
'成功率': f"{success_rate:.1f}%"
}
# 找到最佳技能
if self.stats:
best_skill = max(self.stats.items(),
key=lambda x: x[1]['success']/x[1]['attempts'] if x[1]['attempts'] > 0 else 0)
report['最有威胁技能'] = best_skill[0]
return report
# 使用示例
simulator = MatchSimulator("梅西")
match_data = simulator.simulate_match(90)
print("比赛模拟完成!")
print("\n=== 实战统计 ===")
report = simulator.get_detailed_statistics()
for key, value in report.items():
if key != '技能明细':
print(f"{key}: {value}")
print("\n技能明细:")
for skill, data in report['技能明细'].items():
print(f" {skill}: {data}")
print(f"\n结论: {report['球员']}在本场比赛中总共晃过了 {report['总晃过防守次数']} 次防守球员!")
使用说明
- 基础版本:适合简单的统计需求
- 进阶版本:包含详细的比赛信息、可保存数据
- 可视化版本:生成图表展示数据
- 实战模拟版本:模拟整场比赛,自动生成数据
你可以根据实际需求选择使用的版本,或者根据这些代码进行修改和扩展!