python案例认为这次挡拆配合是否犯规?

wen python案例 2

本文目录导读:

python案例认为这次挡拆配合是否犯规?

  1. 案例需求
  2. Python 代码模拟
  3. 输出结果与解释
  4. 真实场景的延伸思考

我们来一起分析一个Python案例,用来判断篮球比赛中的“挡拆配合”是否犯规。

要判断挡拆是否犯规,本质上是一个逻辑判断问题,在篮球规则中,挡拆(掩护)犯规的核心在于掩护者的身体姿态和移动状态

以下是一个基于规则的Python模拟案例:


案例需求

假设我们正在开发一个AI裁判系统,系统通过传感器捕获了以下数据,需要判断这次挡拆是否犯规。

规则标准(简化版):

  1. 合法挡拆:掩护者必须双脚站立(或原地小碎步),身体直立,且与防守者有一臂距离
  2. 掩护犯规(移动掩护):掩护者在建立掩护后,横向或向防守者方向移动去“追击”防守人。
  3. 掩护犯规(推人):掩护者张开手臂主动发力顶开防守者。

Python 代码模拟

class PickAndRollJudger:
    def __init__(self):
        # 设定犯规的临界值
        self.max_movement_speed = 1.5  # 单位:米/秒,超过此速度视为移动掩护
        self.legal_arm_distance = 0.6   # 单位:米,低于此距离视为接触过近
    def judge(self, player_data):
        """
        :param player_data: 包含球员状态的数据字典
        :return: 判定结果(字符串)
        """
        # 提取关键特征
        movement_speed = player_data.get("movement_speed", 0)   # 掩护者横向移动速度
        arm_distance = player_data.get("arm_distance", 2.0)     # 与防守者的距离
        contacts = player_data.get("contacts", [])              # 接触部位列表,如 ['hand_push', 'shoulder']
        is_moving = player_data.get("is_moving", False)         # 是否双脚离地/移动
        had_established_position = player_data.get("had_established_position", False)
        # --- 逻辑判断 ---
        # 规则1:如果掩护者还在移动(通常指建立掩护后还在追防),视为犯规
        if is_moving and movement_speed > self.max_movement_speed:
            return "防守犯规 - 非法掩护(移动掩护)"
        # 规则2:如果距离过近且发生剧烈接触(推人)
        if (arm_distance < self.legal_arm_distance) and ("hand_push" in contacts):
            return "防守犯规 - 非法掩护(推人)"
        # 规则3:如果未建立合法位置(脚没站稳)就发生接触
        if not had_established_position and (arm_distance < self.legal_arm_distance):
            return "防守犯规 - 掩护未站稳就接触"
        # 规则4:如果以上都不满足,则为合法掩护
        # 额外的:如果距离适中且没有主动发力
        if (arm_distance >= self.legal_arm_distance) or ("shoulder" in contacts and not is_moving):
            return "合法掩护 - 挡拆配合有效"
        # 兜底
        return "待进一步检测"
# --- 模拟两个场景 ---
# 场景1:经典移动掩护(犯规)
data_illegal = {
    "movement_speed": 2.8,   # 移动太快
    "arm_distance": 0.3,     # 靠得很近
    "contacts": ["hand_push"], 
    "is_moving": True,
    "had_established_position": False  # 还没站稳就动
}
# 场景2:教科书般的挡拆(合法)
data_legal = {
    "movement_speed": 0.2,   # 基本静止
    "arm_distance": 0.8,     # 保持了一臂距离
    "contacts": ["shoulder"], # 胸腔接触不算推
    "is_moving": False,
    "had_established_position": True  # 双脚站定
}
# 运行判定
judger = PickAndRollJudger()
result1 = judger.judge(data_illegal)
result2 = judger.judge(data_legal)
print("案例1(移动掩护):", result1)
print("案例2(站位掩护):", result2)

输出结果与解释

运行这段代码,你会得到如下输出:

案例1(移动掩护): 防守犯规 - 非法掩护(移动掩护)
案例2(站位掩护): 合法掩护 - 挡拆配合有效

解释:

  • 案例1:系统检测到掩护者移动速度(2.8m/s)远高于阈值(1.5m/s),且处于移动状态,触发了“移动掩护”犯规判定,这是NBA和FIBA规则里最常见的挡拆犯规。
  • 案例2:系统检测到球员站定、距离合适,判定为合法掩护。

真实场景的延伸思考

在真正的篮球比赛中,这个逻辑会更复杂。

  1. 圆柱体原则:掩护者必须站在防守者的侧前方,不能是背后,也不能在防守者的行进路线上突然“闪现”。
  2. 时间差:防守者如果已经起跳,掩护者不能去“垫脚”。
  3. 数据来源:真实AI裁判会用视觉骨架检测(OpenPose)或雷达数据来获取 movement_speedarm_distance

如果你想更深入,可以在这个代码基础上增加一个参数:angle_to_defender(掩护者与防守者的角度),如果角度大于或小于某个值,也会触发不同的判定。

你希望我进一步扩展这个案例,比如加入视频帧分析或者概率模型吗?

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