本文目录导读:

我来为你创建一个统计"撞墙式配合"(One-Two配合)次数的Python案例。
足球比赛撞墙式配合统计器
import re
from collections import defaultdict
class OneTwoCounter:
"""统计足球比赛中的撞墙式配合(One-Two)次数"""
def __init__(self):
# 记录球员之间的配合关系
self.player_pairs = defaultdict(int)
# 记录当前连续的传球序列
self.current_sequence = []
# 记录所有配合
self.all_sequences = []
def parse_event(self, event_text):
"""
解析比赛事件文本
输入格式: "时间 事件类型 球员A -> 球员B"
事件类型: PASS(传球), SHOT(射门), GOAL(进球)
"""
# 解析文本格式
# 例: "23:45 PASS 梅西 -> 阿尔巴"
pattern = r'(\d+:\d+)\s+(\w+)\s+([^->\s]+)\s*->\s*(\w+)'
match = re.match(pattern, event_text)
if match:
time, event_type, player1, player2 = match.groups()
return {
'time': time,
'event_type': event_type,
'player1': player1,
'player2': player2
}
return None
def check_one_two(self, sequence):
"""
检查是否是撞墙式配合
撞墙式配合定义:A传给B,B立即回传A,并且至少有3次连续传球
"""
if len(sequence) < 3:
return False
# 检查连续的传球是否符合 A->B->A->B 模式
for i in range(len(sequence) - 2):
# 检查是否有回传
if (sequence[i][0] == sequence[i+2][0] and # 第三个球员 = 第一个球员
sequence[i][1] == sequence[i+1][0]): # 第二个球员接第一个球员的球
return True
return False
def analyze_sequence(self, events):
"""
分析整个比赛的事件序列
events: 比赛事件列表,按时间排序
"""
for event in events:
if event['event_type'] == 'PASS':
# 记录传球关系
relationship = (event['player1'], event['player2'])
self.player_pairs[relationship] += 1
self.current_sequence.append((event['player1'], event['player2']))
else:
# 遇到射门或进球,检查当前序列
if self.check_one_two(self.current_sequence):
self.all_sequences.append(self.current_sequence.copy())
self.current_sequence = []
# 检查最后一个序列
if self.check_one_two(self.current_sequence):
self.all_sequences.append(self.current_sequence.copy())
return len(self.all_sequences)
def get_detail_report(self):
"""生成详细统计报告"""
report = {
'total_one_two': len(self.all_sequences),
'sequences': [],
'player_pairs': dict(self.player_pairs)
}
for seq in self.all_sequences:
report['sequences'].append({
'players': [f"{p1}->{p2}" for p1, p2 in seq],
'duration': len(seq)
})
return report
# 示例数据生成器
def generate_match_data():
"""生成示例比赛数据"""
events = []
# 模拟一次梅西-阿尔巴的撞墙式配合
events.extend([
"10:00 PASS 梅西 -> 阿尔巴",
"10:05 PASS 阿尔巴 -> 梅西",
"10:08 PASS 梅西 -> 阿尔巴",
"10:10 SHOT 阿尔巴 -> 球门"
])
# 模拟一次布斯克茨-德容的撞墙式配合
events.extend([
"25:00 PASS 布斯克茨 -> 德容",
"25:04 PASS 德容 -> 布斯克茨",
"25:07 PASS 布斯克茨 -> 德容",
"25:12 GOAL 德容 -> 球门"
])
# 普通传球(不构成撞墙式配合)
events.extend([
"40:00 PASS 门将 -> 后卫",
"40:10 PASS 后卫 -> 中场",
"40:20 PASS 中场 -> 前锋",
"40:30 SHOT 前锋 -> 球门"
])
# 又一次撞墙式配合
events.extend([
"60:00 PASS 佩德里 -> 加维",
"60:03 PASS 加维 -> 佩德里",
"60:06 PASS 佩德里 -> 加维",
"60:09 PASS 加维 -> 佩德里",
"60:15 GOAL 佩德里 -> 球门"
])
return events
def main():
"""主函数"""
print("="*60)
print("足球比赛撞墙式配合统计系统")
print("="*60)
# 创建计数器实例
counter = OneTwoCounter()
# 生成比赛数据
match_events = generate_match_data()
# 解析所有事件
parsed_events = []
for event_text in match_events:
parsed_event = counter.parse_event(event_text)
if parsed_event:
parsed_events.append(parsed_event)
# 分析配合
total = counter.analyze_sequence(parsed_events)
# 输出结果
print(f"\n比赛事件总数: {len(parsed_events)}")
print(f"发现撞墙式配合次数: {total}")
# 详细报告
report = counter.get_detail_report()
print("\n" + "="*60)
print("撞墙式配合详细记录:")
print("="*60)
for i, seq in enumerate(report['sequences'], 1):
print(f"\n配合{i}:")
print(f" 传球路线: {' → '.join(seq['players'])}")
print(f" 传球次数: {seq['duration']}")
# 球员配合统计
print("\n" + "="*60)
print("球员传球组合统计:")
print("="*60)
for pair, count in sorted(report['player_pairs'].items(),
key=lambda x: x[1], reverse=True):
print(f" {pair[0]} → {pair[1]}: {count}次")
# 分析结果
print("\n" + "="*60)
print("统计分析结论:")
print("="*60)
if total == 0:
print("本场比赛没有出现撞墙式配合")
elif total <= 2:
print(f"本场比赛出现了 {total} 次撞墙式配合,属于中规中矩的表现")
else:
print(f"本场比赛出现了 {total} 次撞墙式配合,显示了出色的团队配合能力")
return total
if __name__ == "__main__":
result = main()
增强版本(支持输入自定义比赛数据)
class AdvancedOneTwoCounter(OneTwoCounter):
"""增强版撞墙式配合计数器"""
def analyze_live_events(self, events_list):
"""
实时分析比赛事件
events_list: 列表,每个元素格式为:
("PASS", "梅西", "阿尔巴") 或 ("SHOT", "梅西", "球门")
"""
for event in events_list:
event_type = event[0]
if event_type == "PASS":
player1, player2 = event[1], event[2]
self.current_sequence.append((player1, player2))
else:
if self.check_one_two(self.current_sequence):
self.all_sequences.append(self.current_sequence.copy())
self.current_sequence = []
# 检查最后一个序列
if self.check_one_two(self.current_sequence):
self.all_sequences.append(self.current_sequence.copy())
return len(self.all_sequences)
def visualize_sequences(self):
"""可视化显示配合路线"""
import matplotlib.pyplot as plt
# 创建简单的可视化
for idx, seq in enumerate(self.all_sequences[:5]): # 只显示前5个
plt.figure(figsize=(8, 4))
players = []
for p1, p2 in seq:
if p1 not in players:
players.append(p1)
if p2 not in players:
players.append(p2)
# 绘制传球路线
x_positions = list(range(len(players)))
for i, (p1, p2) in enumerate(seq):
try:
x1 = x_positions[players.index(p1)]
x2 = x_positions[players.index(p2)]
plt.annotate('', xy=(x2, 1), xytext=(x1, 1),
arrowprops=dict(arrowstyle='->', lw=2))
except ValueError:
continue
plt.yticks([])
plt.xticks(x_positions, players, rotation=45)
plt.title(f'配合{idx+1} 传球路线')
plt.tight_layout()
plt.show()
使用示例
# 使用示例
if __name__ == "__main__":
# 方法1:使用示例数据
print("=== 示例数据分析 ===")
main()
# 方法2:使用增强版实时分析
print("\n=== 增强版实时分析 ===")
adv_counter = AdvancedOneTwoCounter()
# 实时比赛事件
live_events = [
("PASS", "罗德里", "福登"),
("PASS", "福登", "罗德里"),
("PASS", "罗德里", "福登"),
("SHOT", "福登", "球门"), # 射击结束序列
("PASS", "后卫", "门将"),
("PASS", "门将", "后卫"),
("SHOT", "后卫", "球门")
]
result = adv_counter.analyze_live_events(live_events)
print(f"实时分析结果: 检测到 {result} 次撞墙式配合")
# 可视化
adv_counter.visualize_sequences()
核心功能说明
- 撞墙式配合识别:通过分析连续传球序列,识别A→B→A的回传模式
- 多维度统计:累计次数、持续时间、参与球员等多维度分析
- 实时分析:支持实时处理比赛事件流
- 可视化呈现:可视化的传球路线图(需要matplotlib)
- 详细报告:生成包含所有配合细节的统计报告
这个系统能够准确统计出示例数据中出现了3次撞墙式配合,并提供了详细的分析报告。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播