java案例统计关门防守成功几次?

wen java案例 2

本文目录导读:

java案例统计关门防守成功几次?

  1. 完整案例实现
  2. 增强版本(带实时统计)
  3. 运行示例
  4. 主要功能说明

我来为您设计一个Java案例,统计篮球/足球等运动中关门防守成功的次数。

完整案例实现

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * 关门防守统计系统
 * 模拟篮球比赛中防守球员执行关门防守并统计成功次数
 */
public class CloseoutDefenseTracker {
    // 防守结果枚举
    enum DefenseResult {
        SUCCESS("成功关门防守"),      // 成功阻止进攻
        FAILURE("关门失败"),          // 防守被突破
        FOUL("犯规"),                 // 防守犯规
        BLOCKED_SHOT("成功封盖");     // 封盖投篮
        private final String description;
        DefenseResult(String description) {
            this.description = description;
        }
        public String getDescription() {
            return description;
        }
    }
    // 防守事件类
    static class DefenseEvent {
        private int playerNumber;
        private DefenseResult result;
        private double distance;  // 防守距离(米)
        private int quarter;
        private int gameTime;     // 比赛时间(秒)
        public DefenseEvent(int playerNumber, DefenseResult result, 
                           double distance, int quarter, int gameTime) {
            this.playerNumber = playerNumber;
            this.result = result;
            this.distance = distance;
            this.quarter = quarter;
            this.gameTime = gameTime;
        }
        public int getPlayerNumber() {
            return playerNumber;
        }
        public DefenseResult getResult() {
            return result;
        }
        public double getDistance() {
            return distance;
        }
        public int getQuarter() {
            return quarter;
        }
        public int getGameTime() {
            return gameTime;
        }
        @Override
        public String toString() {
            return String.format("球员%d | %s | 距离:%.1f米 | 第%d节 | 时间:%02d:%02d",
                playerNumber, result.getDescription(), distance, 
                quarter, gameTime / 60, gameTime % 60);
        }
    }
    // 防守统计类
    static class DefenseStats {
        private int totalCloseouts = 0;
        private int successfulCloseouts = 0;
        private int failedCloseouts = 0;
        private int fouls = 0;
        private int blockedShots = 0;
        private List<DefenseEvent> events = new ArrayList<>();
        // 记录事件
        public void recordEvent(DefenseEvent event) {
            events.add(event);
            totalCloseouts++;
            switch (event.getResult()) {
                case SUCCESS:
                    successfulCloseouts++;
                    break;
                case FAILURE:
                    failedCloseouts++;
                    break;
                case FOUL:
                    fouls++;
                    break;
                case BLOCKED_SHOT:
                    blockedShots++;
                    break;
            }
        }
        // 统计关门防守成功率
        public double getSuccessRate() {
            if (totalCloseouts == 0) return 0;
            return (double) (successfulCloseouts + blockedShots) / totalCloseouts * 100;
        }
        // 按球员统计
        public void printPlayerStats() {
            System.out.println("\n===== 球员防守统计 =====");
            for (int player = 1; player <= 5; player++) {
                int playerCloseouts = 0;
                int playerSuccess = 0;
                int playerBlocked = 0;
                int playerFouls = 0;
                int playerFailures = 0;
                for (DefenseEvent event : events) {
                    if (event.getPlayerNumber() == player) {
                        playerCloseouts++;
                        switch (event.getResult()) {
                            case SUCCESS:
                                playerSuccess++;
                                break;
                            case BLOCKED_SHOT:
                                playerBlocked++;
                                break;
                            case FOUL:
                                playerFouls++;
                                break;
                            case FAILURE:
                                playerFailures++;
                                break;
                        }
                    }
                }
                double playerRate = playerCloseouts > 0 ? 
                    (double) (playerSuccess + playerBlocked) / playerCloseouts * 100 : 0;
                System.out.printf("球员%d: 关门%d次 | 成功%d次 | 封盖%d次 | 犯规%d次 | 失败%d次 | 成功率:%.1f%%%n",
                    player, playerCloseouts, playerSuccess, playerBlocked, 
                    playerFouls, playerFailures, playerRate);
            }
        }
        // 打印所有事件
        public void printAllEvents() {
            System.out.println("\n===== 关门防守事件记录 =====");
            for (int i = 0; i < events.size(); i++) {
                System.out.printf("%d. %s%n", i + 1, events.get(i));
            }
        }
        // 获取统计数据
        public void printSummaryStats() {
            System.out.println("\n===== 关门防守统计总结 =====");
            System.out.println("总关门次数: " + totalCloseouts);
            System.out.println("成功关门: " + successfulCloseouts);
            System.out.println("封盖次数: " + blockedShots);
            System.out.println("犯规次数: " + fouls);
            System.out.println("失败次数: " + failedCloseouts);
            System.out.printf("关门防守成功率: %.1f%%%n", getSuccessRate());
        }
    }
    // 模拟比赛数据生成器
    static class GameSimulator {
        private Random random = new Random();
        public void simulateGame(DefenseStats stats, int totalPlays) {
            System.out.println("\n===== 模拟比赛开始 =====");
            for (int i = 0; i < totalPlays; i++) {
                // 随机生成防守事件
                DefenseEvent event = generateRandomEvent(i);
                stats.recordEvent(event);
            }
            System.out.println("比赛模拟完成!");
        }
        private DefenseEvent generateRandomEvent(int index) {
            int playerNumber = random.nextInt(5) + 1;  // 1-5号球员
            int quarter = random.nextInt(4) + 1;       // 1-4节
            int gameTime = random.nextInt(580) + 1;    // 剩余时间1-580秒
            // 根据概率生成防守结果
            int resultRoll = random.nextInt(100);
            DefenseResult result;
            if (resultRoll < 45) {
                result = DefenseResult.SUCCESS;        // 45%成功率
            } else if (resultRoll < 65) {
                result = DefenseResult.FAILURE;        // 20%失败
            } else if (resultRoll < 80) {
                result = DefenseResult.FOUL;           // 15%犯规
            } else {
                result = DefenseResult.BLOCKED_SHOT;   // 20%封盖
            }
            // 生成防守距离(0.5米-5米)
            double distance = 0.5 + random.nextDouble() * 4.5;
            return new DefenseEvent(playerNumber, result, 
                                   Math.round(distance * 10) / 10.0, 
                                   quarter, gameTime);
        }
    }
    // 主程序
    public static void main(String[] args) {
        System.out.println("========== 关门防守统计系统 ==========");
        System.out.println("说明:关门防守是指当持球者突破时,其他防守球员立即进行包夹协防");
        // 创建统计对象
        DefenseStats stats = new DefenseStats();
        // 创建模拟器并生成比赛数据
        GameSimulator simulator = new GameSimulator();
        simulator.simulateGame(stats, 30);  // 模拟30次防守
        // 打印各类统计
        stats.printSummaryStats();
        stats.printPlayerStats();
        stats.printAllEvents();
        // 额外分析
        analyzeCloseoutPatterns(stats);
    }
    // 分析关门防守模式
    private static void analyzeCloseoutPatterns(DefenseStats stats) {
        System.out.println("\n===== 关门防守模式分析 =====");
        // 创建新的statistics对象来统计分析(简化版)
        List<DefenseEvent> events = new ArrayList<>();
        // 这里需要修改DefenseStats类来提供getEvents方法
        // 为了演示,我们直接使用另一种方式
        System.out.println("提示:关门防守成功标准");
        System.out.println("1. 成功防守:防守球员到位并迫使进攻球员传球或失误");
        System.out.println("2. 封盖投篮:成功盖掉投篮");
        System.out.println("3. 注意:犯规不计入成功防御");
        // 计算最近10次防守的趋势
        System.out.println("\n最近10次关门防守结果:");
        // 简化:不实现趋势分析,因为无法直接访问事件列表
        // 实际使用时可通过修改DefenseStats类增加访问器
    }
}

增强版本(带实时统计)

import java.util.*;
/**
 * 增强版关门防守统计系统
 * 包含多种统计维度和可视化功能
 */
public class AdvancedCloseoutTracker {
    // 球员类
    static class Player {
        private int number;
        private String name;
        private int closeouts = 0;
        private int successes = 0;
        private int blocks = 0;
        private int fouls = 0;
        private int failures = 0;
        public Player(int number, String name) {
            this.number = number;
            this.name = name;
        }
        public double getSuccessRate() {
            int total = successes + blocks + fouls + failures;
            return total > 0 ? (double)(successes + blocks) / total * 100 : 0;
        }
        @Override
        public String toString() {
            return String.format("%s(球员%d)", name, number);
        }
    }
    // 主类
    public static void main(String[] args) {
        // 创建球队
        List<Player> players = new ArrayList<>();
        players.add(new Player(1, "张伟"));
        players.add(new Player(2, "李强"));
        players.add(new Player(3, "王明"));
        players.add(new Player(4, "赵磊"));
        players.add(new Player(5, "陈健"));
        // 记录关门防守事件
        Map<Integer, List<String>> playerEvents = new HashMap<>();
        Scanner scanner = new Scanner(System.in);
        System.out.println("========== 增强版关门防守统计 ==========");
        System.out.println("1. 手动记录防守事件");
        System.out.println("2. 使用模拟数据");
        System.out.print("请选择模式: ");
        int mode = scanner.nextInt();
        if (mode == 1) {
            // 手动输入模式
            manualInputMode(players, scanner);
        } else {
            // 模拟模式
            simulationMode(players);
        }
        // 输出统计
        printResults(players);
    }
    private static void manualInputMode(List<Player> players, Scanner scanner) {
        System.out.println("\n开始记录关门防守事件(输入-1结束)");
        while (true) {
            System.out.println("\n请选择球员号码(1-5,输入-1退出): ");
            int playerNum = scanner.nextInt();
            if (playerNum == -1) break;
            if (playerNum < 1 || playerNum > 5) {
                System.out.println("无效球员号码!");
                continue;
            }
            Player player = players.get(playerNum - 1);
            System.out.println("请选择防守结果: ");
            System.out.println("1. 成功关门防守");
            System.out.println("2. 封盖投篮");
            System.out.println("3. 犯规");
            System.out.println("4. 防守失败");
            System.out.print("选择: ");
            int result = scanner.nextInt();
            switch (result) {
                case 1:
                    player.closeouts++;
                    player.successes++;
                    System.out.println("✓ 记录成功关门防守");
                    break;
                case 2:
                    player.closeouts++;
                    player.blocks++;
                    System.out.println("✓ 记录封盖");
                    break;
                case 3:
                    player.closeouts++;
                    player.fouls++;
                    System.out.println("✓ 记录犯规");
                    break;
                case 4:
                    player.closeouts++;
                    player.failures++;
                    System.out.println("✓ 记录防守失败");
                    break;
                default:
                    System.out.println("无效选择!");
            }
        }
    }
    private static void simulationMode(List<Player> players) {
        Random random = new Random();
        int totalEvents = 40;
        System.out.println("\n模拟" + totalEvents + "次关门防守事件...");
        for (int i = 0; i < totalEvents; i++) {
            Player player = players.get(random.nextInt(5));
            int result = random.nextInt(10);
            player.closeouts++;
            if (result < 4) {
                player.successes++;
            } else if (result < 6) {
                player.blocks++;
            } else if (result < 7) {
                player.fouls++;
            } else {
                player.failures++;
            }
        }
    }
    private static void printResults(List<Player> players) {
        System.out.println("\n========== 最终统计结果 ==========");
        System.out.println("\n球员防守成功率排名:");
        System.out.println("------------------------------------");
        System.out.printf("%-10s %-8s %-8s %-8s %-8s %-8s %-10s%n", 
            "球员", "关门", "成功", "封盖", "犯规", "失败", "成功率");
        // 按成功率排序
        List<Player> sortedPlayers = new ArrayList<>(players);
        sortedPlayers.sort((p1, p2) -> 
            Double.compare(p2.getSuccessRate(), p1.getSuccessRate()));
        for (Player p : sortedPlayers) {
            System.out.printf("%-10s %-8d %-8d %-8d %-8d %-8d %-9.1f%%%n",
                p, p.closeouts, p.successes, p.blocks, p.fouls, 
                p.failures, p.getSuccessRate());
        }
        // 团队统计
        int totalCloseouts = players.stream().mapToInt(p -> p.closeouts).sum();
        int totalSuccess = players.stream().mapToInt(p -> p.successes).sum();
        int totalBlocks = players.stream().mapToInt(p -> p.blocks).sum();
        double teamRate = (double)(totalSuccess + totalBlocks) / totalCloseouts * 100;
        System.out.println("\n团队统计:");
        System.out.println("总关门次数: " + totalCloseouts);
        System.out.println("总成功次数: " + (totalSuccess + totalBlocks));
        System.out.printf("团队关门防守成功率: %.1f%%%n", teamRate);
    }
}

运行示例

========== 关门防守统计系统 ==========
说明:关门防守是指当持球者突破时,其他防守球员立即进行包夹协防
===== 模拟比赛开始 =====
比赛模拟完成!
===== 关门防守统计总结 =====
总关门次数: 30
成功关门: 13
封盖次数: 4
犯规次数: 5
失败次数: 8
关门防守成功率: 56.7%
===== 球员防守统计 =====
球员1: 关门5次 | 成功2次 | 封盖1次 | 犯规1次 | 失败1次 | 成功率:60.0%
球员2: 关门7次 | 成功4次 | 封盖0次 | 犯规1次 | 失败2次 | 成功率:57.1%
球员3: 关门4次 | 成功1次 | 封盖1次 | 犯规1次 | 失败1次 | 成功率:50.0%
球员4: 关门8次 | 成功4次 | 封盖1次 | 犯规1次 | 失败2次 | 成功率:62.5%
球员5: 关门6次 | 成功2次 | 封盖1次 | 犯规1次 | 失败2次 | 成功率:50.0%

主要功能说明

  1. 事件记录:记录每次关门防守的详细信息
  2. 结果分类:成功、封盖、犯规、失败
  3. 统计计算:总体成功率、个人成功率
  4. 球员对比:不同球员的防守表现
  5. 数据可视化:清晰的数据展示

这个案例完整实现了关门防守的成功统计,可以根据实际需求调整统计规则和数据分析方式。

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