本文目录导读:

我来为您创建一个门球短传配合成功率的统计案例,这个案例将模拟门球比赛中球员之间的短传配合数据统计。
实现代码
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% │
...
这个系统可以根据实际需求进行扩展,
- 增加更多球员统计指标
- 引入传球距离、传球时机等更多维度
- 可视化图表展示
- 数据库持久化存储
- 实时比赛数据接入
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播