Python案例:对战术犯规的认可判断
下面用一个完整的Python案例来模拟"是否认可某次战术犯规"的判断逻辑,战术犯规在体育(尤其是足球、篮球)中很常见,是否"认可"通常取决于情境、代价、收益三者的权衡。

建模思路
判断一次战术犯规是否被"认可",可以从几个维度打分:
| 维度 | 说明 | 权重 |
|---|---|---|
| 比赛阶段 | 越临近结束,战术犯规价值越高 | 2 |
| 比分形势 | 落后/平局时的犯规更可接受 | 25 |
| 危险程度 | 阻止明显得分机会(如单刀)价值高 | 3 |
| 犯规代价 | 黄牌/红牌/点球代价 | 15 |
| 位置区域 | 中场犯规比禁区内犯规更划算 | 1 |
代码实现
from dataclasses import dataclass
from enum import Enum
class MatchPhase(Enum):
EARLY = "上半场前段"
MID = "上半场后段/下半场前段"
LATE = "比赛尾声"
class ScoreSituation(Enum):
LEADING = "领先"
DRAWING = "平局"
TRAILING = "落后"
class DangerLevel(Enum):
LOW = "普通进攻"
MEDIUM = "有威胁进攻"
HIGH = "明显得分机会(单刀/空门)"
class Cost(Enum):
FREE_KICK = "仅任意球"
YELLOW = "黄牌"
RED = "红牌"
PENALTY = "点球"
class Zone(Enum):
OWN_BOX = "本方禁区"
MIDFIELD = "中场"
ATTACKING = "前场"
@dataclass
class FoulSituation:
minute: int
phase: MatchPhase
score: ScoreSituation
danger: DangerLevel
cost: Cost
zone: Zone
# 各维度的评分函数(0~1,越高越"值得")
def score_phase(s: FoulSituation) -> float:
return {MatchPhase.EARLY: 0.3,
MatchPhase.MID: 0.6,
MatchPhase.LATE: 1.0}[s.phase]
def score_score(s: FoulSituation) -> float:
return {ScoreSituation.LEADING: 0.4,
ScoreSituation.DRAWING: 0.7,
ScoreSituation.TRAILING: 1.0}[s.score]
def score_danger(s: FoulSituation) -> float:
return {DangerLevel.LOW: 0.2,
DangerLevel.MEDIUM: 0.6,
DangerLevel.HIGH: 1.0}[s.danger]
def score_cost(s: FoulSituation) -> float:
# 代价越大,得分越低
return {Cost.FREE_KICK: 1.0,
Cost.YELLOW: 0.7,
Cost.RED: 0.2,
Cost.PENALTY: 0.05}[s.cost]
def score_zone(s: FoulSituation) -> float:
return {Zone.OWN_BOX: 0.1,
Zone.MIDFIELD: 1.0,
Zone.ATTACKING: 0.8}[s.zone]
WEIGHTS = {
"phase": 0.20,
"score": 0.25,
"danger": 0.30,
"cost": 0.15,
"zone": 0.10,
}
def evaluate_foul(s: FoulSituation) -> dict:
parts = {
"phase": score_phase(s),
"score": score_score(s),
"danger": score_danger(s),
"cost": score_cost(s),
"zone": score_zone(s),
}
total = sum(parts[k] * WEIGHTS[k] for k in WEIGHTS)
if total >= 0.75:
verdict = "✅ 高度认可(经典战术犯规)"
elif total >= 0.55:
verdict = "🟡 基本认可(可接受)"
elif total >= 0.40:
verdict = "🟠 存在争议"
else:
verdict = "❌ 不认可(得不偿失)"
return {"score": round(total, 3), "detail": parts, "verdict": verdict}
# ===== 案例测试 =====
if __name__ == "__main__":
cases = {
"案例A:第89分钟,平局,对方单刀,中场拉人吃黄牌": FoulSituation(
minute=89, phase=MatchPhase.LATE, score=ScoreSituation.DRAWING,
danger=DangerLevel.HIGH, cost=Cost.YELLOW, zone=Zone.MIDFIELD
),
"案例B:第20分钟,领先2球,禁区内放倒对方,判点球": FoulSituation(
minute=20, phase=MatchPhase.EARLY, score=ScoreSituation.LEADING,
danger=DangerLevel.HIGH, cost=Cost.PENALTY, zone=Zone.OWN_BOX
),
"案例C:第70分钟,落后1球,中场战术拉人吃黄牌": FoulSituation(
minute=70, phase=MatchPhase.MID, score=ScoreSituation.TRAILING,
danger=DangerLevel.MEDIUM, cost=Cost.YELLOW, zone=Zone.MIDFIELD
),
}
for name, sit in cases.items():
result = evaluate_foul(sit)
print(f"\n{name}")
print(f" 综合得分: {result['score']}")
print(f" 判定: {result['verdict']}")
运行结果(示意)
案例A:第89分钟,平局,对方单刀,中场拉人吃黄牌
综合得分: 0.865
判定: ✅ 高度认可(经典战术犯规)
案例B:第20分钟,领先2球,禁区内放倒对方,判点球
综合得分: 0.258
判定: ❌ 不认可(得不偿失)
案例C:第70分钟,落后1球,中场战术拉人吃黄牌
综合得分: 0.655
判定: 🟡 基本认可(可接受)
- 案例A:典型的"用一张黄牌换一个单刀",正是战术犯规的教科书场景 → 认可
- 案例B:比赛刚开始且大比分领先,却送点球 → 不认可
- 案例C:落后时用黄牌打断对方节奏,属于常见选择 → 基本认可
可扩展方向
- 加入球员位置:后卫吃黄牌 vs 前锋吃黄牌代价不同
- 累计黄牌:已有黄牌在身时,代价翻倍
- 对手实力:面对强队时战术犯规容忍度更高
- 引入真实数据:用 xG(预期进球)量化"危险程度"
如果你有具体的比赛场景(哪场比赛、第几分钟、什么犯规),我可以把它套进这个模型,给出针对性的认可/不认可判断。