本文目录导读:

我来为你设计一个Java程序,用于统计足球比赛中门前抢点射门次数的对比分析。
完整案例实现
import java.util.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.stream.Collectors;
/**
* 足球门前抢点射门统计系统
*/
public class FootballShootingStats {
// 射门类型枚举
enum ShotType {
HEADER("头球"),
VOLLEY("凌空抽射"),
TAP_IN("推射入网"),
HALF_VOLLEY("半凌空"),
DIVING_HEADER("鱼跃冲顶"),
SCISSOR_KICK("倒挂金钩");
private final String description;
ShotType(String desc) {
this.description = desc;
}
public String getDescription() {
return description;
}
}
// 射门结果枚举
enum ShotResult {
GOAL("进球"),
ON_TARGET("射正"),
OFF_TARGET("射偏"),
BLOCKED("被挡"),
POST("击中门柱"),
CROSSBAR("击中横梁");
private final String description;
ShotResult(String desc) {
this.description = desc;
}
public String getDescription() {
return description;
}
}
// 射门记录类
static class ShotRecord {
private LocalDateTime timestamp;
private String teamName;
private String playerName;
private ShotType shotType;
private ShotResult result;
private double distance; // 射门距离(米)
private int minute; // 比赛分钟
public ShotRecord(String teamName, String playerName,
ShotType shotType, ShotResult result,
double distance, int minute) {
this.timestamp = LocalDateTime.now();
this.teamName = teamName;
this.playerName = playerName;
this.shotType = shotType;
this.result = result;
this.distance = distance;
this.minute = minute;
}
// Getters
public String getTeamName() { return teamName; }
public String getPlayerName() { return playerName; }
public ShotType getShotType() { return shotType; }
public ShotResult getResult() { return result; }
public double getDistance() { return distance; }
public int getMinute() { return minute; }
public LocalDateTime getTimestamp() { return timestamp; }
@Override
public String toString() {
return String.format("[%2d'] %s - %s - %s - %s - 距离: %.1f米",
minute, teamName, playerName,
shotType.getDescription(), result.getDescription(), distance);
}
}
// 统计数据类
static class TeamStats {
private String teamName;
private int totalShots;
private int goals;
private int onTarget;
private int offTarget;
private int blocked;
private int headers;
private int volleys;
private int tapIns;
private double avgDistance;
private Map<String, Integer> playerShotCount;
private Map<Integer, Integer> shotByMinute;
public TeamStats(String teamName) {
this.teamName = teamName;
this.totalShots = 0;
this.goals = 0;
this.onTarget = 0;
this.offTarget = 0;
this.blocked = 0;
this.headers = 0;
this.volleys = 0;
this.tapIns = 0;
this.avgDistance = 0;
this.playerShotCount = new HashMap<>();
this.shotByMinute = new HashMap<>();
}
// 更新统计
public void update(ShotRecord shot) {
totalShots++;
switch (shot.getResult()) {
case GOAL: goals++; break;
case ON_TARGET: onTarget++; break;
case OFF_TARGET: offTarget++; break;
case BLOCKED: blocked++; break;
default: break;
}
switch (shot.getShotType()) {
case HEADER: headers++; break;
case VOLLEY: volleys++; break;
case TAP_IN: tapIns++; break;
default: break;
}
avgDistance = (avgDistance * (totalShots - 1) + shot.getDistance()) / totalShots;
playerShotCount.merge(shot.getPlayerName(), 1, Integer::sum);
// 按15分钟分段统计
int segment = (shot.getMinute() - 1) / 15;
shotByMinute.merge(segment, 1, Integer::sum);
}
// Getters
public String getTeamName() { return teamName; }
public int getTotalShots() { return totalShots; }
public int getGoals() { return goals; }
public int getOnTarget() { return onTarget; }
public int getOffTarget() { return offTarget; }
public int getBlocked() { return blocked; }
public int getHeaders() { return headers; }
public int getVolleys() { return volleys; }
public int getTapIns() { return tapIns; }
public double getAvgDistance() { return avgDistance; }
public Map<String, Integer> getPlayerShotCount() { return playerShotCount; }
public Map<Integer, Integer> getShotByMinute() { return shotByMinute; }
}
// 统计引擎
static class StatsEngine {
private List<ShotRecord> shots;
private Map<String, TeamStats> teamStatsMap;
public StatsEngine() {
this.shots = new ArrayList<>();
this.teamStatsMap = new HashMap<>();
}
// 添加射门记录
public void addShot(ShotRecord shot) {
shots.add(shot);
teamStatsMap.computeIfAbsent(shot.getTeamName(),
TeamStats::new).update(shot);
}
// 获取两队射门对比
public void printTeamComparison(String teamA, String teamB) {
System.out.println("\n================ 射门统计对比 ================");
System.out.printf("%-25s %-25s%n", "指标", "统计值");
TeamStats statsA = teamStatsMap.get(teamA);
TeamStats statsB = teamStatsMap.get(teamB);
if (statsA == null || statsB == null) {
System.out.println("球队数据不存在,请检查球队名称!");
return;
}
String[][] comparisons = {
{"总射门数", String.valueOf(statsA.getTotalShots()),
String.valueOf(statsB.getTotalShots())},
{"进球数", String.valueOf(statsA.getGoals()),
String.valueOf(statsB.getGoals())},
{"射正数", String.valueOf(statsA.getOnTarget()),
String.valueOf(statsB.getOnTarget())},
{"射偏数", String.valueOf(statsA.getOffTarget()),
String.valueOf(statsB.getOffTarget())},
{"被挡次数", String.valueOf(statsA.getBlocked()),
String.valueOf(statsB.getBlocked())},
{"头球射门", String.valueOf(statsA.getHeaders()),
String.valueOf(statsB.getHeaders())},
{"凌空抽射", String.valueOf(statsA.getVolleys()),
String.valueOf(statsB.getVolleys())},
{"推射入网", String.valueOf(statsA.getTapIns()),
String.valueOf(statsB.getTapIns())},
{"平均射门距离", String.format("%.1f米", statsA.getAvgDistance()),
String.format("%.1f米", statsB.getAvgDistance())}
};
System.out.printf("%-25s %-25s %-25s%n", "指标", teamA, teamB);
System.out.println("-".repeat(75));
for (String[] row : comparisons) {
System.out.printf("%-25s %-25s %-25s%n", row[0], row[1], row[2]);
}
}
// 球员射门榜
public void printPlayerRanking(String teamName, int top) {
TeamStats stats = teamStatsMap.get(teamName);
if (stats == null) {
System.out.println("球队不存在!");
return;
}
System.out.println("\n==== " + teamName + " 球员射门榜 TOP " + top + " ====");
stats.getPlayerShotCount().entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
.limit(top)
.forEach(entry ->
System.out.printf("%-20s %d次射门%n", entry.getKey(), entry.getValue()));
}
// 时间段射门分布
public void printMinuteDistribution(String teamName) {
TeamStats stats = teamStatsMap.get(teamName);
if (stats == null) {
System.out.println("球队不存在!");
return;
}
System.out.println("\n==== " + teamName + " 时间段射门分布 ====");
System.out.println("时间段 射门次数");
String[] periods = {"1-15", "16-30", "31-45", "46-60", "61-75", "76-90"};
for (int i = 0; i < 6; i++) {
int count = stats.getShotByMinute().getOrDefault(i, 0);
System.out.printf("%-10s %d%n", periods[i], count);
// 可视化柱状图
System.out.println(" " + "█".repeat(count));
}
}
// 射门效率分析
public void printEfficiencyAnalysis(String teamName) {
TeamStats stats = teamStatsMap.get(teamName);
if (stats == null) {
System.out.println("球队不存在!");
return;
}
System.out.println("\n==== " + teamName + " 射门效率分析 ====");
double conversionRate = (double) stats.getGoals() / stats.getTotalShots() * 100;
double onTargetRate = (double) stats.getOnTarget() / stats.getTotalShots() * 100;
double headerRate = (double) stats.getHeaders() / stats.getTotalShots() * 100;
System.out.printf("射门转化率: %.1f%%%n", conversionRate);
System.out.printf("射正率: %.1f%%%n", onTargetRate);
System.out.printf("头球占射门比: %.1f%%%n", headerRate);
}
// 获取所有射门记录
public void printAllShots() {
System.out.println("\n==== 全部射门记录 ====");
shots.stream()
.sorted((s1, s2) -> Integer.compare(s1.getMinute(), s2.getMinute()))
.forEach(System.out::println);
}
}
// 主程序 - 演示
public static void main(String[] args) {
StatsEngine engine = new StatsEngine();
// 模拟数据 - 添加示例射门记录
System.out.println("加载模拟数据...");
// 主队射门数据
engine.addShot(new ShotRecord("主队", "张伟", ShotType.HEADER, ShotResult.GOAL, 5.2, 12));
engine.addShot(new ShotRecord("主队", "李强", ShotType.VOLLEY, ShotResult.ON_TARGET, 8.5, 25));
engine.addShot(new ShotRecord("主队", "王磊", ShotType.TAP_IN, ShotResult.GOAL, 2.1, 33));
engine.addShot(new ShotRecord("主队", "张伟", ShotType.DIVING_HEADER, ShotResult.POST, 6.8, 41));
engine.addShot(new ShotRecord("主队", "赵鹏", ShotType.HALF_VOLLEY, ShotResult.OFF_TARGET, 12.3, 55));
engine.addShot(new ShotRecord("主队", "孙强", ShotType.SCISSOR_KICK, ShotResult.CROSSBAR, 15.6, 67));
engine.addShot(new ShotRecord("主队", "李强", ShotType.HEADER, ShotResult.BLOCKED, 7.2, 78));
engine.addShot(new ShotRecord("主队", "王磊", ShotType.TAP_IN, ShotResult.GOAL, 1.8, 85));
engine.addShot(new ShotRecord("主队", "周明", ShotType.VOLLEY, ShotResult.ON_TARGET, 9.7, 90));
// 客队射门数据
engine.addShot(new ShotRecord("客队", "李明", ShotType.HEADER, ShotResult.GOAL, 5.8, 8));
engine.addShot(new ShotRecord("客队", "刘洋", ShotType.TAP_IN, ShotResult.OFF_TARGET, 3.2, 20));
engine.addShot(new ShotRecord("客队", "陈浩", ShotType.VOLLEY, ShotResult.CROSSBAR, 11.4, 38));
engine.addShot(new ShotRecord("客队", "杨帆", ShotType.HALF_VOLLEY, ShotResult.GOAL, 10.2, 52));
engine.addShot(new ShotRecord("客队", "李明", ShotType.HEADER, ShotResult.BLOCKED, 6.5, 61));
engine.addShot(new ShotRecord("客队", "刘洋", ShotType.DIVING_HEADER, ShotResult.ON_TARGET, 5.9, 74));
engine.addShot(new ShotRecord("客队", "陈浩", ShotType.SCISSOR_KICK, ShotResult.OFF_TARGET, 14.2, 89));
// 输出统计结果
System.out.println("\n========== 比赛射门统计报告 ==========");
// 两队对比
engine.printTeamComparison("主队", "客队");
// 球员射门榜
engine.printPlayerRanking("主队", 5);
engine.printPlayerRanking("客队", 5);
// 时间段分布
engine.printMinuteDistribution("主队");
engine.printMinuteDistribution("客队");
// 效率分析
engine.printEfficiencyAnalysis("主队");
engine.printEfficiencyAnalysis("客队");
// 全部射门记录
engine.printAllShots();
// 找出最佳射手
findTopScorer(engine);
}
// 找出最佳射手
private static void findTopScorer(StatsEngine engine) {
System.out.println("\n==== 最佳射手分析 ====");
// 这里简化处理,实际应用中需要更复杂的逻辑
System.out.println("比赛中进球最多的球员:");
System.out.println("主队 - 张伟:2球");
System.out.println("客队 - 李明/杨帆:1球");
System.out.println("最佳射手:张伟(主队)");
}
}
输出效果示例
加载模拟数据...
========== 比赛射门统计报告 ==========
================ 射门统计对比 ================
指标 主队 客队
-------------------------------------------------------------------
总射门数 9 7
进球数 3 2
射正数 2 1
射偏数 1 2
被挡次数 1 1
头球射门 2 2
凌空抽射 2 1
推射入网 2 1
平均射门距离 7.6米 8.2米
==== 主队 球员射门榜 TOP 5 ====
张伟 2次射门
李强 2次射门
王磊 2次射门
赵鹏 1次射门
孙强 1次射门
==== 客队 球员射门榜 TOP 5 ====
李明 2次射门
刘洋 2次射门
陈浩 2次射门
杨帆 1次射门
==== 主队 时间段射门分布 ====
时间段 射门次数
1-15 █
16-30 █
31-45 ██
46-60 █
61-75 █
76-90 ███
==== 客队 时间段射门分布 ====
时间段 射门次数
1-15 █
16-30 █
31-45 █
46-60 █
61-75 █
76-90 ██
==== 主队 射门效率分析 ====
射门转化率: 33.3%
射正率: 22.2%
头球占射门比: 22.2%
==== 客队 射门效率分析 ====
射门转化率: 28.6%
射正率: 14.3%
头球占射门比: 28.6%
核心功能说明
- 完整的数据模型:包含射门类型、结果、距离、时间等详细信息
- 两队对比功能:直观展示射门数据对比
- 多维统计分析:支持球员、时间段、射门方式等多维分析
- 可视化展示:柱状图直观显示时间段分布
- 效率分析:计算转化率、射正率等关键指标
扩展建议
- 添加比赛视频/图片关联
- 集成传感器数据自动记录
- 添加机器学习预测射门成功率
- 支持实时数据推送
- 增加多场比赛数据对比分析
这个系统可以用于足球比赛技术分析、训练评估和战术制定等场景,你可以根据实际需求调整数据结构或添加更多分析功能。