java案例统计撞墙式配合完成了几次?

wen java案例 1

Java案例:统计"撞墙式配合"完成次数

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

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秒 保证配合的连贯性

可扩展优化建议

  1. 数据来源:可将 PassEvent 从 Opta、StatsBomb 等比赛事件数据(JSON/CSV)中解析
  2. 增加空间判定:用球员坐标计算是否形成"越过防守球员"的空间突破
  3. 防守干扰因素:加入对手压迫数据,筛选真正有效的撞墙
  4. 统计维度:按球员对、按球队、按比赛时段分组统计
  5. 可视化:结合球场坐标绘制配合路线图

如果需要从真实比赛JSON数据读取或增加坐标/防守判定,可以继续告诉我,我来扩展这个案例。

友情链接

欧易欧易欧易欧易欧易欧易欧易欧易直播帮篮球控NBA帮比赛虎聊足球

友情链接

欧易欧易欧易欧易欧易欧易欧易欧易

上一篇java案例对这次补射机会有何预判?

下一篇当前分类已是最新一篇

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

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝