本文目录导读:

我来为您编写一个统计直塞球成功率的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%)
主要功能
- 数据模拟:模拟5场比赛,每场10名球员的直塞球数据
- 结果分类:分为成功、失败、出界、被截获四种情况
- 成功率计算:计算球员个人和整体的成功率
- 排名统计:按成功率对球员进行排序
- 详细分析:展示各类结果的具体比例
概率控制
- 成功:40%
- 失败:30%
- 出界:15%
- 被截获:15%
用户可以根据实际需求调整概率分布和模拟场次,这个系统可以帮助教练和分析师统计球员的直塞球表现,评估传球质量。