本文目录导读:

我来给你设计一个统计撞墙式配合次数的Python案例,撞墙式配合通常是指球员A传球给球员B,球员B立即回传(一脚传球)给球员A,然后再传给其他人。
基础版本:跟踪球权转移
class WallPassCounter:
"""统计撞墙式配合(二过一)次数"""
def __init__(self):
self.events = [] # 所有传球事件
self.wall_passes = [] # 撞墙式配合记录
self.current_ball_holder = None # 当前持球队员
def record_pass(self, passer, receiver, time):
"""
记录一次传球
:param passer: 传球队员
:param receiver: 接球队员
:param time: 传球时间
"""
event = {
'passer': passer,
'receiver': receiver,
'time': time,
'is_wall_pass': False
}
# 检查是否是撞墙式配合
if self.events and len(self.events) >= 1:
last_event = self.events[-1]
# 条件:上次接球者现在是传球者,上次传球者现在是接球者
if (last_event['receiver'] == passer and
last_event['passer'] == receiver):
# 标记这次传球为撞墙式配合
event['is_wall_pass'] = True
self.wall_passes.append({
'first_pass': last_event,
'second_pass': event,
'players': (passer, receiver)
})
self.events.append(event)
self.current_ball_holder = receiver
def get_total_wall_passes(self):
"""获取撞墙式配合总数"""
return len(self.wall_passes)
def get_wall_pass_details(self):
"""获取所有撞墙式配合详情"""
return self.wall_passes
def print_summary(self):
"""打印统计摘要"""
print(f"撞墙式配合次数: {len(self.wall_passes)}")
for i, wp in enumerate(self.wall_passes, 1):
print(f"第{i}次: 队员{wp['players'][0]} → 队员{wp['players'][1]} → "
f"队员{wp['players'][0]}")
# 使用示例
def simulate_match():
"""模拟一场比赛的传球序列"""
counter = WallPassCounter()
# 模拟传球序列: (传球者, 接球者, 时间)
passes = [
('A', 'B', 1.0),
('B', 'C', 1.5), # A-B-C 不是撞墙式
('C', 'D', 2.0),
('D', 'E', 2.5),
('E', 'D', 3.0), # D-E-D 是撞墙式配合
('D', 'F', 3.5),
('F', 'A', 4.0),
('A', 'C', 4.5),
('C', 'A', 5.0), # A-C-A 是撞墙式配合
('A', 'B', 5.5),
('B', 'X', 6.0),
]
# 记录所有传球
for passer, receiver, time in passes:
counter.record_pass(passer, receiver, time)
return counter
# 运行模拟
if __name__ == "__main__":
counter = simulate_match()
counter.print_summary()
print("\n详细记录:")
for i, wp in enumerate(counter.get_wall_pass_details(), 1):
print(f"配合{i}: 队员{wp['first_pass']['passer']}→{wp['first_pass']['receiver']}"
f" 在第{wp['first_pass']['time']}秒")
print(f" 回传 队员{wp['second_pass']['passer']}→{wp['second_pass']['receiver']}"
f" 在第{wp['second_pass']['time']}秒")
进阶版本:更多功能
import json
from datetime import datetime
from collections import defaultdict
class AdvancedWallPassCounter(WallPassCounter):
"""增强版撞墙式配合统计器"""
def __init__(self):
super().__init__()
self.pair_stats = defaultdict(int) # 统计特定组合的配合次数
def record_pass(self, passer, receiver, time):
"""重写:增加额外统计"""
super().record_pass(passer, receiver, time)
# 检查最后一对事件是否形成撞墙式
if len(self.events) >= 2:
if self.events[-1]['is_wall_pass']:
pair_key = tuple(sorted([passer, receiver]))
self.pair_stats[pair_key] += 1
def get_pair_statistics(self):
"""获取双人组合的撞墙式配合统计"""
result = {}
for (player1, player2), count in self.pair_stats.items():
result[f"{player1}-{player2}"] = count
return result
def analyze_wall_pass_quality(self):
"""分析撞墙式配合的质量"""
if not self.wall_passes:
return "没有撞墙式配合"
analysis = {
'total': len(self.wall_passes),
'unique_pairs': len(self.pair_stats),
'best_pair': max(self.pair_stats.items(),
key=lambda x: x[1]) if self.pair_stats else None,
'average_interval': self._calculate_avg_interval()
}
return analysis
def _calculate_avg_interval(self):
"""计算撞墙式配合的平均时间间隔"""
intervals = []
for i in range(1, len(self.wall_passes)):
time1 = self.wall_passes[i-1]['second_pass']['time']
time2 = self.wall_passes[i]['first_pass']['time']
intervals.append(time2 - time1)
return sum(intervals)/len(intervals) if intervals else 0
# 更复杂的使用场景
def analyze_team_match():
"""分析团队比赛数据"""
# 从文件读取真实比赛数据(模拟)
match_data = [
{"passer": "10号", "receiver": "7号", "time": 23.5},
{"passer": "7号", "receiver": "10号", "time": 23.8},
{"passer": "10号", "receiver": "9号", "time": 24.2},
{"passer": "9号", "receiver": "11号", "time": 25.0},
{"passer": "11号", "receiver": "8号", "time": 25.3},
{"passer": "8号", "receiver": "11号", "time": 25.6},
{"passer": "11号", "receiver": "9号", "time": 25.9},
{"passer": "5号", "receiver": "7号", "time": 30.1},
{"passer": "7号", "receiver": "5号", "time": 30.4},
{"passer": "5号", "receiver": "10号", "time": 30.7},
{"passer": "10号", "receiver": "7号", "time": 31.0},
{"passer": "7号", "receiver": "10号", "time": 31.3},
]
counter = AdvancedWallPassCounter()
# 记录所有传球
for event in match_data:
counter.record_pass(
event['passer'],
event['receiver'],
event['time']
)
# 输出详细分析
print("=== 撞墙式配合分析报告 ===")
counter.print_summary()
print("\n=== 最佳组合 ===")
pair_stats = counter.get_pair_statistics()
for pair, count in sorted(pair_stats.items(), key=lambda x: x[1], reverse=True):
print(f"{pair}: {count}次")
print("\n=== 质量分析 ===")
quality = counter.analyze_wall_pass_quality()
for key, value in quality.items():
print(f"{key}: {value}")
# 运行高级分析
if __name__ == "__main__":
analyze_team_match()
可视化版本
import matplotlib.pyplot as plt
def visualize_wall_passes(counter):
"""可视化撞墙式配合"""
if not counter.wall_passes:
print("没有数据可展示")
return
# 准备数据
pass_times = []
pass_pairs = []
for wp in counter.wall_passes:
first_time = wp['first_pass']['time']
second_time = wp['second_pass']['time']
pass_times.append((first_time, second_time))
pairs = f"{wp['first_pass']['passer']}→{wp['first_pass']['receiver']}→" \
f"{wp['second_pass']['passer']}"
pass_pairs.append(pairs)
# 创建图表
fig, ax = plt.subplots(figsize=(10, 6))
y_pos = range(len(pass_pairs))
# 绘制水平和垂直线段表示撞墙式
for i, (start, end) in enumerate(pass_times):
ax.plot([start, end], [i, i], 'bo-', linewidth=2, markersize=8)
ax.text((start+end)/2, i, f'({start:.1f}-{end:.1f}s)',
ha='center', va='bottom')
ax.set_yticks(y_pos)
ax.set_yticklabels(pass_pairs)
ax.set_xlabel('时间 (秒)')
ax.set_title('撞墙式配合时间分布图')
plt.tight_layout()
plt.show()
# 使用可视化
if __name__ == "__main__":
counter = simulate_match()
visualize_wall_passes(counter)
这些代码提供了:
- 基础版:最简单的撞墙式配合计数
- 进阶版:增加组合统计和质量分析
- 可视化版:图形化展示配合发生的时间和球员
可以根据实际需求选择使用哪个版本,或将它们组合使用。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播