本文目录导读:

我来给你设计一个关于"地面对抗"胜负统计的Python案例,这里我用一个经典的猜拳游戏来模拟地面对抗,并加入统计分析功能。
完整案例:地面部队对抗模拟
import random
import statistics
from collections import Counter
import matplotlib.pyplot as plt
class GroundCombat:
"""地面部队对抗模拟器"""
def __init__(self):
self.attacker_units = ['步兵', '坦克', '炮兵', '导弹部队']
self.defender_units = ['碉堡', '反坦克阵地', '防空系统', '地雷区']
self.attacker_wins = 0
self.defender_wins = 0
self.draws = 0
self.history = []
self.damage_log = {'attacker': [], 'defender': []}
def simulate_battle(self, rounds=100):
"""模拟多轮战斗"""
for i in range(rounds):
result = self.battle_round()
self.history.append(result)
if result['winner'] == 'attacker':
self.attacker_wins += 1
elif result['winner'] == 'defender':
self.defender_wins += 1
else:
self.draws += 1
return self.get_statistics()
def battle_round(self):
"""单轮战斗模拟"""
attacker = random.choice(self.attacker_units)
defender = random.choice(self.defender_units)
# 简单的胜负判定规则
strength_map = {
'步兵': {'碉堡': 0.3, '反坦克阵地': 0.2, '防空系统': 0.5, '地雷区': 0.4},
'坦克': {'碉堡': 0.6, '反坦克阵地': 0.3, '防空系统': 0.2, '地雷区': 0.1},
'炮兵': {'碉堡': 0.7, '反坦克阵地': 0.6, '防空系统': 0.4, '地雷区': 0.3},
'导弹部队': {'碉堡': 0.9, '反坦克阵地': 0.8, '防空系统': 0.6, '地雷区': 0.7}
}
win_probability = strength_map[attacker][defender]
damage_attacker = random.randint(10, 30) * win_probability
damage_defender = random.randint(10, 25) * (1 - win_probability)
self.damage_log['attacker'].append(damage_attacker)
self.damage_log['defender'].append(damage_defender)
# 判定胜负
threshold = 0.5
if win_probability > threshold:
winner = 'attacker'
elif win_probability < (1 - threshold):
winner = 'defender'
else:
winner = 'draw'
return {
'round': len(self.history) + 1,
'attacker': attacker,
'defender': defender,
'winner': winner,
'win_probability': win_probability,
'damage_attacker': round(damage_attacker, 2),
'damage_defender': round(damage_defender, 2)
}
def get_statistics(self):
"""获取统计数据"""
total = self.attacker_wins + self.defender_wins + self.draws
stats = {
'total_rounds': total,
'attacker_wins': self.attacker_wins,
'defender_wins': self.defender_wins,
'draws': self.draws,
'attacker_win_rate': (self.attacker_wins / total) * 100 if total > 0 else 0,
'defender_win_rate': (self.defender_wins / total) * 100 if total > 0 else 0,
'draw_rate': (self.draws / total) * 100 if total > 0 else 0,
'avg_attacker_damage': statistics.mean(self.damage_log['attacker']),
'avg_defender_damage': statistics.mean(self.damage_log['defender']),
'sampled_rounds': self.history[:5] # 显示前5轮详情
}
return stats
def unit_performance(self):
"""分析各部队表现"""
performance = {}
for unit in self.attacker_units + self.defender_units:
performance[unit] = {
'appearances': 0,
'wins': 0,
'losses': 0,
'draws': 0
}
for battle in self.history:
if battle['winner'] != 'draw':
winner_unit = battle['attacker'] if battle['winner'] == 'attacker' else battle['defender']
loser_unit = battle['defender'] if battle['winner'] == 'attacker' else battle['attacker']
performance[winner_unit]['wins'] += 1
performance[loser_unit]['losses'] += 1
else:
performance[battle['attacker']]['draws'] += 1
performance[battle['defender']]['draws'] += 1
performance[battle['attacker']]['appearances'] += 1
performance[battle['defender']]['appearances'] += 1
return performance
def visualize_results(stats, combat):
"""可视化战斗结果"""
# 创建图形
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
# 1. 胜负比例饼图
labels = ['进攻方胜利', '防守方胜利', '平局']
sizes = [stats['attacker_wins'], stats['defender_wins'], stats['draws']]
colors = ['#ff6b6b', '#4ecdc4', '#95a5a6']
explode = (0.1, 0, 0)
axes[0, 0].pie(sizes, explode=explode, labels=labels, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=90)
axes[0, 0].set_title('胜负比例分布')
# 2. 伤害对比柱状图
rounds = list(range(1, len(combat.damage_log['attacker']) + 1))
axes[0, 1].bar(rounds, combat.damage_log['attacker'], alpha=0.7,
color='red', label='进攻方伤害')
axes[0, 1].bar(rounds, combat.damage_log['defender'], alpha=0.7,
color='blue', label='防守方伤害')
axes[0, 1].set_title('每轮伤害对比')
axes[0, 1].set_xlabel('轮次')
axes[0, 1].set_ylabel('伤害值')
axes[0, 1].legend()
# 3. 部队性能分析
performance = combat.unit_performance()
units = list(performance.keys())
win_rates = [(performance[u]['wins'] / performance[u]['appearances'] * 100)
if performance[u]['appearances'] > 0 else 0 for u in units]
x_pos = range(len(units))
axes[1, 0].bar(x_pos, win_rates, color='green')
axes[1, 0].set_title('各部队胜率')
axes[1, 0].set_xticks(x_pos)
axes[1, 0].set_xticklabels(units, rotation=45)
axes[1, 0].set_ylabel('胜率 (%)')
# 4. 累计胜负趋势
cumulative_attacker = []
cumulative_defender = []
a_count = 0
d_count = 0
for battle in combat.history:
if battle['winner'] == 'attacker':
a_count += 1
elif battle['winner'] == 'defender':
d_count += 1
cumulative_attacker.append(a_count)
cumulative_defender.append(d_count)
axes[1, 1].plot(rounds, cumulative_attacker, 'r-', label='进攻方累计胜场')
axes[1, 1].plot(rounds, cumulative_defender, 'b-', label='防守方累计胜场')
axes[1, 1].set_title('累计胜负趋势')
axes[1, 1].set_xlabel('轮次')
axes[1, 1].set_ylabel('累计胜场数')
axes[1, 1].legend()
axes[1, 1].grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
def main():
"""主程序入口"""
print("=" * 50)
print(" 地面部队对抗模拟分析系统")
print("=" * 50)
# 创建模拟器
combat = GroundCombat()
# 设置模拟轮数
try:
rounds = int(input("请输入模拟轮数(默认100): ") or "100")
except ValueError:
rounds = 100
print("输入无效,使用默认值100")
# 执行模拟
print("\n开始模拟战斗...")
stats = combat.simulate_battle(rounds)
# 输出统计结果
print("\n" + "=" * 50)
print(" 战斗统计报告")
print("=" * 50)
print(f"总战斗场次: {stats['total_rounds']}")
print(f"\n【胜负情况】")
print(f"进攻方胜利: {stats['attacker_wins']} 场 ({stats['attacker_win_rate']:.1f}%)")
print(f"防守方胜利: {stats['defender_wins']} 场 ({stats['defender_win_rate']:.1f}%)")
print(f"平局: {stats['draws']} 场 ({stats['draw_rate']:.1f}%)")
# 判定最终胜者
print("\n" + "=" * 50)
if stats['attacker_wins'] > stats['defender_wins']:
print("🏆 最终结果:进攻方胜出!")
elif stats['defender_wins'] > stats['attacker_wins']:
print("🏰 最终结果:防守方胜出!")
else:
print("🤝 最终结果:双方战平!")
# 输出伤害统计
print(f"\n【伤害统计】")
print(f"进攻方平均伤害: {stats['avg_attacker_damage']:.2f}")
print(f"防守方平均伤害: {stats['avg_defender_damage']:.2f}")
# 显示前5轮战斗详情
print("\n【前5轮战斗详情】")
print("-" * 70)
print(f"{'轮次':<5} {'进攻方':<8} {'防守方':<10} {'胜者':<8} {'胜率':<8} {'进攻伤害':<10} {'防守伤害':<10}")
print("-" * 70)
for battle in stats['sampled_rounds']:
print(f"{battle['round']:<5} {battle['attacker']:<8} {battle['defender']:<10} "
f"{battle['winner']:<8} {battle['win_probability']*100:.1f}% "
f"{battle['damage_attacker']:<10} {battle['damage_defender']:<10}")
# 部队性能统计
print("\n【各部队胜率统计】")
print("-" * 50)
performance = combat.unit_performance()
for unit, perf in performance.items():
if perf['appearances'] > 0:
win_rate = (perf['wins'] / perf['appearances']) * 100
print(f"{unit}: 胜率 {win_rate:.1f}% (出场:{perf['appearances']}次, "
f"胜:{perf['wins']}, 负:{perf['losses']}, 平:{perf['draws']})")
# 生成可视化图表
print("\n正在生成可视化图表...")
visualize_results(stats, combat)
print("\n分析完成!")
if __name__ == "__main__":
main()
运行示例
==================================================
地面部队对抗模拟分析系统
==================================================
请输入模拟轮数(默认100): 50
开始模拟战斗...
==================================================
战斗统计报告
==================================================
总战斗场次: 50
【胜负情况】
进攻方胜利: 28 场 (56.0%)
防守方胜利: 22 场 (44.0%)
平局: 0 场 (0.0%)
==================================================
🏆 最终结果:进攻方胜出!
【伤害统计】
进攻方平均伤害: 12.56
防守方平均伤害: 8.34
功能特点
- 实时模拟:通过概率计算模拟每轮战斗
- 统计分析:自动计算胜率、平均伤害等指标
- 性能评估:分析每个部队的表现
- 可视化图表:生成胜负比例、伤害对比、部队胜率等图表
这个案例展示了如何使用Python进行模拟统计分析和数据可视化,你可以根据需要调整战斗规则、部队类型或模拟参数。
版权声明: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直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播