Java案例:统计"撞墙式配合"完成次数
"撞墙式配合"(One-Two / 二过一配合)是足球战术术语,指两名球员通过传球-回传-再传球的方式突破防守,下面给出一个完整的Java案例来统计这种配合完成的次数。

需求分析
需要识别一次"撞墙式配合"的完整过程:
- 球员A 传球给 球员B(第一脚传球)
- 球员B 不做停留,直接回传给 球员A(撞墙回传)
- 球员A 接球后继续推进(完成配合)
完整代码实现
import java.util.ArrayList;
import java.util.List;
/**
* 传球事件
*/
class PassEvent {
private String fromPlayer; // 传球者
private String toPlayer; // 接球者
private long timestamp; // 时间戳(毫秒)
private boolean isOneTouch; // 是否一脚出球(不停球)
public PassEvent(String fromPlayer, String toPlayer, long timestamp, boolean isOneTouch) {
this.fromPlayer = fromPlayer;
this.toPlayer = toPlayer;
this.timestamp = timestamp;
this.isOneTouch = isOneTouch;
}
public String getFromPlayer() { return fromPlayer; }
public String getToPlayer() { return toPlayer; }
public long getTimestamp() { return timestamp; }
public boolean isOneTouch() { return isOneTouch; }
@Override
public String toString() {
return fromPlayer + " -> " + toPlayer + " (" + timestamp + "ms)";
}
}
/**
* 撞墙式配合统计器
*/
class WallPassCounter {
// 两次传球之间的最大时间间隔(毫秒),超过则不算连续配合
private static final long MAX_INTERVAL_MS = 3000;
/**
* 统计撞墙式配合完成次数
* 判定规则:
* 1. A -> B 传球
* 2. B 一脚出球回传 A(isOneTouch = true),且间隔 <= 3秒
* 3. A 接球后再次传出(第三脚),完成突破
*/
public int countWallPasses(List<PassEvent> events) {
int count = 0;
int i = 0;
int n = events.size();
while (i < n - 2) {
PassEvent p1 = events.get(i);
PassEvent p2 = events.get(i + 1);
PassEvent p3 = events.get(i + 2);
// 条件1:第一脚 A -> B
boolean step1 = p1.getFromPlayer().equals(p3.getFromPlayer())
|| !p1.getFromPlayer().equals(p1.getToPlayer());
// 条件2:第二脚是 B 一脚回传给 A(撞墙)
boolean step2 = p2.getFromPlayer().equals(p1.getToPlayer())
&& p2.getToPlayer().equals(p1.getFromPlayer())
&& p2.isOneTouch();
// 条件3:时间连续性
boolean timeOk = (p2.getTimestamp() - p1.getTimestamp()) <= MAX_INTERVAL_MS
&& (p3.getTimestamp() - p2.getTimestamp()) <= MAX_INTERVAL_MS;
// 条件4:第三脚必须是 A 再次出球,形成推进
boolean step3 = p3.getFromPlayer().equals(p1.getFromPlayer())
&& !p3.getToPlayer().equals(p2.getFromPlayer());
if (step1 && step2 && step3 && timeOk) {
count++;
System.out.println("✅ 检测到撞墙配合 #" + count + ": "
+ p1 + " | " + p2 + " | " + p3);
i += 3; // 跳过已匹配的三脚传球
} else {
i++;
}
}
return count;
}
}
/**
* 主程序:模拟比赛传球数据
*/
public class WallPassDemo {
public static void main(String[] args) {
List<PassEvent> events = new ArrayList<>();
// 场景1:经典撞墙配合(梅西 -> 苏亚雷斯 -> 梅西 -> 推进)—— 应计数1次
events.add(new PassEvent("梅西", "苏亚雷斯", 1000, false)); // 第一脚
events.add(new PassEvent("苏亚雷斯","梅西", 1800, true)); // 撞墙回传
events.add(new PassEvent("梅西", "内马尔", 2500, false)); // 推进
// 场景2:普通传球(不算撞墙,第二脚不是一脚出球)—— 不应计数
events.add(new PassEvent("布斯克茨","佩德里", 4000, false));
events.add(new PassEvent("佩德里", "布斯克茨", 5200, false)); // 停球后回传
events.add(new PassEvent("布斯克茨","德容", 6000, false));
// 场景3:撞墙配合(阿尔巴 -> 内马尔 -> 阿尔巴 -> 传中)—— 应计数1次
events.add(new PassEvent("阿尔巴", "内马尔", 8000, false));
events.add(new PassEvent("内马尔", "阿尔巴", 8500, true));
events.add(new PassEvent("阿尔巴", "莱万", 9200, false));
// 场景4:时间超时(间隔太久,不算撞墙)—— 不应计数
events.add(new PassEvent("德容", "加维", 10000, false));
events.add(new PassEvent("加维", "德容", 20000, true)); // 间隔10秒
events.add(new PassEvent("德容", "法蒂", 21000, false));
// 场景5:撞墙配合(拉菲尼亚 -> 亚马尔 -> 拉菲尼亚 -> 射门)—— 应计数1次
events.add(new PassEvent("拉菲尼亚","亚马尔", 30000, false));
events.add(new PassEvent("亚马尔", "拉菲尼亚", 30500, true));
events.add(new PassEvent("拉菲尼亚","球门", 31200, false));
WallPassCounter counter = new WallPassCounter();
int total = counter.countWallPasses(events);
System.out.println("\n📊 撞墙式配合共完成次数:" + total);
}
}
运行结果
✅ 检测到撞墙配合 #1: 梅西 -> 苏亚雷斯 (1000ms) | 苏亚雷斯 -> 梅西 (1800ms) | 梅西 -> 内马尔 (2500ms)
✅ 检测到撞墙配合 #2: 阿尔巴 -> 内马尔 (8000ms) | 内马尔 -> 阿尔巴 (8500ms) | 阿尔巴 -> 莱万 (9200ms)
✅ 检测到撞墙配合 #3: 拉菲尼亚 -> 亚马尔 (30000ms) | 亚马尔 -> 拉菲尼亚 (30500ms) | 拉菲尼亚 -> 球门 (31200ms)
📊 撞墙式配合共完成次数:3
核心判定逻辑说明
| 步骤 | 判定条件 | 说明 |
|---|---|---|
| ① 第一脚 | A → B | 发起传球 |
| ② 第二脚 | B → A 且 isOneTouch=true |
撞墙回传,必须一脚出球 |
| ③ 第三脚 | A → C(C≠B) | 完成突破后的推进传球 |
| ④ 时间 | 相邻间隔 ≤ 3秒 | 保证配合的连贯性 |
可扩展优化建议
- 数据来源:可将
PassEvent从 Opta、StatsBomb 等比赛事件数据(JSON/CSV)中解析 - 增加空间判定:用球员坐标计算是否形成"越过防守球员"的空间突破
- 防守干扰因素:加入对手压迫数据,筛选真正有效的撞墙
- 统计维度:按球员对、按球队、按比赛时段分组统计
- 可视化:结合球场坐标绘制配合路线图
如果需要从真实比赛JSON数据读取或增加坐标/防守判定,可以继续告诉我,我来扩展这个案例。
版权声明:本站文章为原创整理,转载请注明出处。