Java案例:统计假动作晃过防守几次
下面是一个完整的Java示例,模拟篮球运动员做假动作晃过防守球员的场景,并统计成功晃过防守的次数。

完整代码
import java.util.Random;
/**
* 假动作晃人统计系统
*/
public class FakeMoveCounter {
// 假动作类型枚举
enum FakeMove {
PUMP_FAKE("投篮假动作"),
PASS_FAKE("传球假动作"),
DRIVE_FAKE("突破假动作"),
STEP_BACK("后撤步假动作"),
HEAD_FAKE("头部假动作");
private final String name;
FakeMove(String name) { this.name = name; }
public String getName() { return name; }
}
// 球员类
static class Player {
private String name;
private int totalAttempts = 0; // 总假动作次数
private int successCount = 0; // 成功晃过次数
public Player(String name) { this.name = name; }
/**
* 执行假动作
* @param move 假动作类型
* @param defenderReaction 防守球员反应灵敏度(0~1)
* @return 是否晃过防守
*/
public boolean performFakeMove(FakeMove move, double defenderReaction) {
totalAttempts++;
Random random = new Random();
// 不同假动作基础成功率
double baseRate = switch (move) {
case PUMP_FAKE -> 0.75;
case PASS_FAKE -> 0.60;
case DRIVE_FAKE -> 0.65;
case STEP_BACK -> 0.70;
case HEAD_FAKE -> 0.50;
};
// 防守反应越灵敏,成功率越低
double finalRate = baseRate * (1 - defenderReaction * 0.7);
boolean success = random.nextDouble() < finalRate;
if (success) {
successCount++;
System.out.printf(" ✅ %s 使用【%s】成功晃过防守!%n", name, move.getName());
} else {
System.out.printf(" ❌ %s 使用【%s】被识破,防守未失位。%n", name, move.getName());
}
return success;
}
/** 统计信息 */
public void printStats() {
System.out.println("\n===== 球员统计 =====");
System.out.println("球员: " + name);
System.out.println("假动作总次数: " + totalAttempts);
System.out.println("成功晃过次数: " + successCount);
double rate = totalAttempts == 0 ? 0 : (successCount * 100.0 / totalAttempts);
System.out.printf("成功率: %.2f%%%n", rate);
}
public int getSuccessCount() { return successCount; }
public int getTotalAttempts() { return totalAttempts; }
}
// 主程序
public static void main(String[] args) {
Player kyrie = new Player("欧文");
Player curry = new Player("库里");
System.out.println("===== 比赛开始:假动作对决 =====");
// 模拟欧文在一对一中的假动作序列
FakeMove[] sequence1 = {
FakeMove.PUMP_FAKE,
FakeMove.DRIVE_FAKE,
FakeMove.HEAD_FAKE,
FakeMove.STEP_BACK,
FakeMove.PUMP_FAKE
};
System.out.println("\n▶ 欧文 面对 防守者A (灵敏度0.5):");
for (FakeMove m : sequence1) {
kyrie.performFakeMove(m, 0.5);
}
// 模拟库里假动作序列
FakeMove[] sequence2 = {
FakeMove.PASS_FAKE,
FakeMove.PUMP_FAKE,
FakeMove.DRIVE_FAKE
};
System.out.println("\n▶ 库里 面对 防守者B (灵敏度0.7):");
for (FakeMove m : sequence2) {
curry.performFakeMove(m, 0.7);
}
// 输出统计
kyrie.printStats();
curry.printStats();
// 汇总
int totalSuccess = kyrie.getSuccessCount() + curry.getSuccessCount();
int totalAttempts = kyrie.getTotalAttempts() + curry.getTotalAttempts();
System.out.println("\n===== 全场汇总 =====");
System.out.println("总假动作次数: " + totalAttempts);
System.out.println("总晃过防守次数: " + totalSuccess);
System.out.printf("整体成功率: %.2f%%%n",
totalAttempts == 0 ? 0 : totalSuccess * 100.0 / totalAttempts);
}
}
运行结果示例
===== 比赛开始:假动作对决 =====
▶ 欧文 面对 防守者A (灵敏度0.5):
✅ 欧文 使用【投篮假动作】成功晃过防守!
✅ 欧文 使用【突破假动作】成功晃过防守!
❌ 欧文 使用【头部假动作】被识破,防守未失位。
✅ 欧文 使用【后撤步假动作】成功晃过防守!
✅ 欧文 使用【投篮假动作】成功晃过防守!
▶ 库里 面对 防守者B (灵敏度0.7):
❌ 库里 使用【传球假动作】被识破,防守未失位。
✅ 库里 使用【投篮假动作】成功晃过防守!
❌ 库里 使用【突破假动作】被识破,防守未失位。
===== 球员统计 =====
球员: 欧文
假动作总次数: 5
成功晃过次数: 4
成功率: 80.00%
球员: 库里
假动作总次数: 3
成功晃过次数: 1
成功率: 33.33%
===== 全场汇总 =====
总假动作次数: 8
总晃过防守次数: 5
整体成功率: 62.50%
代码要点说明
| 要素 | 说明 |
|---|---|
枚举 FakeMove |
定义5种假动作并绑定各自基础成功率 |
performFakeMove() |
核心方法:计算成功率 → 随机判定 → 累加计数 |
| 难度建模 | finalRate = baseRate * (1 - defenderReaction * 0.7),防守越灵敏成功率越低 |
| 统计字段 | totalAttempts(总次数)、successCount(成功次数) |
printStats() |
输出每个球员的详细数据与成功率 |
扩展思路
- 真实数据接入:把
Random替换为读取NBA追踪数据的概率模型。 - 连续组合技能:假投 + 突破"连招提高成功率。
- 持久化统计:将结果写入数据库或 CSV 文件,用于赛季累计。
- 多人对抗:引入防守球员类,双方属性博弈计算成功率。
如果你想要更简单的版本(比如只用数组和循环)或者面向对象更完整的版本(含防守球员类、多回合比赛模拟),告诉我即可,我可以再给一份。
版权声明:本站文章为原创整理,转载请注明出处。