这个java案例显示人盯人防守成功率?

wen java案例 8

本文目录导读:

这个java案例显示人盯人防守成功率?

  1. 案例设计思路
  2. Java 代码实现
  3. 运行效果示例
  4. 核心逻辑解释
  5. 扩展思考

这是一个经典的“人盯人防守成功率”Java案例,它通常用于模拟或计算在篮球、足球等团队运动中,采用人盯人战术时的防守效率。

我为你设计了一个控制台程序,用于模拟一场比赛中“人盯人”战术的防守成功率,并给出统计结果。

案例设计思路

  1. 定义“成功”:防守成功指“投篮不中”、“抢断”、“迫使失误”或“封盖”。
  2. 模拟逻辑:使用随机数模拟每一次对方的进攻,并根据“防守强度”和“进攻能力”计算成功率。
  3. 统计输出:统计总防守次数、成功次数和成功率。

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%
============================================

核心逻辑解释

这个案例的核心在于概率计算模型

  1. 对抗模型:防守方与进攻方产生对抗,我们将防守强度(defenseIntensity)和进攻能力(offensivePower)作为两个权重。
  2. 波动因素:现实中,防守和进攻的发挥是有波动的,代码中通过 8 + random.nextDouble() * 0.4 模拟了“发挥失常”和“超常发挥”的区间(±20%)。
  3. 胜率公式防守成功率 = 防守因子 / (防守因子 + 进攻因子)
    • 如果防守强度远大于进攻能力,成功率趋近于1(很高)。
    • 如果防守强度远小于进攻能力,成功率趋近于0(很低)。
    • 如果两者相等,成功率正好为50%。

扩展思考

如果你想用这个案例展示“人盯人”与“区域联防”的对比,可以将此代码抽象出一个接口(或基类),分别实现 ManToManDefenseZoneDefense,然后比较两者的成功率。

抱歉,评论功能暂时关闭!