python案例认为这次犯规该不该吃牌?

wen python案例 1

Python案例:这次犯规该不该吃牌?

下面我用一个足球犯规判罚辅助系统的案例,演示如何用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: 轻微推人
  → 不出牌:草率犯规,仅判任意球

关键设计点

  1. 优先级顺序很重要:暴力 → 过分力量 → DOGSO → 鲁莽 → 草率,先判重后判轻。
  2. 2016年规则更新:禁区内DOGSO且冲球去,从"红牌+点球"改为"黄牌+点球",避免双重惩罚。
  3. 枚举用 Enum:比字符串更安全,IDE能提示。
  4. 用 `kwargs` 传参**:方便扩展新维度(如越位、手球)。

可以扩展的方向

  • 加入 VAR复核:模拟"明显错判"回看
  • 加入 手球规则:区分自然/非自然位置
  • 决策树/机器学习:拿真实比赛数据训练出牌预测模型

讨论:你觉得现实判罚里最难量化的是哪一条?我认为是 "鲁莽 vs 草率"——这属于裁判的主观尺度,代码里只能靠参数标注,很难自动推断,如果你有具体某个犯规想让我代入这个系统跑一下,把犯规描述发给我就行。

上一篇这个python案例更看重传球成功率还是威胁球?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!