本文目录导读:

我们来一起分析一个Python案例,用来判断篮球比赛中的“挡拆配合”是否犯规。
要判断挡拆是否犯规,本质上是一个逻辑判断问题,在篮球规则中,挡拆(掩护)犯规的核心在于掩护者的身体姿态和移动状态。
以下是一个基于规则的Python模拟案例:
案例需求
假设我们正在开发一个AI裁判系统,系统通过传感器捕获了以下数据,需要判断这次挡拆是否犯规。
规则标准(简化版):
- 合法挡拆:掩护者必须双脚站立(或原地小碎步),身体直立,且与防守者有一臂距离。
- 掩护犯规(移动掩护):掩护者在建立掩护后,横向或向防守者方向移动去“追击”防守人。
- 掩护犯规(推人):掩护者张开手臂或主动发力顶开防守者。
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:系统检测到球员站定、距离合适,判定为合法掩护。
真实场景的延伸思考
在真正的篮球比赛中,这个逻辑会更复杂。
- 圆柱体原则:掩护者必须站在防守者的侧前方,不能是背后,也不能在防守者的行进路线上突然“闪现”。
- 时间差:防守者如果已经起跳,掩护者不能去“垫脚”。
- 数据来源:真实AI裁判会用视觉骨架检测(OpenPose)或雷达数据来获取
movement_speed和arm_distance。
如果你想更深入,可以在这个代码基础上增加一个参数:angle_to_defender(掩护者与防守者的角度),如果角度大于或小于某个值,也会触发不同的判定。
你希望我进一步扩展这个案例,比如加入视频帧分析或者概率模型吗?