本文目录导读:

这是一个经典的“人盯人防守成功率”Java案例,它通常用于模拟或计算在篮球、足球等团队运动中,采用人盯人战术时的防守效率。
我为你设计了一个控制台程序,用于模拟一场比赛中“人盯人”战术的防守成功率,并给出统计结果。
案例设计思路
- 定义“成功”:防守成功指“投篮不中”、“抢断”、“迫使失误”或“封盖”。
- 模拟逻辑:使用随机数模拟每一次对方的进攻,并根据“防守强度”和“进攻能力”计算成功率。
- 统计输出:统计总防守次数、成功次数和成功率。
Java 代码实现
import java.util.Random;
import java.util.Scanner;
/**
* 人盯人防守成功率模拟器
* 模拟一场比赛中,防守方采用人盯人战术时,防守成功的概率。
*/
public class ManToManDefenseSimulator {
// 防守属性
private double defenseIntensity; // 防守强度 (0.0 - 1.0),越高越强
private String defenderName; // 防守方名称
// 进攻属性
private double offensivePower; // 进攻能力 (0.0 - 1.0),越高越强
private String attackerName; // 进攻方名称
private Random random = new Random();
// 统计类
static class DefenseStats {
int totalPlays = 0; // 总防守回合数
int successfulDefenses = 0; // 成功防守次数
double getSuccessRate() {
if (totalPlays == 0) return 0;
return (double) successfulDefenses / totalPlays;
}
}
public ManToManDefenseSimulator(double defenseIntensity, double offensivePower) {
this.defenderName = "防守队";
this.attackerName = "进攻队";
this.defenseIntensity = clamp(defenseIntensity, 0, 1);
this.offensivePower = clamp(offensivePower, 0, 1);
}
// 将数值限制在 0-1 之间
private double clamp(double value, double min, double max) {
return Math.max(min, Math.min(max, value));
}
/**
* 模拟一次防守回合
* @return true 表示防守成功,false 表示防守失败(进攻方得分或命中)
*/
private boolean simulateOnePlay() {
// 基础成功率计算:
// 防守强度越高,成功率越高;进攻能力越高,成功率越低。
// 加入随机因素:防守强度发挥的波动(0.8 - 1.2)
double defenseFactor = defenseIntensity * (0.8 + random.nextDouble() * 0.4); // 0.8-1.2波动
double offenseFactor = offensivePower * (0.8 + random.nextDouble() * 0.4);
// 综合评估:防守成功概率 = 防守因子 / (防守因子 + 进攻因子)
// 当防守强度与进攻能力相当时,成功率约为 50%
double successProbability = defenseFactor / (defenseFactor + offenseFactor);
// 使用随机数判断本次防守是否成功
return random.nextDouble() < successProbability;
}
/**
* 模拟多回合比赛
* @param plays 模拟的回合数
*/
public DefenseStats simulateGame(int plays) {
DefenseStats stats = new DefenseStats();
for (int i = 0; i < plays; i++) {
stats.totalPlays++;
if (simulateOnePlay()) {
stats.successfulDefenses++;
}
}
return stats;
}
/**
* 打印统计报告
*/
public static void printReport(int plays, DefenseStats stats) {
System.out.println("============================================");
System.out.println(" 人盯人防守战术模拟结果报告");
System.out.println("============================================");
System.out.printf("模拟场次(防守回合数): %d 次%n", plays);
System.out.printf("防守成功次数: %d 次%n", stats.successfulDefenses);
System.out.printf("防守失败次数: %d 次%n", stats.totalPlays - stats.successfulDefenses);
System.out.printf("防守成功率: %.2f%%%n", stats.getSuccessRate() * 100);
System.out.println("--------------------------------------------");
System.out.println("说明:防守强度与进攻能力相当则成功率约50%");
System.out.println("============================================");
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 1. 用户输入参数
System.out.println("请输入防守强度(0.0 - 1.0,0.8):");
double defStr = scanner.nextDouble();
System.out.println("请输入进攻能力(0.0 - 1.0,0.7):");
double offPow = scanner.nextDouble();
System.out.println("请输入模拟的进攻回合数(100):");
int plays = scanner.nextInt();
// 2. 创建模拟器
ManToManDefenseSimulator simulator = new ManToManDefenseSimulator(defStr, offPow);
// 3. 执行模拟
DefenseStats stats = simulator.simulateGame(plays);
// 4. 输出报告
printReport(plays, stats);
scanner.close();
}
}
运行效果示例
输入:
请输入防守强度(0.0 - 1.0,0.8):
0.8
请输入进攻能力(0.0 - 1.0,0.7):
0.7
请输入模拟的进攻回合数(100):
100
输出:
============================================
人盯人防守战术模拟结果报告
============================================
模拟场次(防守回合数): 100 次
防守成功次数: 58 次
防守失败次数: 42 次
防守成功率: 58.00%
--------------------------------------------
说明:防守强度与进攻能力相当则成功率约50%
============================================
核心逻辑解释
这个案例的核心在于概率计算模型:
- 对抗模型:防守方与进攻方产生对抗,我们将防守强度(
defenseIntensity)和进攻能力(offensivePower)作为两个权重。 - 波动因素:现实中,防守和进攻的发挥是有波动的,代码中通过
8 + random.nextDouble() * 0.4模拟了“发挥失常”和“超常发挥”的区间(±20%)。 - 胜率公式:
防守成功率 = 防守因子 / (防守因子 + 进攻因子)。- 如果防守强度远大于进攻能力,成功率趋近于1(很高)。
- 如果防守强度远小于进攻能力,成功率趋近于0(很低)。
- 如果两者相等,成功率正好为50%。
扩展思考
如果你想用这个案例展示“人盯人”与“区域联防”的对比,可以将此代码抽象出一个接口(或基类),分别实现 ManToManDefense 和 ZoneDefense,然后比较两者的成功率。