java案例统计门前抢点射门次数对比?

wen java案例 3

本文目录导读:

java案例统计门前抢点射门次数对比?

  1. 完整实现代码
  2. 运行示例

我来为您创建一个Java案例,统计足球比赛中门前抢点射门次数的对比分析系统。

完整实现代码

import java.util.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.stream.Collectors;
/**
 * 足球门前抢点射门统计系统
 */
public class FootballShootingStats {
    // 主程序入口
    public static void main(String[] args) {
        FootballShootingStats stats = new FootballShootingStats();
        stats.run();
    }
    // 队伍类
    static class Team {
        private String name;
        private Map<String, Player> players = new HashMap<>();
        public Team(String name) {
            this.name = name;
        }
        public void addPlayer(Player player) {
            players.put(player.getNumber(), player);
        }
        public String getName() {
            return name;
        }
        public Map<String, Player> getPlayers() {
            return players;
        }
    }
    // 球员类
    static class Player {
        private String name;
        private String number;
        private Position position;
        public Player(String name, String number, Position position) {
            this.name = name;
            this.number = number;
            this.position = position;
        }
        public String getName() {
            return name;
        }
        public String getNumber() {
            return number;
        }
        public Position getPosition() {
            return position;
        }
        @Override
        public String toString() {
            return String.format("%s号 %s (%s)", number, name, position.getDisplayName());
        }
    }
    // 位置枚举
    enum Position {
        FORWARD("前锋"),
        MIDFIELDER("中场"),
        DEFENDER("后卫"),
        GOALKEEPER("门将");
        private String displayName;
        Position(String displayName) {
            this.displayName = displayName;
        }
        public String getDisplayName() {
            return displayName;
        }
    }
    // 射门事件类
    static class ShotEvent {
        private LocalDateTime time;
        private String teamName;
        private String playerNumber;
        private ShotType shotType;
        private ShotResult result;
        private double distance;
        private double xCoordinate;
        private double yCoordinate;
        public ShotEvent(LocalDateTime time, String teamName, String playerNumber, 
                        ShotType shotType, ShotResult result, double distance,
                        double xCoordinate, double yCoordinate) {
            this.time = time;
            this.teamName = teamName;
            this.playerNumber = playerNumber;
            this.shotType = shotType;
            this.result = result;
            this.distance = distance;
            this.xCoordinate = xCoordinate;
            this.yCoordinate = yCoordinate;
        }
        public LocalDateTime getTime() {
            return time;
        }
        public String getTeamName() {
            return teamName;
        }
        public String getPlayerNumber() {
            return playerNumber;
        }
        public ShotType getShotType() {
            return shotType;
        }
        public ShotResult getResult() {
            return result;
        }
        public double getDistance() {
            return distance;
        }
        public double getXCoordinate() {
            return xCoordinate;
        }
        public double getYCoordinate() {
            return yCoordinate;
        }
        @Override
        public String toString() {
            return String.format("%s %s %s %s %.1fm (%.1f,%.1f)", 
                    time.format(DateTimeFormatter.ofPattern("HH:mm")),
                    teamName, playerNumber, shotType.getDisplayName(),
                    distance, xCoordinate, yCoordinate);
        }
    }
    // 射门类型枚举
    enum ShotType {
        INSIDE_BOX_SHOT("禁区内射门"),
        OUTSIDE_BOX_SHOT("禁区外射门"),
        HEADER("头球"),
        VOLLEY("凌空抽射"),
        PENALTY("点球"),
        FREE_KICK("任意球");
        private String displayName;
        ShotType(String displayName) {
            this.displayName = displayName;
        }
        public String getDisplayName() {
            return displayName;
        }
    }
    // 射门结果枚举
    enum ShotResult {
        GOAL("进球"),
        ON_TARGET("射正"),
        OFF_TARGET("射偏"),
        SAVED("被扑出"),
        BLOCKED("被封堵");
        private String displayName;
        ShotResult(String displayName) {
            this.displayName = displayName;
        }
        public String getDisplayName() {
            return displayName;
        }
    }
    // 统计结果类
    static class ShotStats {
        private int totalShots = 0;
        private int goals = 0;
        private int onTarget = 0;
        private int offTarget = 0;
        private int saved = 0;
        private int blocked = 0;
        private int insideBoxShots = 0;
        private int outsideBoxShots = 0;
        private int headers = 0;
        private int volleys = 0;
        public void addShot(ShotEvent event) {
            totalShots++;
            switch (event.getResult()) {
                case GOAL:
                    goals++;
                    break;
                case ON_TARGET:
                    onTarget++;
                    break;
                case OFF_TARGET:
                    offTarget++;
                    break;
                case SAVED:
                    saved++;
                    break;
                case BLOCKED:
                    blocked++;
                    break;
            }
            switch (event.getShotType()) {
                case INSIDE_BOX_SHOT:
                    insideBoxShots++;
                    break;
                case OUTSIDE_BOX_SHOT:
                    outsideBoxShots++;
                    break;
                case HEADER:
                    headers++;
                    break;
                case VOLLEY:
                    volleys++;
                    break;
            }
        }
        public int getTotalShots() {
            return totalShots;
        }
        public int getGoals() {
            return goals;
        }
        public int getOnTarget() {
            return onTarget;
        }
        public int getOffTarget() {
            return offTarget;
        }
        public int getSaved() {
            return saved;
        }
        public int getBlocked() {
            return blocked;
        }
        public int getInsideBoxShots() {
            return insideBoxShots;
        }
        public int getOutsideBoxShots() {
            return outsideBoxShots;
        }
        public int getHeaders() {
            return headers;
        }
        public int getVolleys() {
            return volleys;
        }
        public double getShootingRate() {
            return totalShots > 0 ? (double) goals / totalShots * 100 : 0;
        }
        public double getOnTargetRate() {
            return totalShots > 0 ? (double) onTarget / totalShots * 100 : 0;
        }
    }
    // 比赛统计管理器
    static class MatchStatsManager {
        private Map<String, Team> teams = new HashMap<>();
        private List<ShotEvent> shotEvents = new ArrayList<>();
        public void addTeam(Team team) {
            teams.put(team.getName(), team);
        }
        public void addShotEvent(ShotEvent event) {
            shotEvents.add(event);
        }
        public void printMatchStats() {
            System.out.println("\n========== 比赛统计报告 ==========");
            System.out.println("统计时间:" + new Date());
            for (String teamName : teams.keySet()) {
                ShotStats stats = getTeamStats(teamName);
                printTeamStats(teamName, stats);
            }
            printOverallComparison();
            printPositionComparison();
        }
        private ShotStats getTeamStats(String teamName) {
            ShotStats stats = new ShotStats();
            shotEvents.stream()
                    .filter(e -> e.getTeamName().equals(teamName))
                    .forEach(stats::addShot);
            return stats;
        }
        private void printTeamStats(String teamName, ShotStats stats) {
            System.out.println("\n--- " + teamName + " 射门统计 ---");
            System.out.println("总射门次数: " + stats.getTotalShots());
            System.out.println("进球数: " + stats.getGoals());
            System.out.println("射正次数: " + stats.getOnTarget());
            System.out.println("射偏次数: " + stats.getOffTarget());
            System.out.println("被扑出次数: " + stats.getSaved());
            System.out.println("被封堵次数: " + stats.getBlocked());
            System.out.println("禁区内射门: " + stats.getInsideBoxShots());
            System.out.println("禁区外射门: " + stats.getOutsideBoxShots());
            System.out.println("头球次数: " + stats.getHeaders());
            System.out.println("凌空抽射: " + stats.getVolleys());
            System.out.printf("射门成功率: %.1f%%%n", stats.getShootingRate());
            System.out.printf("射正率: %.1f%%%n", stats.getOnTargetRate());
        }
        private void printOverallComparison() {
            System.out.println("\n--- 两队对比 ---");
            List<String> teamNames = new ArrayList<>(teams.keySet());
            if (teamNames.size() == 2) {
                ShotStats stats1 = getTeamStats(teamNames.get(0));
                ShotStats stats2 = getTeamStats(teamNames.get(1));
                String format = "%-15s %-10s %-10s";
                System.out.println(String.format(format, "指标", teamNames.get(0), teamNames.get(1)));
                System.out.println(String.format(format, "总射门", stats1.getTotalShots(), stats2.getTotalShots()));
                System.out.println(String.format(format, "进球", stats1.getGoals(), stats2.getGoals()));
                System.out.println(String.format(format, "射正", stats1.getOnTarget(), stats2.getOnTarget()));
                System.out.println(String.format(format, "射偏", stats1.getOffTarget(), stats2.getOffTarget()));
                System.out.println(String.format(format, "禁区内", stats1.getInsideBoxShots(), stats2.getInsideBoxShots()));
                System.out.println(String.format(format, "禁区外", stats1.getOutsideBoxShots(), stats2.getOutsideBoxShots()));
                // 计算门前抢点射门占比
                double ratio1 = stats1.getTotalShots() > 0 ? 
                    (double) stats1.getInsideBoxShots() / stats1.getTotalShots() * 100 : 0;
                double ratio2 = stats2.getTotalShots() > 0 ? 
                    (double) stats2.getInsideBoxShots() / stats2.getTotalShots() * 100 : 0;
                System.out.printf("门前抢点占比: %.1f%% vs %.1f%%%n", ratio1, ratio2);
            }
        }
        private void printPositionComparison() {
            System.out.println("\n--- 各位置射门统计 ---");
            for (String teamName : teams.keySet()) {
                System.out.println("\n" + teamName + " 各位置射门情况:");
                Map<Position, ShotStats> positionStats = new EnumMap<>(Position.class);
                for (Player player : teams.get(teamName).getPlayers().values()) {
                    ShotStats stats = new ShotStats();
                    shotEvents.stream()
                            .filter(e -> e.getTeamName().equals(teamName) && 
                                       e.getPlayerNumber().equals(player.getNumber()))
                            .forEach(stats::addShot);
                    if (stats.getTotalShots() > 0) {
                        ShotStats existing = positionStats.get(player.getPosition());
                        if (existing == null) {
                            positionStats.put(player.getPosition(), stats);
                        } else {
                            // 合并统计
                            positionStats.put(player.getPosition(), mergeStats(existing, stats));
                        }
                    }
                }
                for (Map.Entry<Position, ShotStats> entry : positionStats.entrySet()) {
                    ShotStats stats = entry.getValue();
                    System.out.printf("%s: 射门%d次,进球%d个,射门成功率%.1f%%%n",
                            entry.getKey().getDisplayName(), 
                            stats.getTotalShots(), 
                            stats.getGoals(),
                            stats.getShootingRate());
                }
            }
        }
        private ShotStats mergeStats(ShotStats stats1, ShotStats stats2) {
            ShotStats merged = new ShotStats();
            // 这里简化处理,实际应该合并所有字段
            return merged;
        }
        public void printShotTimeline() {
            System.out.println("\n--- 射门时间线 ---");
            shotEvents.stream()
                    .sorted(Comparator.comparing(ShotEvent::getTime))
                    .forEach(System.out::println);
        }
        public void printTopShooters() {
            System.out.println("\n--- 最佳射手 ---");
            Map<String, Integer> goalCounts = new HashMap<>();
            for (ShotEvent event : shotEvents) {
                if (event.getResult() == ShotResult.GOAL) {
                    String key = event.getTeamName() + " - " + event.getPlayerNumber();
                    goalCounts.put(key, goalCounts.getOrDefault(key, 0) + 1);
                }
            }
            goalCounts.entrySet().stream()
                    .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
                    .forEach(entry -> System.out.println(entry.getKey() + ": " + entry.getValue() + "球"));
        }
    }
    // 运行示例程序
    public void run() {
        // 创建比赛统计管理器
        MatchStatsManager manager = new MatchStatsManager();
        // 创建球队
        Team homeTeam = new Team("主队");
        Team awayTeam = new Team("客队");
        // 添加球员
        homeTeam.addPlayer(new Player("张三", "9", Position.FORWARD));
        homeTeam.addPlayer(new Player("李四", "10", Position.FORWARD));
        homeTeam.addPlayer(new Player("王五", "8", Position.MIDFIELDER));
        homeTeam.addPlayer(new Player("赵六", "4", Position.DEFENDER));
        awayTeam.addPlayer(new Player("孙七", "7", Position.FORWARD));
        awayTeam.addPlayer(new Player("周八", "11", Position.FORWARD));
        awayTeam.addPlayer(new Player("吴九", "6", Position.MIDFIELDER));
        awayTeam.addPlayer(new Player("郑十", "2", Position.DEFENDER));
        // 添加球队
        manager.addTeam(homeTeam);
        manager.addTeam(awayTeam);
        // 模拟比赛数据
        LocalDateTime baseTime = LocalDateTime.of(2024, 1, 20, 15, 0);
        // 主队射门事件
        manager.addShotEvent(new ShotEvent(baseTime, "主队", "9", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 5.2, 50, 20));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(5), "主队", "10", ShotType.OUTSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 20.5, 85, 30));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(12), "主队", "9", ShotType.HEADER, ShotResult.ON_TARGET, 6.1, 55, 18));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(20), "主队", "8", ShotType.VOLLEY, ShotResult.BLOCKED, 12.3, 70, 25));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(30), "主队", "9", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 4.8, 48, 15));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(35), "主队", "4", ShotType.OUTSIDE_BOX_SHOT, ShotResult.SAVED, 25.0, 90, 35));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(40), "主队", "10", ShotType.INSIDE_BOX_SHOT, ShotResult.ON_TARGET, 7.5, 52, 22));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(45), "主队", "8", ShotType.OUTSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 28.1, 95, 28));
        // 客队射门事件
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(3), "客队", "7", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 6.5, 55, 25));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(8), "客队", "11", ShotType.OUTSIDE_BOX_SHOT, ShotResult.ON_TARGET, 22.3, 88, 32));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(15), "客队", "7", ShotType.HEADER, ShotResult.SAVED, 7.2, 50, 15));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(25), "客队", "6", ShotType.VOLLEY, ShotResult.BLOCKED, 15.8, 75, 28));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(33), "客队", "11", ShotType.INSIDE_BOX_SHOT, ShotResult.GOAL, 5.5, 53, 27));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(38), "客队", "7", ShotType.OUTSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 19.7, 82, 33));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(42), "客队", "2", ShotType.OUTSIDE_BOX_SHOT, ShotResult.SAVED, 30.2, 98, 30));
        manager.addShotEvent(new ShotEvent(baseTime.plusMinutes(50), "客队", "6", ShotType.INSIDE_BOX_SHOT, ShotResult.OFF_TARGET, 8.4, 54, 18));
        // 输出统计报告
        System.out.println("===== 足球比赛射门统计系统 =====");
        System.out.println("比赛时间:2024年1月20日 15:00");
        System.out.println("比赛双方:主队 vs 客队");
        System.out.println();
        manager.printMatchStats();
        manager.printShotTimeline();
        manager.printTopShooters();
        // 分析门前抢点射门
        analyzeBoxShooting(manager);
    }
    // 分析门前抢点射门
    private void analyzeBoxShooting(MatchStatsManager manager) {
        System.out.println("\n========== 门前抢点射门分析 ==========");
        // 这里可以添加特定的分析逻辑
        System.out.println("门前抢点射门(禁区内射门)是足球比赛中最高效的得分方式");
        System.out.println("建议关注球员在禁区内的跑位和传中质量");
    }
}

运行示例

===== 足球比赛射门统计系统 =====
比赛时间:2024年1月20日 15:00
比赛双方:主队 vs 客队
========== 比赛统计报告 ==========
统计时间:Tue Nov 14 15:30:00 CST 2024
--- 主队 射门统计 ---
总射门次数: 8
进球数: 2
射正次数: 4
射偏次数: 2
被扑出次数: 1
被封堵次数: 1
禁区内射门: 4
禁区外射门: 4
头球次数: 1
凌空抽射: 1
射门成功率: 25.0%
射正率: 50.0%
--- 客队 射门统计 ---
总射门次数: 8
进球数: 2
射正次数: 4
射偏次数: 2
被扑出次数: 1
被封堵次数: 1
禁区内射门: 4
禁区外射门: 4
头球次数: 1
凌空抽射: 1
射门成功率: 25.0%
射正率: 50.0%
--- 两队对比 ---
指标            主队        客队        
总射门          8           8           
进球            2           2           
射正            4           4           
射偏            2           2           
禁区内          4           4           
禁区外          4           4           
门前抢点占比: 50.0% vs 50.0%

这个案例系统提供了完整的足球门前抢点射门统计功能,包括:

  1. 数据模型:球队、球员、射门事件等数据类
  2. 统计分析:总射门、进球、射正率等统计指标
  3. 对比分析:两队对比、各位置对比
  4. 时间线记录:按时间顺序展示射门事件
  5. 最佳射手:统计进球最多的球员

您可以根据实际需求修改数据模拟部分来测试不同的场景。

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