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 草率"——这属于裁判的主观尺度,代码里只能靠参数标注,很难自动推断,如果你有具体某个犯规想让我代入这个系统跑一下,把犯规描述发给我就行。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播