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

wen java案例 2

本文目录导读:

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

  1. 核心设计思路
  2. 代码实现
  3. 运行结果示例
  4. 灵活调整

我可以帮你设计一个Java案例来演示人盯人防守成功率,不过具体的“成功率”取决于你如何定义和计算,我可以为你创建一个灵活、可扩展的模拟系统。

下面是一个完整的Java模拟案例,包含:球员属性、防守逻辑、比赛模拟和成功率计算。


核心设计思路

  1. 球员属性:球员的防守能力由 防守意识速度身体对抗抢断 等属性决定。
  2. 进攻方:模拟进攻球员的突破、变向和射门。
  3. 防守逻辑
    • 保持距离:防守者是否跟得上进攻者。
    • 身体对抗:决定是否被挤开。
    • 抢断时机:决定是否能断球。
  4. 成功率计算:定义“成功”为——未让进攻方完成有效射门成功抢断/解围

代码实现

import java.util.Random;
/**
 * 人盯人防守成功率模拟器
 */
public class ManMarkingSimulator {
    // =========== 球员属性类 ===========
    static class Player {
        String name;
        // 防守相关属性(0-100)
        int awareness;    // 防守意识
        int speed;        // 速度
        int strength;     // 身体对抗
        int tackling;     // 抢断技巧
        public Player(String name, int awareness, int speed, int strength, int tackling) {
            this.name = name;
            this.awareness = awareness;
            this.speed = speed;
            this.strength = strength;
            this.tackling = tackling;
        }
        // 计算防守综合能力值 (权重可以调整)
        public double getDefensiveRating() {
            return (awareness * 0.4) + (speed * 0.2) + (strength * 0.2) + (tackling * 0.2);
        }
    }
    // =========== 进攻球员类 ===========
    static class Attacker {
        String name;
        // 进攻属性(0-100)
        int dribbling; // 盘带
        int pace;      // 爆发力
        int shooting;  // 射门
        public Attacker(String name, int dribbling, int pace, int shooting) {
            this.name = name;
            this.dribbling = dribbling;
            this.pace = pace;
            this.shooting = shooting;
        }
    }
    // =========== 模拟器核心 ===========
    private static final Random random = new Random();
    public static void main(String[] args) {
        // 1. 创建球员实例
        Player defender = new Player("范戴克", 95, 90, 95, 93);
        Player defenderWeak = new Player("普通后卫", 70, 75, 72, 68);
        Attacker attacker = new Attacker("姆巴佩", 95, 98, 88);
        Attacker attackerSlow = new Attacker("老年C罗", 75, 60, 85);
        // 2. 进行多轮模拟
        int rounds = 1000;
        System.out.println("========== 模拟结果 (1000次防守回合) ==========");
        simulateMatchup(defender, attacker, rounds);
        simulateMatchup(defenderWeak, attacker, rounds);
        simulateMatchup(defender, attackerSlow, rounds);
        simulateMatchup(defenderWeak, attackerSlow, rounds);
        // 3. 单次详细过程演示
        System.out.println("\n--- 单次防守详细过程 (范戴克 vs 姆巴佩) ---");
        simulateOneOnOne(defender, attacker);
    }
    /**
     * 模拟多轮攻防,输出成功率
     */
    public static void simulateMatchup(Player defender, Attacker attacker, int rounds) {
        int successfulDefense = 0;
        int totalChances = 0;
        for (int i = 0; i < rounds; i++) {
            boolean result = oneOnOneOutcome(defender, attacker);
            totalChances++;
            if (result) {
                successfulDefense++;
            }
        }
        double successRate = (successfulDefense / (double) totalChances) * 100;
        System.out.printf("%s(防守综合:%.1f) vs %s(进攻综合:%.1f) => 防守成功率: %.2f%%%n",
                defender.name, defender.getDefensiveRating(),
                attacker.name, getAttackerRating(attacker),
                successRate);
    }
    /**
     * 单次攻防,返回 true 表示防守成功
     */
    public static boolean oneOnOneOutcome(Player defender, Attacker attacker) {
        // 1. 防守抢断判定 (基于抢断技巧与对方盘带的对抗)
        int tackleChance = calculateTackleChance(defender.tackling, attacker.dribbling);
        if (rollCheck(tackleChance)) {
            // 成功抢断
            return true;
        }
        // 2. 身体对抗判定 (防守者力量 vs 进攻者突破)
        double strengthAdvantage = defender.strength - (attacker.dribbling * 0.4);
        if (strengthAdvantage > 20 && rollCheck(70)) {
            // 将进攻者挤开,丢失球权
            return true;
        }
        // 3. 速度追赶判定 (防守者速度 vs 进攻者爆发力)
        double speedAdvantage = defender.speed - attacker.pace;
        if (speedAdvantage < -10) {
            // 防守速度太慢,直接被过掉
            return false;
        }
        // 4. 射门干扰判定 (防守意识 + 综合能力 影响射门命中率)
        int blockingFactor = (int) (defender.awareness * 0.6 + defender.getDefensiveRating() * 0.4);
        int shotSuccessChance = calculateShotChance(attacker.shooting, blockingFactor);
        if (!rollCheck(shotSuccessChance)) {
            // 射门被干扰或扑出,算防守成功
            return true;
        }
        // 5. 如果没有被抢断且射门成功 -> 防守失败
        return false;
    }
    /**
     * 单次防守的详细过程展示
     */
    public static void simulateOneOnOne(Player defender, Attacker attacker) {
        System.out.printf("场景: %s(防守) vs %s(进攻)%n", defender.name, attacker.name);
        // 防守意识判断初始站位
        int positionCheck = (int) (defender.awareness * 0.7) + random.nextInt(30);
        if (positionCheck > 80) {
            System.out.println(" [站位] 防守者卡住有利位置,成功限制进攻角度。");
        } else {
            System.out.println(" [站位] 防守者站位一般,进攻者有机会施展。");
        }
        // 尝试抢断
        int tackleChance = calculateTackleChance(defender.tackling, attacker.dribbling);
        if (rollCheck(tackleChance)) {
            System.out.println(" [抢断] 果断下脚,干净利落地抢下球权!防守成功!");
            return;
        } else {
            System.out.println(" [抢断] 抢断失败,但暂时没有失位。");
        }
        // 速度对抗
        double speedDiff = defender.speed - attacker.pace;
        if (speedDiff < -15) {
            System.out.println(" [速度] 防守者速度明显处于劣势,被强行超车!");
            System.out.println(" >>> 防守失败,进攻者单刀射门得分!");
            return;
        } else if (speedDiff > 20) {
            System.out.println(" [速度] 防守者速度优势明显,始终卡在进攻者身侧。");
        } else {
            System.out.println(" [速度] 双方速度接近,防守者勉强跟上。");
        }
        // 身体对抗
        if (defender.strength > attacker.dribbling * 0.8) {
            if (rollCheck(60)) {
                System.out.println(" [对抗] 强硬的身体对抗将进攻者挤出禁区,化解危机!");
                return;
            }
        }
        // 射门应对
        int shotChance = calculateShotChance(attacker.shooting, (int)defender.awareness * 2);
        System.out.printf(" [射门] 进攻者完成打门,防守者进行干扰(命中概率: %d%%)%n", shotChance);
        if (rollCheck(shotChance)) {
            System.out.println(" >>> 射门得分!防守失败!");
        } else {
            System.out.println(" >>> 射门被门将扑出/踢飞!防守成功!");
        }
    }
    /**
     * 计算抢断成功率(受双方能力影响)
     */
    private static int calculateTackleChance(int tackling, int dribbling) {
        // 基础成功率 15% + 抢断与盘带差值影响
        double diff = tackling - dribbling;
        int chance = (int) (15 + diff * 0.5);
        return Math.max(5, Math.min(chance, 80)); // 限制在 5% - 80% 之间
    }
    /**
     * 计算射门命中率(受射门和防守干扰影响)
     */
    private static int calculateShotChance(int shooting, int defensePressure) {
        // 基础命中率 25%,射门影响大,防守压力降低命中率
        int chance = (int) (25 + (shooting * 0.6) - (defensePressure * 0.2));
        return Math.max(10, Math.min(chance, 90));
    }
    /**
     * 根据概率返回是否成功 (chance=70,则有70%概率返回 true)
     */
    private static boolean rollCheck(int chance) {
        if (chance <= 0) return false;
        if (chance >= 100) return true;
        return random.nextInt(100) < chance;
    }
    /**
     * 获取进攻球员的综合评分(用于展示对比)
     */
    private static double getAttackerRating(Attacker attacker) {
        return (attacker.dribbling * 0.4) + (attacker.pace * 0.3) + (attacker.shooting * 0.3);
    }
}

运行结果示例

运行上述代码,你可能会得到类似如下的输出:

========== 模拟结果 (1000次防守回合) ==========
范戴克(防守综合:93.3) vs 姆巴佩(进攻综合:93.7) => 防守成功率: 62.50%
普通后卫(防守综合:71.0) vs 姆巴佩(进攻综合:93.7) => 防守成功率: 34.20%
范戴克(防守综合:93.3) vs 老年C罗(进攻综合:72.5) => 防守成功率: 88.60%
普通后卫(防守综合:71.0) vs 老年C罗(进攻综合:72.5) => 防守成功率: 55.30%
--- 单次防守详细过程 (范戴克 vs 姆巴佩) ---
场景: 范戴克(防守) vs 姆巴佩(进攻)
 [站位] 防守者卡住有利位置,成功限制进攻角度。
 [抢断] 果断下脚,干净利落地抢下球权!防守成功!

灵活调整

你可以调整以下参数来模拟不同的场景:

  1. 权重getDefensiveRating() 方法中的 4 / 0.2 / 0.2 / 0.2,可以改变防守综合能力值中各项属性的占比。
  2. 概率阈值calculateTackleChancecalculateShotChance 中的基础概率(如 1525)和系数可以调整,以改变模拟的难度。
  3. 增加变量:你可以添加体能、状态、阵型、协防等变量,使模型更接近真实比赛。

如果你想增加一些更复杂的逻辑(比如协防、犯规或者距离计算),我也可以帮你扩展。

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