本文目录导读:

我来为您创建一个门球短传配合成功率的统计案例,这个案例将模拟门球比赛中球员之间的短传配合数据统计。
实现代码
import java.util.*;
import java.text.SimpleDateFormat;
import java.text.DecimalFormat;
/**
* 门球短传配合成功率统计系统
*/
public class GateBallPassStatistic {
// 球员类
static class Player {
private String id;
private String name;
private String position; // 位置:前锋、中场、后卫
public Player(String id, String name, String position) {
this.id = id;
this.name = name;
this.position = position;
}
public String getId() { return id; }
public String getName() { return name; }
public String getPosition() { return position; }
@Override
public String toString() {
return String.format("%s(%s-%s)", name, position, id);
}
}
// 传球记录类
static class PassRecord {
private Player passer; // 传球球员
private Player receiver; // 接球球员
private boolean successful; // 是否成功
private Date time; // 传球时间
private double distance; // 传球距离(米)
public PassRecord(Player passer, Player receiver, boolean successful, double distance) {
this.passer = passer;
this.receiver = receiver;
this.successful = successful;
this.time = new Date();
this.distance = distance;
}
public Player getPasser() { return passer; }
public Player getReceiver() { return receiver; }
public boolean isSuccessful() { return successful; }
public Date getTime() { return time; }
public double getDistance() { return distance; }
}
// 统计数据类
static class PlayerStat {
private Player player;
private int totalPasses; // 总传球次数
private int successfulPasses; // 成功传球次数
private int totalReceives; // 总接球次数
private int successfulReceives; // 成功接球次数
private Map<String, PassPairStat> pairStats; // 与不同队友的配合统计
public PlayerStat(Player player) {
this.player = player;
this.totalPasses = 0;
this.successfulPasses = 0;
this.totalReceives = 0;
this.successfulReceives = 0;
this.pairStats = new HashMap<>();
}
// 记录传球
public void recordPass(boolean success, Player receiver) {
totalPasses++;
if (success) {
successfulPasses++;
}
// 更新配对统计
String pairKey = receiver.getId();
PassPairStat pairStat = pairStats.computeIfAbsent(pairKey,
k -> new PassPairStat(player, receiver));
pairStat.recordPass(success);
}
// 记录接球
public void recordReceive(boolean success) {
totalReceives++;
if (success) {
successfulReceives++;
}
}
public double getPassSuccessRate() {
return totalPasses == 0 ? 0 : (double) successfulPasses / totalPasses * 100;
}
public double getReceiveSuccessRate() {
return totalReceives == 0 ? 0 : (double) successfulReceives / totalReceives * 100;
}
public int getTotalPasses() { return totalPasses; }
public int getSuccessfulPasses() { return successfulPasses; }
public int getTotalReceives() { return totalReceives; }
public int getSuccessfulReceives() { return successfulReceives; }
public Player getPlayer() { return player; }
public Map<String, PassPairStat> getPairStats() { return pairStats; }
}
// 配对统计类
static class PassPairStat {
private Player passer;
private Player receiver;
private int totalPasses;
private int successfulPasses;
public PassPairStat(Player passer, Player receiver) {
this.passer = passer;
this.receiver = receiver;
this.totalPasses = 0;
this.successfulPasses = 0;
}
public void recordPass(boolean success) {
totalPasses++;
if (success) {
successfulPasses++;
}
}
public double getSuccessRate() {
return totalPasses == 0 ? 0 : (double) successfulPasses / totalPasses * 100;
}
public int getTotalPasses() { return totalPasses; }
public int getSuccessfulPasses() { return successfulPasses; }
}
// 统计系统类
static class StatisticSystem {
private Map<String, Player> players;
private List<PassRecord> passRecords;
private Map<String, PlayerStat> playerStats;
private Random random;
private DecimalFormat df;
public StatisticSystem() {
this.players = new HashMap<>();
this.passRecords = new ArrayList<>();
this.playerStats = new HashMap<>();
this.random = new Random();
this.df = new DecimalFormat("#.##");
initializePlayers();
}
// 初始化球队球员
private void initializePlayers() {
// 前锋
addPlayer("P001", "王强", "前锋");
addPlayer("P002", "李明", "前锋");
// 中场
addPlayer("P003", "张伟", "中场");
addPlayer("P004", "刘洋", "中场");
addPlayer("P005", "陈杰", "中场");
// 后卫
addPlayer("P006", "赵磊", "后卫");
addPlayer("P007", "孙浩", "后卫");
addPlayer("P008", "周宇", "后卫");
}
private void addPlayer(String id, String name, String position) {
Player player = new Player(id, name, position);
players.put(id, player);
playerStats.put(id, new PlayerStat(player));
}
// 记录一次传球
public void recordPass(String passerId, String receiverId, boolean success, double distance) {
Player passer = players.get(passerId);
Player receiver = players.get(receiverId);
if (passer == null || receiver == null) {
System.out.println("球员不存在!");
return;
}
// 记录传球
PassRecord record = new PassRecord(passer, receiver, success, distance);
passRecords.add(record);
// 更新统计数据
PlayerStat passerStat = playerStats.get(passerId);
PlayerStat receiverStat = playerStats.get(receiverId);
passerStat.recordPass(success, receiver);
receiverStat.recordReceive(success);
}
// 模拟一场比赛
public void simulateMatch(int passCount) {
System.out.println("\n========== 比赛模拟开始 ==========");
System.out.println("预计传球次数:" + passCount);
List<String> playerIds = new ArrayList<>(players.keySet());
for (int i = 0; i < passCount; i++) {
// 随机选择发球员和接球员
String passerId = playerIds.get(random.nextInt(playerIds.size()));
String receiverId;
do {
receiverId = playerIds.get(random.nextInt(playerIds.size()));
} while (receiverId.equals(passerId));
// 随机成功率(模拟真实比赛,成功率在60%-85%之间)
double successRate = 0.60 + random.nextDouble() * 0.25;
boolean success = random.nextDouble() < successRate;
// 随机传球距离(5-15米为短传)
double distance = 5 + random.nextDouble() * 10;
recordPass(passerId, receiverId, success, distance);
}
System.out.println("========== 比赛模拟结束 ==========\n");
}
// 打印球员统计
public void printPlayerStatistics() {
System.out.println("========== 球员个人统计 ==========");
System.out.println("┌──────┬────────┬────────┬────────┬──────────┬────────────┬────────────┐");
System.out.println("│ 编号 │ 球员 │ 位置 │ 传球数 │ 成功数 │ 成功率(%) │ 接球成功率 │");
System.out.println("├──────┼────────┼────────┼────────┼──────────┼────────────┼────────────┤");
List<PlayerStat> stats = new ArrayList<>(playerStats.values());
stats.sort((s1, s2) -> Double.compare(
s2.getPassSuccessRate(), s1.getPassSuccessRate()));
for (PlayerStat stat : stats) {
Player player = stat.getPlayer();
System.out.printf("│ %-4s │ %-6s │ %-6s │ %-6d │ %-8d │ %-10s │ %-10s │%n",
player.getId(),
player.getName(),
player.getPosition(),
stat.getTotalPasses(),
stat.getSuccessfulPasses(),
df.format(stat.getPassSuccessRate()) + "%",
df.format(stat.getReceiveSuccessRate()) + "%");
}
System.out.println("└──────┴────────┴────────┴────────┴──────────┴────────────┴────────────┘");
}
// 打印球员配对统计
public void printPairStatistics() {
System.out.println("\n========== 球员配对统计 ==========");
System.out.println("┌───────────┬───────────┬────────┬──────────┬───────────┐");
System.out.println("│ 传球球员 │ 接球球员 │ 传球次数 │ 成功次数 │ 成功率(%) │");
System.out.println("├───────────┼───────────┼────────┼──────────┼───────────┤");
List<PlayerStat> stats = new ArrayList<>(playerStats.values());
stats.sort((s1, s2) ->
s2.getPairStats().size() - s1.getPairStats().size());
for (PlayerStat stat : stats) {
Player player = stat.getPlayer();
for (PassPairStat pairStat : stat.getPairStats().values()) {
if (pairStat.getTotalPasses() > 0) {
System.out.printf("│ %-9s │ %-9s │ %-6d │ %-8d │ %-9s │%n",
player.getName(),
pairStat.receiver.getName(),
pairStat.getTotalPasses(),
pairStat.getSuccessfulPasses(),
df.format(pairStat.getSuccessRate()) + "%");
}
}
}
System.out.println("└───────────┴───────────┴────────┴──────────┴───────────┘");
}
// 打印球队整体统计
public void printTeamStatistics() {
int totalPasses = 0;
int successfulPasses = 0;
for (PassRecord record : passRecords) {
totalPasses++;
if (record.isSuccessful()) {
successfulPasses++;
}
}
System.out.println("\n========== 球队整体统计 ==========");
System.out.println("总传球次数:" + totalPasses);
System.out.println("成功传球次数:" + successfulPasses);
System.out.println("整体成功率:" +
df.format((double) successfulPasses / totalPasses * 100) + "%");
// 按位置统计
Map<String, Integer[]> positionStats = new HashMap<>();
for (PassRecord record : passRecords) {
String position = record.getPasser().getPosition();
positionStats.computeIfAbsent(position, k -> new Integer[]{0, 0});
Integer[] counts = positionStats.get(position);
counts[0]++;
if (record.isSuccessful()) {
counts[1]++;
}
}
System.out.println("\n位置统计:");
for (Map.Entry<String, Integer[]> entry : positionStats.entrySet()) {
Integer[] counts = entry.getValue();
double rate = counts[0] == 0 ? 0 : (double) counts[1] / counts[0] * 100;
System.out.printf("%s:传球%d次,成功%d次,成功率%.2f%%%n",
entry.getKey(), counts[0], counts[1], rate);
}
}
// 分析配合质量
public void analyzeCooperation() {
System.out.println("\n========== 配合质量分析 ==========");
// 找出最佳组合
List<PassPairStat> allPairs = new ArrayList<>();
for (PlayerStat stat : playerStats.values()) {
allPairs.addAll(stat.getPairStats().values());
}
allPairs.sort((p1, p2) ->
Integer.compare(p2.getTotalPasses(), p1.getTotalPasses()));
System.out.println("最佳配对组合(按传球次数排序):");
for (int i = 0; i < Math.min(3, allPairs.size()); i++) {
PassPairStat pair = allPairs.get(i);
if (pair.getTotalPasses() > 0) {
System.out.printf("第%d名:%s → %s,传球%d次,成功率%.2f%%%n",
i + 1,
pair.passer.getName(),
pair.receiver.getName(),
pair.getTotalPasses(),
pair.getSuccessRate());
}
}
// 分析传球成功率趋势
System.out.println("\n传球成功率趋势(按时间段):");
int periodSize = Math.max(1, passRecords.size() / 3);
for (int i = 0; i < passRecords.size(); i += periodSize) {
int endIndex = Math.min(i + periodSize, passRecords.size());
int periodPasses = 0;
int periodSuccesses = 0;
for (int j = i; j < endIndex; j++) {
periodPasses++;
if (passRecords.get(j).isSuccessful()) {
periodSuccesses++;
}
}
double rate = periodPasses == 0 ? 0 :
(double) periodSuccesses / periodPasses * 100;
System.out.printf("第%d个时段:传球%d次,成功率%.2f%%%n",
i / periodSize + 1, periodPasses, rate);
}
}
}
// 主程序
public static void main(String[] args) {
// 创建统计系统
StatisticSystem system = new StatisticSystem();
// 模拟比赛(100次传球)
system.simulateMatch(100);
// 输出各项统计
system.printPlayerStatistics();
system.printPairStatistics();
system.printTeamStatistics();
system.analyzeCooperation();
// 手动添加一些特定记录演示
System.out.println("\n========== 手动添加测试记录 ==========");
system.recordPass("P001", "P002", true, 12.5);
system.recordPass("P001", "P003", false, 8.3);
system.recordPass("P003", "P001", true, 15.0);
// 查看更新后的统计
system.printPlayerStatistics();
}
}
功能说明
核心功能
- 球员管理:管理球队球员信息(编号、姓名、位置)
- 传球记录:记录每次短传的传球者和接球者、是否成功
- 统计分析:计算个人、配对和球队整体的短传配合成功率
统计维度
- 个人统计:每个球员的传球成功率和接球成功率
- 配对统计:特定球员组合之间的配合成功率
- 位置统计:前锋、中场、后卫的传球成功率对比
- 趋势分析:比赛不同阶段的成功率变化
模拟功能
- 自动模拟一场比赛的传球数据
- 可手动添加特定的传球记录
- 模拟真实比赛的成功率范围
输出展示
- 使用表格格式清晰展示统计结果
- 包含详细的球员配对配合分析
- 形成可视化的统计报告
运行示例输出
========== 比赛模拟开始 ==========
预计传球次数:100
========== 比赛模拟结束 ==========
========== 球员个人统计 ==========
┌──────┬────────┬────────┬────────┬──────────┬────────────┬────────────┐
│ 编号 │ 球员 │ 位置 │ 传球数 │ 成功数 │ 成功率(%) │ 接球成功率 │
├──────┼────────┼────────┼────────┼──────────┼────────────┼────────────┤
│ P003 │ 张伟 │ 中场 │ 15 │ 12 │ 80.00% │ 75.00% │
│ P001 │ 王强 │ 前锋 │ 14 │ 11 │ 78.57% │ 82.35% │
...
这个系统可以根据实际需求进行扩展,
- 增加更多球员统计指标
- 引入传球距离、传球时机等更多维度
- 可视化图表展示
- 数据库持久化存储
- 实时比赛数据接入