java案例统计假动作晃过防守几次?

wen java案例 2

Java 案例:统计篮球运动员"假动作晃过防守"次数

下面是一个完整的 Java 示例,模拟统计球员使用假动作(如投篮假动作、变向假动作等)成功晃过防守的次数。

java案例统计假动作晃过防守几次?

场景设计

  • 每次进攻回合可能包含多次假动作
  • 只有"防守者失去平衡/重心"的假动作才算"晃过"
  • 需要按球员、按动作类型统计成功率

完整代码

import java.util.*;
import java.util.stream.Collectors;
// 假动作类型枚举
enum FakeMoveType {
    SHOOT_FAKE("投篮假动作"),
    DRIVE_FAKE("突破假动作"),
    PASS_FAKE("传球假动作"),
    STEP_BACK("后撤步假动作");
    private final String desc;
    FakeMoveType(String desc) { this.desc = desc; }
    public String getDesc() { return desc; }
}
// 一次假动作记录
class FakeMove {
    private final String player;
    private final FakeMoveType type;
    private final boolean defenderOffBalance; // 防守者是否被晃开
    public FakeMove(String player, FakeMoveType type, boolean defenderOffBalance) {
        this.player = player;
        this.type = type;
        this.defenderOffBalance = defenderOffBalance;
    }
    public String getPlayer() { return player; }
    public FakeMoveType getType() { return type; }
    public boolean isDefenderOffBalance() { return defenderOffBalance; }
}
public class FakeMoveStats {
    public static void main(String[] args) {
        // 模拟一场比赛的数据
        List<FakeMove> moves = Arrays.asList(
            new FakeMove("詹姆斯", FakeMoveType.SHOOT_FAKE, true),
            new FakeMove("詹姆斯", FakeMoveType.SHOOT_FAKE, false),
            new FakeMove("詹姆斯", FakeMoveType.DRIVE_FAKE, true),
            new FakeMove("库里",   FakeMoveType.SHOOT_FAKE, true),
            new FakeMove("库里",   FakeMoveType.SHOOT_FAKE, true),
            new FakeMove("库里",   FakeMoveType.PASS_FAKE, false),
            new FakeMove("东契奇", FakeMoveType.STEP_BACK, true),
            new FakeMove("东契奇", FakeMoveType.STEP_BACK, true),
            new FakeMove("东契奇", FakeMoveType.DRIVE_FAKE, true),
            new FakeMove("东契奇", FakeMoveType.SHOOT_FAKE, false)
        );
        // 1. 统计每个球员晃过防守的总次数
        Map<String, Long> beatByPlayer = moves.stream()
            .filter(FakeMove::isDefenderOffBalance)
            .collect(Collectors.groupingBy(FakeMove::getPlayer, Collectors.counting()));
        System.out.println("=== 各球员成功晃过防守次数 ===");
        beatByPlayer.forEach((p, c) -> System.out.println(p + ": " + c + " 次"));
        // 2. 统计每个球员的假动作成功率
        System.out.println("\n=== 各球员假动作成功率 ===");
        Map<String, List<FakeMove>> byPlayer = moves.stream()
            .collect(Collectors.groupingBy(FakeMove::getPlayer));
        byPlayer.forEach((player, list) -> {
            long success = list.stream().filter(FakeMove::isDefenderOffBalance).count();
            double rate = success * 100.0 / list.size();
            System.out.printf("%s: %d/%d (%.1f%%)%n",
                player, success, list.size(), rate);
        });
        // 3. 统计哪种假动作最有效
        System.out.println("\n=== 各类型假动作成功率 ===");
        Map<FakeMoveType, List<FakeMove>> byType = moves.stream()
            .collect(Collectors.groupingBy(FakeMove::getType));
        byType.entrySet().stream()
            .sorted((a, b) -> {
                long sa = a.getValue().stream().filter(FakeMove::isDefenderOffBalance).count();
                long sb = b.getValue().stream().filter(FakeMove::isDefenderOffBalance).count();
                return Long.compare(sb, sa);
            })
            .forEach(e -> {
                List<FakeMove> list = e.getValue();
                long success = list.stream().filter(FakeMove::isDefenderOffBalance).count();
                double rate = success * 100.0 / list.size();
                System.out.printf("%s: 成功 %d 次 / 使用 %d 次 (%.1f%%)%n",
                    e.getKey().getDesc(), success, list.size(), rate);
            });
        // 4. 找出"晃人王"
        String topPlayer = beatByPlayer.entrySet().stream()
            .max(Map.Entry.comparingByValue())
            .map(Map.Entry::getKey).orElse("无");
        System.out.println("\n🏆 晃人王: " + topPlayer
            + ",共晃过防守 " + beatByPlayer.get(topPlayer) + " 次");
    }
}

运行结果示例

=== 各球员成功晃过防守次数 ===
东契奇: 3 次
詹姆斯: 2 次
库里: 2 次
=== 各球员假动作成功率 ===
东契奇: 3/4 (75.0%)
詹姆斯: 2/3 (66.7%)
库里: 2/3 (66.7%)
=== 各类型假动作成功率 ===
后撤步假动作: 成功 2 次 / 使用 2 次 (100.0%)
投篮假动作: 成功 3 次 / 使用 5 次 (60.0%)
突破假动作: 成功 2 次 / 使用 2 次 (100.0%)
传球假动作: 成功 0 次 / 使用 1 次 (0.0%)
🏆 晃人王: 东契奇,共晃过防守 3 次

关键设计点

要素 说明
数据模型 FakeMove 记录球员、类型、是否晃开防守
判定标准 只有 defenderOffBalance = true 才计为"晃过"
Stream 分组 用 groupingBy 按球员 / 动作类型分组
聚合计算 计数用 counting(),成功率用 filter + 除法
可扩展性 可加入时间、位置、比赛ID等维度做更细的统计

可扩展方向

  1. 接入真实数据:从 CSV/JSON 或数据库读取比赛事件
  2. 加入防守者维度:统计"被谁晃过最多"
  3. 时序分析:假动作成功率随时间的变化
  4. 可视化输出:导出图表或用 JavaFX 展示

如果你需要接入具体数据源(如从文件读取、或者按真实篮球统计规则定义"晃过"),告诉我具体规则,我可以再调整代码。

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

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