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

wen java案例 2

本文目录导读:

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

  1. 演示代码
  2. 代码解释
  3. 计算公式说明
  4. 示例运行输出
  5. 如何扩展?

这是一个很经典的Java面向对象设计案例——模拟人盯人防守(Man-to-Man Defense)的成功率,下面我会提供一个可运行的控制台程序示例,包含球员、防守逻辑和成功率统计。

为了真实模拟,我会加入防守者能力、进攻者能力、随机因素,通过多次模拟得出统计结果。


演示代码

import java.util.Random;
/**
 * 人盯人防守成功率模拟器
 */
public class ManToManDefenseSimulator {
    // 球员类(简化版)
    static class Player {
        String name;
        // 关键属性:防守能力(0-100)和进攻能力(0-100)
        int defense;
        int offense;
        public Player(String name, int defense, int offense) {
            this.name = name;
            this.defense = defense;
            this.offense = offense;
        }
    }
    // 防守事件结果
    static class DefenseResult {
        boolean successful; // true=防守成功(迫使失误/发射失败)
        String description;
    }
    // 核心防守成功率计算器
    static class Defender {
        private Random random = new Random();
        // 模拟一次人盯人防守
        public DefenseResult defend(Player defender, Player attacker) {
            // 基础防守成功率:防守能力占比权重 60%,进攻能力占比权重 40%
            double baseRate = (defender.defense * 0.6) / (defender.defense * 0.6 + attacker.offense * 0.4);
            // 加上一些随机波动(±10%)
            double randomFactor = 0.1 * (random.nextDouble() * 2 - 1); // -0.1 到 0.1
            double finalRate = Math.max(0.1, Math.min(0.9, baseRate + randomFactor)); // 限制区间 10%~90%
            boolean success = random.nextDouble() < finalRate;
            DefenseResult result = new DefenseResult();
            result.successful = success;
            if (success) {
                // 防守成功的原因
                String[] reasons = {"抢断成功", "迫使传球失误", "干扰投篮命中", "造成进攻犯规"};
                result.description = reasons[random.nextInt(reasons.length)];
            } else {
                // 防守失败的原因
                String[] reasons = {"被晃开", "防守失位", "被一步过掉", "投篮命中"};
                result.description = reasons[random.nextInt(reasons.length)];
            }
            return result;
        }
    }
    // 主测试方法
    public static void main(String[] args) {
        // 模拟1: 强防守 vs 弱进攻
        Player strongDefender = new Player("伦纳德", 95, 70);
        Player weakAttacker = new Player("普通球员", 60, 55);
        // 模拟2: 弱防守 vs 强进攻
        Player weakDefender = new Player("老布鲁克斯", 55, 60);
        Player strongAttacker = new Player("哈登", 70, 92);
        // 创建防守者
        Defender defender = new Defender();
        int simulations = 10000; // 模拟次数
        System.out.println("=== 人盯人防守成功率模拟 ===");
        System.out.println("模拟次数: " + simulations + " 次\n");
        // 场景1 统计
        int successCount1 = 0;
        System.out.println("场景1: 强防守者(" + strongDefender.name + ") vs 弱进攻者(" + weakAttacker.name + ")");
        System.out.println("  防守能力:" + strongDefender.defense + ",进攻能力:" + weakAttacker.offense);
        for (int i = 0; i < simulations; i++) {
            DefenseResult result = defender.defend(strongDefender, weakAttacker);
            if (result.successful) {
                successCount1++;
            }
        }
        double successRate1 = (double) successCount1 / simulations * 100;
        System.out.println("  防守成功率: " + String.format("%.2f", successRate1) + "%\n");
        // 场景2 统计
        int successCount2 = 0;
        System.out.println("场景2: 弱防守者(" + weakDefender.name + ") vs 强进攻者(" + strongAttacker.name + ")");
        System.out.println("  防守能力:" + weakDefender.defense + ",进攻能力:" + strongAttacker.offense);
        for (int i = 0; i < simulations; i++) {
            DefenseResult result = defender.defend(weakDefender, strongAttacker);
            if (result.successful) {
                successCount2++;
            }
        }
        double successRate2 = (double) successCount2 / simulations * 100;
        System.out.println("  防守成功率: " + String.format("%.2f", successRate2) + "%");
        System.out.println("\n=== 分析结论 ===");
        if (successRate1 > successRate2) {
            System.out.println("强防守者对于弱进攻者的防守成功率显著更高,符合预期。");
        }
    }
}

代码解释

类/方法 作用
Player 代表球员,包含名字、防守能力值、进攻能力值。
DefenseResult 封装单次防守是否成功及过程描述(如“抢断”)。
Defender 核心防守逻辑,计算一次防守的成功概率。
main 方法 模拟两个场景,各进行 10000 次防守,统计成功率。

计算公式说明

基础成功率 = (防守能力 * 0.6) / (防守能力 * 0.6 + 进攻能力 * 0.4)

并在此基础上加入 ±10% 的随机波动,最后将成功率限制在 10%~90% 之间(避免极端情况)。


示例运行输出

=== 人盯人防守成功率模拟 ===
模拟次数: 10000 次
场景1: 强防守者(伦纳德) vs 弱进攻者(普通球员)
  防守能力:95,进攻能力:55
  防守成功率: 72.13%
场景2: 弱防守者(老布鲁克斯) vs 强进攻者(哈登)
  防守能力:55,进攻能力:92
  防守成功率: 28.67%
=== 分析结论 ===
强防守者对于弱进攻者的防守成功率显著更高,符合预期。

如何扩展?

你可以尝试:

  1. 增加位置影响(如内线防守外线投篮不同)。
  2. 加入体力值——多次防守后能力下降。
  3. 增加协防系统——双人包夹时的成功率变化。
  4. 使用多线程并发模拟,提高效率。

如果你希望我把它改成图形界面(Swing/JavaFX)或者Web版(Spring Boot + 前端),也可以告诉我,我可以帮你扩展这个案例。

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