Python案例:这次犯规该不该吃牌?
下面我用一个足球犯规判罚辅助系统的案例,演示如何用Python实现"该不该吃牌"的逻辑判断。

判罚规则梳理
在足球规则中,是否出牌主要看几个维度:
| 维度 | 黄牌情形 | 红牌情形 |
|---|---|---|
| 犯规严重度 | 鲁莽(Reckless) | 过分力量/危害安全 |
| 战术性 | 破坏有希望的进攻 | 破坏明显进球机会(DOGSO) |
| 位置 | 中场/边路 | 禁区内/单刀 |
| 累犯 | 已有1张黄牌 | |
| 行为 | 抗议、拖延、手球 | 暴力、吐口水、辱骂 |
核心代码实现
from enum import Enum
class Card(Enum):
NONE = "不出牌"
YELLOW = "黄牌"
RED = "红牌"
def judge_foul(
severity: str, # "careless"(草率) / "reckless"(鲁莽) / "excessive"(过分力量)
is_dogso: bool, # 是否破坏明显进球机会
in_penalty_area: bool, # 是否在禁区内
is_promising_attack: bool, # 是否破坏有希望的进攻
has_yellow: bool, # 是否已有黄牌
is_violent: bool = False, # 是否暴力行为
is_dissent: bool = False, # 是否抗议裁判
):
# 1. 暴力行为 / 严重犯规 → 直接红牌
if is_violent:
return Card.RED, "暴力行为,直接红牌"
if severity == "excessive":
return Card.RED, "使用过分力量,危及对手安全"
# 2. DOGSO 判断(破坏明显进球机会)
if is_dogso:
# 禁区内且是冲球去的 → 黄牌 + 点球(2016年后新规)
if in_penalty_area:
return Card.YELLOW, "禁区内DOGSO但冲球去,判点球+黄牌"
return Card.RED, "禁区外DOGSO,红牌罚下"
# 3. 鲁莽犯规 or 破坏有希望进攻 → 黄牌
if severity == "reckless" or is_promising_attack or is_dissent:
if has_yellow:
return Card.RED, "两黄变一红"
return Card.YELLOW, "鲁莽犯规/战术犯规/抗议"
# 4. 草率犯规 → 普通任意球
return Card.NONE, "草率犯规,仅判任意球"
# ============ 测试几个真实场景 ============
cases = [
("场景1: 中场拉拽单刀球员", dict(
severity="reckless", is_dogso=True, in_penalty_area=False,
is_promising_attack=True, has_yellow=False)),
("场景2: 禁区内铲倒单刀(冲球去)", dict(
severity="reckless", is_dogso=True, in_penalty_area=True,
is_promising_attack=True, has_yellow=False)),
("场景3: 背后飞铲亮鞋钉", dict(
severity="excessive", is_dogso=False, in_penalty_area=False,
is_promising_attack=False, has_yellow=False)),
("场景4: 已有黄牌再战术犯规", dict(
severity="reckless", is_dogso=False, in_penalty_area=False,
is_promising_attack=True, has_yellow=True)),
("场景5: 轻微推人", dict(
severity="careless", is_dogso=False, in_penalty_area=False,
is_promising_attack=False, has_yellow=False)),
]
for name, kw in cases:
card, reason = judge_foul(**kw)
print(f"{name}\n → {card.value}:{reason}\n")
运行结果
场景1: 中场拉拽单刀球员
→ 红牌:禁区外DOGSO,红牌罚下
场景2: 禁区内铲倒单刀(冲球去)
→ 黄牌:禁区内DOGSO但冲球去,判点球+黄牌
场景3: 背后飞铲亮鞋钉
→ 红牌:使用过分力量,危及对手安全
场景4: 已有黄牌再战术犯规
→ 红牌:两黄变一红
场景5: 轻微推人
→ 不出牌:草率犯规,仅判任意球
关键设计点
- 优先级顺序很重要:暴力 → 过分力量 → DOGSO → 鲁莽 → 草率,先判重后判轻。
- 2016年规则更新:禁区内DOGSO且冲球去,从"红牌+点球"改为"黄牌+点球",避免双重惩罚。
- 枚举用 Enum:比字符串更安全,IDE能提示。
- 用 `kwargs` 传参**:方便扩展新维度(如越位、手球)。
可以扩展的方向
- 加入 VAR复核:模拟"明显错判"回看
- 加入 手球规则:区分自然/非自然位置
- 用 决策树/机器学习:拿真实比赛数据训练出牌预测模型
讨论:你觉得现实判罚里最难量化的是哪一条?我认为是 "鲁莽 vs 草率"——这属于裁判的主观尺度,代码里只能靠参数标注,很难自动推断,如果你有具体某个犯规想让我代入这个系统跑一下,把犯规描述发给我就行。