本文目录导读:

我可以帮你设计一个Java案例来演示人盯人防守成功率,不过具体的“成功率”取决于你如何定义和计算,我可以为你创建一个灵活、可扩展的模拟系统。
下面是一个完整的Java模拟案例,包含:球员属性、防守逻辑、比赛模拟和成功率计算。
核心设计思路
- 球员属性:球员的防守能力由
防守意识、速度、身体对抗、抢断等属性决定。 - 进攻方:模拟进攻球员的突破、变向和射门。
- 防守逻辑:
- 保持距离:防守者是否跟得上进攻者。
- 身体对抗:决定是否被挤开。
- 抢断时机:决定是否能断球。
- 成功率计算:定义“成功”为——未让进攻方完成有效射门 或 成功抢断/解围。
代码实现
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 姆巴佩(进攻)
[站位] 防守者卡住有利位置,成功限制进攻角度。
[抢断] 果断下脚,干净利落地抢下球权!防守成功!
灵活调整
你可以调整以下参数来模拟不同的场景:
- 权重:
getDefensiveRating()方法中的4 / 0.2 / 0.2 / 0.2,可以改变防守综合能力值中各项属性的占比。 - 概率阈值:
calculateTackleChance和calculateShotChance中的基础概率(如15、25)和系数可以调整,以改变模拟的难度。 - 增加变量:你可以添加体能、状态、阵型、协防等变量,使模型更接近真实比赛。
如果你想增加一些更复杂的逻辑(比如协防、犯规或者距离计算),我也可以帮你扩展。