本文目录导读:

这是一个很经典的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%
=== 分析结论 ===
强防守者对于弱进攻者的防守成功率显著更高,符合预期。
如何扩展?
你可以尝试:
- 增加位置影响(如内线防守外线投篮不同)。
- 加入体力值——多次防守后能力下降。
- 增加协防系统——双人包夹时的成功率变化。
- 使用多线程并发模拟,提高效率。
如果你希望我把它改成图形界面(Swing/JavaFX)或者Web版(Spring Boot + 前端),也可以告诉我,我可以帮你扩展这个案例。