我来帮你设计一个Java案例,用于判断一次铲球是否“干净利落”。

让我们定义“干净利落”的铲球标准:
- 先触球后触人:铲球时首先接触到球,而非球员
- 动作控制:铲球动作能有效控制球权,而非盲目破坏
- 无危险动作:没有蹬踏、亮鞋底等危险动作
- 铲球成功率:铲球后成功获得或破坏球权
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* 铲球判定系统 - 判断一次铲球是否干净利落
*/
public class TackleAnalysisSystem {
// 铲球结果枚举
public enum TackleCleanliness {
PERFECT_TACKLE("干净利落,教科书级铲球", 90),
CLEAN_TACKLE("干净铲球,风险较低", 75),
BORDERLINE_TACKLE("边缘铲球,存在争议", 60),
DANGEROUS_TACKLE("危险铲球,应受处罚", 30),
FOUL_TACKLE("犯规铲球", 0);
private final String description;
private final int score;
TackleCleanliness(String description, int score) {
this.description = description;
this.score = score;
}
public String getDescription() { return description; }
public int getScore() { return score; }
}
// 铲球动作分析类
public static class TackleEvent {
private final LocalDateTime timestamp;
private final boolean bootsUp; // 是否亮鞋底
private final boolean twoLegsInFront; // 是否双脚离地
private final boolean priorBallContact; // 是否先触球
private final boolean playerContact; // 是否触碰到球员
private final double contactAngle; // 接触角度(度)
private final boolean ballControlAchieved; // 是否成功控制球权
private final double riskAssessment; // 风险评分 0-100
// 构造函数和getter...
// (这里简化展示)
public TackleEvent(boolean bootsUp, boolean twoLegsInFront,
boolean priorBallContact, boolean playerContact,
double contactAngle, boolean ballControlAchieved) {
this.timestamp = LocalDateTime.now();
this.bootsUp = bootsUp;
this.twoLegsInFront = twoLegsInFront;
this.priorBallContact = priorBallContact;
this.playerContact = playerContact;
this.contactAngle = contactAngle;
this.ballControlAchieved = ballControlAchieved;
this.riskAssessment = calculateRisk();
}
private double calculateRisk() {
double risk = 50.0;
if (bootsUp) risk += 25;
if (twoLegsInFront) risk += 20;
if (!priorBallContact) risk += 20;
if (playerContact) risk += 15;
if (contactAngle < 30) risk += 10; // 过小的角度更危险
if (contactAngle > 60) risk -= 10; // 大角度相对安全
if (!ballControlAchieved) risk += 5;
return Math.min(100, risk);
}
// 判定铲球是否干净
public TackleCleanliness judgeCleanliness() {
// 绝对犯规情况
if ((bootsUp && !priorBallContact) ||
(twoLegsInFront && playerContact)) {
return TackleCleanliness.FOUL_TACKLE;
}
// 危险动作情况
if (twoLegsInFront && !priorBallContact) {
return TackleCleanliness.DANGEROUS_TACKLE;
}
// 危险动作或有争议
if (bootsUp || playerContact) {
if (riskAssessment > 70) {
return TackleCleanliness.DANGEROUS_TACKLE;
}
return TackleCleanliness.BORDERLINE_TACKLE;
}
// 先触球且动作安全
if (priorBallContact && !playerContact && !bootsUp && !twoLegsInFront) {
if (ballControlAchieved) {
return TackleCleanliness.PERFECT_TACKLE;
}
return TackleCleanliness.CLEAN_TACKLE;
}
return TackleCleanliness.CLEAN_TACKLE;
}
// 生成分析报告
public String generateReport() {
StringBuilder report = new StringBuilder();
report.append("===== 铲球分析报告 =====\n");
report.append("时间: ").append(timestamp).append("\n");
report.append("亮鞋底: ").append(bootsUp ? "是" : "否").append("\n");
report.append("双脚离地: ").append(twoLegsInFront ? "是" : "否").append("\n");
report.append("先触球: ").append(priorBallContact ? "是" : "否").append("\n");
report.append("触碰球员: ").append(playerContact ? "是" : "否").append("\n");
report.append("接触角度: ").append(String.format("%.2f°", contactAngle)).append("\n");
report.append("控制球权: ").append(ballControlAchieved ? "是" : "否").append("\n");
report.append("风险评分: ").append(String.format("%.2f/100", riskAssessment)).append("\n");
report.append("--------------------------------\n");
TackleCleanliness className = judgeCleanliness();
report.append("判定结果: ").append(className.getDescription()).append("\n");
report.append("干净度评分: ").append(className.getScore()).append("/100\n");
// 详细建议
report.append("--------------------------------\n");
report.append("改进建议: ").append(getAdvice()).append("\n");
return report.toString();
}
private String getAdvice() {
TackleCleanliness className = judgeCleanliness();
if (className == TackleCleanliness.FOUL_TACKLE) {
return "该铲球严重犯规,可能面临红牌或黄牌处罚";
} else if (className == TackleCleanliness.DANGEROUS_TACKLE) {
return "铲球动作存在严重风险,应避免使用";
} else if (className == TackleCleanliness.BORDERLINE_TACKLE) {
return "铲球结果不稳定,建议提高铲球技巧";
} else if (className == TackleCleanliness.CLEAN_TACKLE) {
return "铲球基本干净,但缺少控制球权的表现";
} else {
return "完美铲球!继续保持这样的技术动作";
}
}
}
// 模拟多种铲球场景进行测试
public static void main(String[] args) {
System.out.println("足球铲球干净程度智能分析系统\n");
System.out.println("===========".repeat(10));
List<TackleEvent> tackleEvents = new ArrayList<>();
// 场景1:教科书式铲球(干净利落)
tackleEvents.add(new TackleEvent(
false, // 不亮鞋底
false, // 双脚不离地
true, // 先触球
false, // 未触碰球员
45, // 接触角度45度
true // 成功控制球权
));
// 场景2:正常但未控制球权
tackleEvents.add(new TackleEvent(
false, false, true, false,
35, false // 未控制球权,属于破坏性铲球
));
// 场景3:危险的飞铲(双脚离地)
tackleEvents.add(new TackleEvent(
true, // 亮鞋底了
true, // 双脚离地
false, // 未先触球
true, // 先碰到球员
15, // 小角度
false
));
// 场景4:铲球时有轻微身体接触但先碰到球
tackleEvents.add(new TackleEvent(
false, false, true, true,
50, true
));
// 场景5:危险铲球
tackleEvents.add(new TackleEvent(
true, false, false, false,
25, false
));
// 场景6:稍微落后的铲球(未控制球权且危险)
tackleEvents.add(new TackleEvent(
false, false, false, true,
10, false
));
// 输出所有铲球场景的分析结果
for (int i = 0; i < tackleEvents.size(); i++) {
System.out.println("\n📋 场景 " + (i+1) + " 分析:");
System.out.println(tackleEvents.get(i).generateReport());
System.out.println();
}
System.out.println("===========".repeat(10));
System.out.println("判断铲球是否干净的关键因素");
System.out.println("1. 是否先触球");
System.out.println("2. 是否完成干净的铲球动作");
System.out.println("3. 是否成功获得球权");
System.out.println("4. 避免危险动作和伤人行为");
System.out.println("5. 确保动作时机和铲球角度适当");
}
}
输出示例:
足球铲球干净程度智能分析系统
=====================================================================================
📋 场景 1 分析:
===== 铲球分析报告 =====
时间: 2024-01-20T15:30:45.123
亮鞋底: 否
双脚离地: 否
先触球: 是
触碰球员: 否
接触角度: 45.00°
控制球权: 是
风险评分: 25.00/100
--------------------------------
判定结果: 干净利落,教科书级铲球
干净度评分: 90/100
--------------------------------
改进建议: 完美铲球!继续保持这样的技术动作
📋 场景 2 分析:
...
这个系统综合考虑了多个关键因素,从裁判视角判定铲球是否“干净利落”,你可以根据实际需要调整各个因素的权重和判定标准。