java案例统计直塞球成功率是多少?

wen java案例 1

本文目录导读:

java案例统计直塞球成功率是多少?

  1. 运行结果示例
  2. 主要功能
  3. 概率控制

我来为您编写一个统计直塞球成功率的Java案例,这个案例将模拟足球比赛中的直塞球数据并进行统计分析。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * 直塞球成功率统计系统
 */
public class ThroughBallStats {
    // 直塞球结果枚举
    enum ThroughBallResult {
        SUCCESS,    // 成功(队友接到并形成威胁)
        FAILED,     // 失败(被防守队员拦截)
        OUT_OF_BOUNDS, // 出界
        INTERCEPTED   // 被门将没收
    }
    // 球员信息
    static class Player {
        String name;
        int throughBalls;      // 直塞球总数
        int successfulBalls;   // 成功直塞球数
        int failedBalls;       // 失败直塞球数
        int outOfBoundsBalls;  // 出界次数
        int interceptedBalls;  // 被截获次数
        public Player(String name) {
            this.name = name;
        }
        public void addResult(ThroughBallResult result) {
            throughBalls++;
            switch(result) {
                case SUCCESS:
                    successfulBalls++;
                    break;
                case FAILED:
                    failedBalls++;
                    break;
                case OUT_OF_BOUNDS:
                    outOfBoundsBalls++;
                    break;
                case INTERCEPTED:
                    interceptedBalls++;
                    break;
            }
        }
        public double getSuccessRate() {
            return throughBalls == 0 ? 0 : (double) successfulBalls / throughBalls * 100;
        }
        @Override
        public String toString() {
            return String.format("%-10s | 总数: %3d | 成功: %3d | 失败: %3d | 出界: %3d | 被截: %3d | 成功率: %.1f%%", 
                name, throughBalls, successfulBalls, failedBalls, outOfBoundsBalls, interceptedBalls, getSuccessRate());
        }
    }
    // 比赛统计分析器
    static class ThroughBallAnalyzer {
        private List<Player> players = new ArrayList<>();
        private Random random = new Random();
        // 模拟一场比赛的直塞球数据
        public void simulateMatch(int matchNumber) {
            System.out.println("\n========== 第 " + matchNumber + " 场比赛 ==========");
            // 模拟10名球员的直塞球数据
            String[] playerNames = {"张三", "李四", "王五", "赵六", "孙七", "周八", "吴九", "郑十", "钱一一", "陈二二"};
            for (int i = 0; i < playerNames.length; i++) {
                Player player = new Player(playerNames[i]);
                players.add(player);
                // 随机生成5-15次直塞球尝试
                int attempts = 5 + random.nextInt(11);
                // 模拟每次直塞球结果
                for (int j = 0; j < attempts; j++) {
                    ThroughBallResult result = getRandomResult();
                    player.addResult(result);
                }
                System.out.println(player);
            }
        }
        // 随机生成直塞球结果(加入一定概率分布)
        private ThroughBallResult getRandomResult() {
            int probability = random.nextInt(100);
            // 概率分布:成功40%,失败30%,出界15%,被截获15%
            if (probability < 40) {
                return ThroughBallResult.SUCCESS;
            } else if (probability < 70) {
                return ThroughBallResult.FAILED;
            } else if (probability < 85) {
                return ThroughBallResult.OUT_OF_BOUNDS;
            } else {
                return ThroughBallResult.INTERCEPTED;
            }
        }
        // 统计所有球员的综合成功率
        public void calculateOverallStats() {
            System.out.println("\n========== 总体统计 ==========");
            int totalBalls = 0;
            int totalSuccessful = 0;
            for (Player player : players) {
                totalBalls += player.throughBalls;
                totalSuccessful += player.successfulBalls;
            }
            double overallRate = totalBalls == 0 ? 0 : (double) totalSuccessful / totalBalls * 100;
            // 显示所有球员排名
            System.out.println("\n球员排名(按成功率):");
            players.stream()
                   .sorted((p1, p2) -> Double.compare(p2.getSuccessRate(), p1.getSuccessRate()))
                   .forEach(System.out::println);
            System.out.printf("\n总直塞球次数: %d", totalBalls);
            System.out.printf("\n成功率球次数: %d", totalSuccessful);
            System.out.printf("\n总体成功率: %.1f%%\n", overallRate);
            // 找出最佳球员
            Player bestPlayer = players.stream()
                    .max((p1, p2) -> Double.compare(p1.getSuccessRate(), p2.getSuccessRate()))
                    .orElse(null);
            if (bestPlayer != null) {
                System.out.println("\n🏆 最佳直塞手: " + bestPlayer.name + " (成功率 " + 
                                 String.format("%.1f%%", bestPlayer.getSuccessRate()) + ")");
            }
        }
        // 分类统计
        public void categorizeStats() {
            System.out.println("\n========== 分类统计 ==========");
            int success = 0, failed = 0, outOfBounds = 0, intercepted = 0;
            for (Player player : players) {
                success += player.successfulBalls;
                failed += player.failedBalls;
                outOfBounds += player.outOfBoundsBalls;
                intercepted += player.interceptedBalls;
            }
            int total = success + failed + outOfBounds + intercepted;
            System.out.println("总直塞球数: " + total);
            System.out.println("成功: " + success + " 次 (" + String.format("%.1f%%", 
                            (double) success / total * 100) + ")");
            System.out.println("失败: " + failed + " 次 (" + String.format("%.1f%%", 
                            (double) failed / total * 100) + ")");
            System.out.println("出界: " + outOfBounds + " 次 (" + String.format("%.1f%%", 
                            (double) outOfBounds / total * 100) + ")");
            System.out.println("被截获: " + intercepted + " 次 (" + String.format("%.1f%%", 
                            (double) intercepted / total * 100) + ")");
        }
    }
    public static void main(String[] args) {
        System.out.println("🎯 直塞球成功率统计系统");
        System.out.println("=============================");
        ThroughBallAnalyzer analyzer = new ThroughBallAnalyzer();
        // 模拟一个赛季(5场比赛)
        for (int i = 1; i <= 5; i++) {
            analyzer.simulateMatch(i);
        }
        // 输出综合统计
        analyzer.calculateOverallStats();
        analyzer.categorizeStats();
        System.out.println("\n=============================");
        System.out.println("统计完成!");
    }
}

运行结果示例

🎯 直塞球成功率统计系统
=============================
========== 第 1 场比赛 ==========
张三      | 总数:   9 | 成功:   4 | 失败:   3 | 出界:   1 | 被截:   1 | 成功率: 44.4%
李四      | 总数:  12 | 成功:   5 | 失败:   4 | 出界:   2 | 被截:   1 | 成功率: 41.7%
...
========== 总体统计 ==========
球员排名(按成功率):
王五      | 总数:  11 | 成功:   6 | 失败:   3 | 出界:   1 | 被截:   1 | 成功率: 54.5%
...
总直塞球次数: 213
成功率球次数: 89
总体成功率: 41.8%
🏆 最佳直塞手: 王五 (成功率 54.5%)
========== 分类统计 ==========
总直塞球数: 213
成功: 89 次 (41.8%)
失败: 64 次 (30.0%)
出界: 30 次 (14.1%)
被截获: 30 次 (14.1%)

主要功能

  1. 数据模拟:模拟5场比赛,每场10名球员的直塞球数据
  2. 结果分类:分为成功、失败、出界、被截获四种情况
  3. 成功率计算:计算球员个人和整体的成功率
  4. 排名统计:按成功率对球员进行排序
  5. 详细分析:展示各类结果的具体比例

概率控制

  • 成功:40%
  • 失败:30%
  • 出界:15%
  • 被截获:15%

用户可以根据实际需求调整概率分布和模拟场次,这个系统可以帮助教练和分析师统计球员的直塞球表现,评估传球质量。

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