本文目录导读:

我来为你设计一个统计假动作晃过防守次数的Python案例,这个案例模拟足球比赛中球员使用假动作晃过防守球员的情景。
基于位置变化的统计
import random
import time
from collections import defaultdict
class FootballGame:
def __init__(self):
self.player_pos = [50, 0] # 球员位置 (x, y)
self.defender_pos = [50, 5] # 防守球员位置
self.fake_moves = 0 # 使用的假动作次数
self.successful_beat = 0 # 成功晃过的次数
self.fail_count = 0 # 失败次数
self.move_history = []
def perform_fake_move(self, direction):
"""执行假动作"""
print(f"向{direction}方向做假动作...")
self.fake_moves += 1
# 记录假动作前的防守距离
distance_before = abs(self.player_pos[0] - self.defender_pos[0])
# 模拟假动作:先向一个方向虚晃
fake_direction = random.choice(['left', 'right'])
if fake_direction == 'left':
self.player_pos[0] -= 3
else:
self.player_pos[0] += 3
# 防守球员反应
defender_reaction = random.random()
if defender_reaction < 0.6: # 60%概率被晃过
# 假动作成功后向另一方向突破
if fake_direction == 'left':
self.player_pos[0] += 6 # 向相反方向突破
else:
self.player_pos[0] -= 6
distance_after = abs(self.player_pos[0] - self.defender_pos[0])
# 判断是否成功晃过(距离拉大超过3个单位)
if distance_after - distance_before > 3:
self.successful_beat += 1
self.move_history.append(('success', fake_direction, distance_before, distance_after))
print(f"✓ 成功晃过防守!距离从{distance_before:.1f}扩大到{abs(self.player_pos[0]-self.defender_pos[0]):.1f}")
return True
else:
self.fail_count += 1
self.move_history.append(('fail', fake_direction, distance_before, distance_after))
print(f"✗ 没有完全晃开防守")
return False
else:
self.fail_count += 1
self.move_history.append(('fail', fake_direction, 0, 0))
print(f"✗ 假动作被识破!")
return False
def simulate_play(self, max_actions=10):
"""模拟进攻过程"""
print("\n=== 比赛开始 ===")
for i in range(max_actions):
print(f"\n第{i+1}次进攻尝试:")
# 随机选择行动:假动作或传球
action = random.choice(['fake', 'fake', 'fake', 'pass'])
if action == 'fake':
direction = random.choice(['左', '右'])
self.perform_fake_move(direction)
# 如果成功晃过2次就算进球
if self.successful_beat >= 2:
print("\n🎉 成功突破防线,射门得分!")
break
else:
print("选择传球,调整进攻节奏")
# 更新防守球员位置(重新调整防守)
if len(self.move_history) > 0:
self.defender_pos[0] += random.uniform(-2, 2)
self.defender_pos[0] = max(0, min(100, self.defender_pos[0]))
return self.get_statistics()
def get_statistics(self):
"""获取统计数据"""
return {
'总假动作次数': self.fake_moves,
'成功晃过次数': self.successful_beat,
'失败次数': self.fail_count,
'成功率': f"{self.successful_beat/self.fake_moves*100:.1f}%" if self.fake_moves > 0 else "0%"
}
# 运行模拟
game = FootballGame()
stats = game.simulate_play(max_actions=10)
print("\n=== 比赛统计 ===")
for key, value in stats.items():
print(f"{key}: {value}")
更复杂的多维度统计
import numpy as np
import pandas as pd
from enum import Enum
from datetime import datetime
class MoveType(Enum):
FAKE_LEFT = "假动作-向左"
FAKE_RIGHT = "假动作-向右"
CUT_INSIDE = "内切"
STEP_OVER = "踩单车"
class GameAnalyzer:
def __init__(self):
self.moves_record = []
self.current_position = (50, 0)
def record_move(self, move_type, defenders_beaten, speed=0, prediction_error=0):
"""记录每次假动作数据"""
move_data = {
'timestamp': datetime.now(),
'move_type': move_type.value,
'defenders_beaten': defenders_beaten,
'success': defenders_beaten > 0,
'player_speed': speed,
'defender_prediction_error': prediction_error,
'position': self.current_position
}
self.moves_record.append(move_data)
def analyze_performance(self):
"""分析整个比赛表现"""
df = pd.DataFrame(self.moves_record)
stats = {
'总假动作次数': len(df),
'成功晃过次数': df['success'].sum(),
'成功率': f"{df['success'].mean()*100:.1f}%",
'平均晃过防守数': df['defenders_beaten'].mean(),
'最佳表现': self._find_best_move(df),
'战术选择': self._analyze_tactics(df)
}
return stats
def _find_best_move(self, df):
"""找出最成功的假动作"""
best_move = df.loc[df['defenders_beaten'].idxmax()]
return {
'类型': best_move['move_type'],
'晃过人数': best_move['defenders_beaten'],
'速度': best_move['player_speed']
}
def _analyze_tactics(self, df):
"""分析战术选择"""
tactics = {}
for move in MoveType:
move_df = df[df['move_type'] == move.value]
if len(move_df) > 0:
tactics[move.name] = {
'次数': len(move_df),
'成功率': f"{move_df['success'].mean()*100:.1f}%",
'平均晃过人数': move_df['defenders_beaten'].mean()
}
return tactics
def visualize_results(self):
"""可视化统计结果"""
df = pd.DataFrame(self.moves_record)
# 使用matplotlib展示
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 2, figsize=(12, 8))
# 1. 每次假动作的晃过人数
axes[0,0].bar(range(len(df)), df['defenders_beaten'])
axes[0,0].set_title('每次假动作晃过防守人数')
axes[0,0].set_xlabel('尝试次数')
axes[0,0].set_ylabel('晃过人数')
# 2. 战术成功率
tactics = self._analyze_tactics(df)
move_types = [m['move_type'] for m in self.moves_record]
success_rates = [m['defenders_beaten']/max(m['defenders_beaten'],1) for m in self.moves_record]
axes[0,1].pie([sum(1 for m in self.moves_record if m['success']),
sum(1 for m in self.moves_record if not m['success'])],
labels=['成功', '失败'],
autopct='%1.1f%%')
axes[0,1].set_title('成功率分布')
# 3. 速度与成功率关系
axes[1,0].scatter(df['player_speed'], df['defenders_beaten'])
axes[1,0].set_title('球员速度与晃过人数关系')
axes[1,0].set_xlabel('速度')
axes[1,0].set_ylabel('晃过人数')
# 4. 防守预测误差分析
axes[1,1].bar(range(len(df)), df['defender_prediction_error'])
axes[1,1].set_title('防守球员预测误差')
axes[1,1].set_xlabel('尝试次数')
axes[1,1].set_ylabel('预测误差')
plt.tight_layout()
plt.show()
# 使用示例
analyzer = GameAnalyzer()
# 模拟一场比赛
for i in range(15):
move_type = random.choice(list(MoveType))
defenders = random.choices([0, 1, 2, 3], weights=[0.3, 0.4, 0.2, 0.1])[0]
speed = random.uniform(5, 12)
prediction_error = random.uniform(0, 5) if defenders > 0 else 0
analyzer.record_move(move_type, defenders, speed, prediction_error)
stats = analyzer.analyze_performance()
print("=== 数据分析结果 ===")
for key, value in stats.items():
print(f"{key}: {value}")
# 如果想查看详细战术分析
print("\n=== 战术分析 ===")
for tactic, info in stats['战术选择'].items():
print(f"\n{tactic}:")
for k, v in info.items():
print(f" {k}: {v}")
实时可视化模拟
import time
import random
class RealTimeSimulation:
def __init__(self):
self.frame = 0
self.player_x = 50
self.defender_x = 40
self.defenders_beaten = 0
self.success_count = 0
self.total_fake_moves = 0
def display_visual(self):
"""显示球场可视化界面"""
print("\n" * 2)
print("=" * 80)
print(f"第{self.frame}帧 | 成功晃过: {self.success_count} | 总假动作: {self.total_fake_moves}")
print("-" * 80)
# 绘制球场坐标
field_width = 100
field = ['-'] * field_width
# 标注球员和防守球员
player_idx = int(self.player_x)
defender_idx = int(self.defender_x)
field[player_idx] = '🏃' # 进攻球员
field[defender_idx] = '🛡️' # 防守球员
# 显示球场
field_str = ' '.join(field)
print(field_str)
# 显示距离
distance = abs(self.player_x - self.defender_x)
print(f"距离: {distance:.1f} 米")
# 统计信息
if self.total_fake_moves > 0:
success_rate = self.success_count / self.total_fake_moves * 100
print(f"成功率: {success_rate:.1f}%")
print("=" * 80)
def simulate_fake_move(self):
"""模拟假动作"""
self.total_fake_moves += 1
# 假动作决策
fake_direction = random.choice(['left', 'right'])
move_power = random.uniform(3, 8)
# 记录假动作
print(f"\n➡️ 使用假动作,方向: {fake_direction}, 力度: {move_power:.1f}")
# 假动作执行
old_position = self.player_x
# 假动作虚晃
if fake_direction == 'left':
self.player_x -= move_power * 0.3
else:
self.player_x += move_power * 0.3
# 防守球员反应
reaction_time = random.random()
# 显示动画 - 模拟几帧
for i in range(3):
self.frame += 1
self.display_visual()
time.sleep(0.3)
# 中间状态
if i == 0:
print("🔮 防守球员开始移动...")
elif i == 1:
if reaction_time < 0.7:
print("⚡ 防守球员向假动作方向移动!")
else:
print("🕴️ 防守球员保持位置,没有被骗到!")
# 假动作后的突破
if reaction_time < 0.7: # 70%概率被骗
# 向相反方向突破
if fake_direction == 'left':
self.player_x += move_power * 2
else:
self.player_x -= move_power * 2
# 检查是否晃过(距离拉大)
new_distance = abs(self.player_x - self.defender_x)
old_distance = abs(old_position - self.defender_x)
if new_distance > old_distance + 2:
self.success_count += 1
self.defenders_beaten += 1
print(f"\n🎉 成功晃过防守!距离扩大到{new_distance:.1f}米")
else:
print(f"\n⚠️ 未能完全晃开,防守球员跟上")
# 防守球员调整位置
self.defender_x += random.uniform(-3, 3) * (1 if self.player_x > self.defender_x else -1)
self.defender_x = max(0, min(100, self.defender_x))
else:
# 被看穿
print(f"\n❌ 假动作被识破!")
self.defender_x += random.uniform(1, 3) * (1 if self.defender_x > self.player_x else -1)
self.frame += 1
self.display_visual()
def run_match(self, minutes=90):
"""运行整场比赛"""
print("⚽ 足球比赛模拟器 - 假动作统计系统")
print("*" * 80)
# 每5分钟统计一次
for minute in range(0, minutes, 5):
print(f"\n⏱️ 比赛第{minute}分钟")
# 每5分钟尝试2-3次突破
attempts = random.randint(1, 3)
for _ in range(attempts):
self.simulate_fake_move()
time.sleep(0.5)
#
print("\n" + "="*80)
print("📊 比赛总结")
print("-" * 80)
print(f"🔄 总假动作次数: {self.total_fake_moves}")
print(f"✅ 成功晃过次数: {self.success_count}")
print(f"📈 成功率: {self.success_count/self.total_fake_moves*100:.1f}%")
# 判断比赛结果
if self.success_count >= self.total_fake_moves * 0.5:
print("🥇 表现出色!假动作让人眼花缭乱")
elif self.success_count >= self.total_fake_moves * 0.3:
print("🥈 表现不错,有几次精彩突破")
else:
print("🥉 仍需提高假动作的质量")
# 运行模拟
if __name__ == "__main__":
game = RealTimeSimulation()
game.run_match(minutes=30) # 模拟30分钟的比赛
核心功能说明
-
基础统计(方案一):
- 记录假动作次数和成功晃过数量
- 计算成功率
- 分析防守球员反应
-
数据分析(方案二):
- 使用pandas进行数据分析
- 生成统计报告
- 可视化展示结果
-
实时模拟(方案三):
- 动态显示球场状态
- 实时更新统计数据
- 模拟完整比赛过程
你可以选择适合你需求的方案,或者组合使用,如果需要特定功能或修改,请告诉我!
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播