python案例统计地面对抗谁胜出?

wen python案例 2

本文目录导读:

python案例统计地面对抗谁胜出?

  1. 完整案例:英雄对战模拟器
  2. 运行示例
  3. 功能特点
  4. 扩展建议

我来为你创建一个有趣的Python案例,模拟地面对抗(王者荣耀》或《英雄联盟》中的对抗场景),统计谁胜出。

完整案例:英雄对战模拟器

import random
from collections import Counter
from dataclasses import dataclass
from typing import List, Dict
import time
@dataclass
class Hero:
    """英雄类"""
    name: str
    health: int          # 生命值
    attack: int          # 攻击力
    defense: int         # 防御力
    speed: int           # 速度(决定先手)
    skill_power: int     # 技能威力
    crit_chance: float   # 暴击率 (0-1)
    def is_alive(self) -> bool:
        return self.health > 0
    def take_damage(self, damage: int):
        """受到伤害"""
        actual_damage = max(1, damage - self.defense // 2)  # 防御减伤
        self.health = max(0, self.health - actual_damage)
        return actual_damage
    def calculate_attack_damage(self, use_skill: bool = False) -> int:
        """计算攻击伤害"""
        if use_skill:
            base_damage = self.attack * 2 + self.skill_power
            return int(base_damage)
        else:
            # 普通攻击,有暴击几率
            if random.random() < self.crit_chance:
                return int(self.attack * 2.5)  # 暴击伤害
            return self.attack
def create_heroes() -> List[Hero]:
    """创建对战英雄"""
    return [
        Hero("剑圣", 1000, 120, 30, 80, 150, 0.25),
        Hero("法师", 800, 150, 20, 70, 200, 0.15),
        Hero("战士", 1200, 110, 40, 60, 120, 0.20),
        Hero("刺客", 700, 170, 15, 100, 180, 0.35),
        Hero("坦克", 1500, 90, 50, 50, 100, 0.10)
    ]
def start_battle(hero1: Hero, hero2: Hero, rounds: int = 3) -> Dict:
    """模拟英雄对战"""
    results = {
        'battles': [],
        'hero1_wins': 0,
        'hero2_wins': 0,
        'total_rounds': rounds
    }
    for battle_num in range(1, rounds + 1):
        # 复制英雄以保持原始状态
        h1 = Hero(hero1.name, hero1.health, hero1.attack, hero1.defense, 
                 hero1.speed, hero1.skill_power, hero1.crit_chance)
        h2 = Hero(hero2.name, hero2.health, hero2.attack, hero2.defense, 
                 hero2.speed, hero2.skill_power, hero2.crit_chance)
        # 判断先手(速度决定)
        first, second = (h1, h2) if h1.speed >= h2.speed else (h2, h1)
        battle_log = {
            'battle_num': battle_num,
            'rounds': 0,
            'winner': None,
            'total_damage': 0,
            'actions': []
        }
        current_round = 0
        max_rounds = 20  # 防止无限循环
        print(f"\n🎮 第{battle_num}场对战:{hero1.name} VS {hero2.name}")
        print("=" * 50)
        while first.is_alive() and second.is_alive() and current_round < max_rounds:
            current_round += 1
            # 先手攻击
            skill_used = random.random() < 0.3  # 30%概率使用技能
            damage = first.calculate_attack_damage(skill_used)
            actual_damage = second.take_damage(damage)
            skill_text = "🔮技能" if skill_used else "⚔️普通攻击"
            print(f"回合{current_round}: {first.name}使用{skill_text}对{second.name}造成{actual_damage}伤害")
            battle_log['actions'].append({
                'round': current_round,
                'attacker': first.name,
                'defender': second.name,
                'damage': actual_damage,
                'skill': skill_used
            })
            if not second.is_alive():
                break
            # 后手攻击
            skill_used = random.random() < 0.3
            damage = second.calculate_attack_damage(skill_used)
            actual_damage = first.take_damage(damage)
            skill_text = "🔮技能" if skill_used else "⚔️普通攻击"
            print(f"回合{current_round}: {second.name}使用{skill_text}对{first.name}造成{actual_damage}伤害")
            battle_log['actions'].append({
                'round': current_round,
                'attacker': second.name,
                'defender': first.name,
                'damage': actual_damage,
                'skill': skill_used
            })
        # 判断胜负
        battle_log['rounds'] = current_round
        if first.is_alive() and not second.is_alive():
            battle_log['winner'] = first.name
            winner_name = first.name
        elif second.is_alive() and not first.is_alive():
            battle_log['winner'] = second.name
            winner_name = second.name
        else:
            # 平局(都活着或都死了)
            battle_log['winner'] = "平局"
            winner_name = "平局"
        if winner_name == hero1.name:
            results['hero1_wins'] += 1
        elif winner_name == hero2.name:
            results['hero2_wins'] += 1
        battle_log['total_damage'] = sum([a['damage'] for a in battle_log['actions']])
        results['battles'].append(battle_log)
        print(f"🏆 第{battle_num}场胜者:{battle_log['winner']}")
        print(f"   共进行了{battle_log['rounds']}回合,总伤害{battle_log['total_damage']}")
        time.sleep(0.5)  # 稍作暂停,让观感更好
    return results
def analyze_results(results: Dict) -> None:
    """分析对战结果"""
    print("\n" + "=" * 60)
    print("📊 对战统计结果")
    print("=" * 60)
    total_battles = results['total_rounds']
    win_rate1 = (results['hero1_wins'] / total_battles) * 100
    win_rate2 = (results['hero2_wins'] / total_battles) * 100
    print(f"\n共进行 {total_battles} 场对战")
    if 'hero1_wins' in results:
        print(f"\n🏆 英雄1获胜次数: {results['hero1_wins']} ({win_rate1:.1f}%)")
        print(f"🏆 英雄2获胜次数: {results['hero2_wins']} ({win_rate2:.1f}%)")
    # 统计各英雄胜率
    winner_counts = Counter()
    for battle in results['battles']:
        winner_counts[battle['winner']] += 1
    print("\n📈 胜场分布:")
    for hero_name, count in winner_counts.most_common():
        print(f"  {hero_name}: {count}场 ({count/total_battles*100:.1f}%)")
    # 分析平均回合数和伤害
    avg_rounds = sum(b['rounds'] for b in results['battles']) / total_battles
    avg_damage = sum(b['total_damage'] for b in results['battles']) / total_battles
    print(f"\n📊 平均回合数: {avg_rounds:.1f}")
    print(f"💥 平均总伤害: {avg_damage:.1f}")
def tournament_mode(heroes: List[Hero], rounds_per_match: int = 5):
    """锦标赛模式:所有英雄两两对战"""
    print("\n" + "🏆" * 20)
    print("🏆 锦标赛模式开始!")
    print("🏆" * 20)
    tournament_results = {}
    for i in range(len(heroes)):
        for j in range(i + 1, len(heroes)):
            hero1 = heroes[i]
            hero2 = heroes[j]
            print(f"\n🔴 {hero1.name} vs 🟦 {hero2.name}")
            results = start_battle(hero1, hero2, rounds_per_match)
            analyze_results(results)
            # 记录对战结果
            match_key = f"{hero1.name} vs {hero2.name}"
            if results['hero1_wins'] > results['hero2_wins']:
                winner = hero1.name
            elif results['hero2_wins'] > results['hero1_wins']:
                winner = hero2.name
            else:
                winner = "平局"
            tournament_results[match_key] = {
                'winner': winner,
                'hero1_wins': results['hero1_wins'],
                'hero2_wins': results['hero2_wins']
            }
    # 显示锦标赛总结
    print("\n" + "=" * 60)
    print("🏆 锦标赛结果总览")
    print("=" * 60)
    for match, result in tournament_results.items():
        print(f"{match}: {result['winner']} 获胜")
        print(f"   ({result['hero1_wins']}胜 - {result['hero2_wins']}负)")
# 主程序
def main():
    print("⚔️ 英雄对战模拟系统 ⚔️")
    print("=" * 50)
    heroes = create_heroes()
    print("可选的英雄:")
    for i, hero in enumerate(heroes, 1):
        print(f"  {i}. {hero.name} (生命:{hero.health}, 攻击:{hero.attack}, 防御:{hero.defense}, 速度:{hero.speed})")
    while True:
        print("\n请选择模式:")
        print("1. 双人对战")
        print("2. 锦标赛模式(全部对战)")
        print("3. 退出")
        choice = input("\n输入选择 (1-3): ").strip()
        if choice == "1":
            try:
                print("\n选择英雄1:")
                for i, hero in enumerate(heroes, 1):
                    print(f"  {i}. {hero.name}")
                hero1_idx = int(input("输入英雄编号: ")) - 1
                print("\n选择英雄2:")
                for i, hero in enumerate(heroes, 1):
                    print(f"  {i}. {hero.name}")
                hero2_idx = int(input("输入英雄编号: ")) - 1
                if hero1_idx in range(len(heroes)) and hero2_idx in range(len(heroes)):
                    rounds = int(input("训练场数 (建议3-5场): "))
                    results = start_battle(heroes[hero1_idx], heroes[hero2_idx], rounds)
                    analyze_results(results)
                else:
                    print("❌ 无效的英雄编号!")
            except (ValueError, IndexError):
                print("❌ 输入无效!请输入数字")
        elif choice == "2":
            tournament_mode(heroes)
        elif choice == "3":
            print("感谢使用,再见!")
            break
        else:
            print("❌ 无效选择,请重试")
        input("\n按回车继续...")
if __name__ == "__main__":
    main()

运行示例

# 快速测试示例
if __name__ == "__main__":
    # 创建英雄
    hero1 = Hero("剑圣", 1000, 120, 30, 80, 150, 0.25)
    hero2 = Hero("法师", 800, 150, 20, 70, 200, 0.15)
    # 进行5场对战
    results = start_battle(hero1, hero2, rounds=5)
    # 分析结果
    analyze_results(results)

功能特点

  1. 英雄系统:每个英雄有独立的属性(生命、攻击、防御、速度、暴击率、技能威力)
  2. 战斗系统:包含普通攻击、技能攻击、暴击等机制
  3. 统计功能:对战胜率、平均回合数、伤害统计等
  4. 多种模式:双人对战和锦标赛模式
  5. 详细日志:显示每回合的战斗详情

扩展建议

# 添加新英雄
def add_new_heroes():
    return [
        Hero("射手", 850, 160, 20, 90, 170, 0.30),
        Hero("辅助", 950, 70, 35, 75, 200, 0.10),
        Hero("打野", 1100, 130, 35, 85, 160, 0.22)
    ]
# 添加天气系统
weather_effects = {
    'sunny': {'damage_bonus': 1.1, 'defense_penalty': 0.9},
    'rainy': {'damage_penalty': 0.9, 'defense_bonus': 1.1},
    'fog': {'crit_chance_bonus': 0.1, 'accuracy_penalty': 0.9}
}

这个系统非常灵活,可以根据需求扩展更多功能,比如装备系统、技能树、等级系统等。

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