Java案例:累计犯规次数已达危险
下面通过一个完整的Java案例来演示累计犯规次数达到危险阈值的判定逻辑。

案例场景
在体育比赛(如篮球、足球)系统中,需要实时监控球员的犯规次数,当累计犯规达到一定阈值时,触发"危险"预警,提示教练或裁判注意。
- 犯规次数 ≥ 5:危险(可能被罚下场)
- 犯规次数 = 4:警告
- 犯规次数 < 4:正常
完整代码实现
/**
* 球员犯规监控系统
* 演示累计犯规次数达到危险阈值的判定
*/
public class FoulMonitor {
// 危险犯规阈值
private static final int DANGER_THRESHOLD = 5;
// 警告犯规阈值
private static final int WARNING_THRESHOLD = 4;
/**
* 判断犯规等级
*/
public static String checkFoulLevel(int foulCount) {
if (foulCount >= DANGER_THRESHOLD) {
return "危险";
} else if (foulCount >= WARNING_THRESHOLD) {
return "警告";
} else {
return "正常";
}
}
/**
* 输出球员犯规状态
*/
public static void printFoulStatus(String playerName, int foulCount) {
String level = checkFoulLevel(foulCount);
System.out.printf("球员【%s】累计犯规 %d 次 → 状态:%s%n",
playerName, foulCount, level);
switch (level) {
case "危险":
System.out.println(" ⚠️ 已达危险!该球员面临被罚下场的风险!");
break;
case "警告":
System.out.println(" ⚡ 警告:再犯规一次将进入危险状态。");
break;
default:
System.out.println(" ✅ 状态正常。");
}
}
public static void main(String[] args) {
// 模拟球员在不同阶段的犯规次数
String player = "张伟";
int[] foulRecords = {1, 2, 3, 4, 5, 6};
System.out.println("===== 犯规累计监控 =====");
for (int foul : foulRecords) {
printFoulStatus(player, foul);
System.out.println("------------------------");
}
}
}
运行结果
===== 犯规累计监控 =====
球员【张伟】累计犯规 1 次 → 状态:正常
✅ 状态正常。
------------------------
球员【张伟】累计犯规 2 次 → 状态:正常
✅ 状态正常。
------------------------
球员【张伟】累计犯规 3 次 → 状态:正常
✅ 状态正常。
------------------------
球员【张伟】累计犯规 4 次 → 状态:警告
⚡ 警告:再犯规一次将进入危险状态。
------------------------
球员【张伟】累计犯规 5 次 → 状态:危险
⚠️ 已达危险!该球员面临被罚下场的风险!
------------------------
球员【张伟】累计犯规 6 次 → 状态:危险
⚠️ 已达危险!该球员面临被罚下场的风险!
------------------------
面向对象版本(推荐)
更贴近真实业务的写法,用类封装球员信息:
class Player {
private String name;
private int foulCount;
private static final int DANGER_THRESHOLD = 5;
public Player(String name) {
this.name = name;
this.foulCount = 0;
}
/** 累计一次犯规 */
public void addFoul() {
foulCount++;
}
/** 是否已达危险 */
public boolean isDangerous() {
return foulCount >= DANGER_THRESHOLD;
}
/** 状态描述 */
public String getStatus() {
if (foulCount >= DANGER_THRESHOLD) return "危险";
if (foulCount == DANGER_THRESHOLD - 1) return "警告";
return "正常";
}
@Override
public String toString() {
return String.format("球员 %s | 犯规 %d 次 | 状态:%s",
name, foulCount, getStatus());
}
}
public class FoulDemo {
public static void main(String[] args) {
Player p = new Player("李强");
for (int i = 0; i < 6; i++) {
p.addFoul();
System.out.println(p);
if (p.isDangerous()) {
System.out.println(" >>> 该球员已到危险犯规次数,");
}
}
}
}
关键点总结
| 要点 | 说明 |
|---|---|
| 阈值判定 | 使用 if-else if-else 或 switch 按次数分级 |
| 常量定义 | 用 static final 定义阈值,便于修改(如足球5次、篮球5次、排球不同规则) |
| 实时监控 | 每次犯规后调用 addFoul() 并重新判定 |
| 业务扩展 | 可加入数据库存储、UI 提示、裁判通知等 |
常见面试追问
Q1:如果阈值会随比赛规则动态变化怎么办?
将阈值改为可配置参数,从配置文件或数据库读取,而不是硬编码常量。
Q2:如何判断"连续犯规" vs "累计犯规"?
累计犯规只需累加计数;连续犯规需额外记录时间戳或节次,用队列或滑动窗口实现。
Q3:多线程环境下如何保证计数准确?
使用
AtomicInteger或对addFoul()方法加synchronized。
import java.util.concurrent.atomic.AtomicInteger;
private AtomicInteger foulCount = new AtomicInteger(0);
public void addFoul() {
foulCount.incrementAndGet();
}
public boolean isDangerous() {
return foulCount.get() >= DANGER_THRESHOLD;
}
如果你需要具体某类比赛(篮球/足球/排球)的规则版本,或者需要图形界面/Web版本,可以告诉我,我再进一步扩展。