自学内容网 自学内容网

游戏AI的创造思路-技术基础-决策树(2)

上一篇写了决策树的基础概念和一些简单例子,本篇将着重在实际案例上进行说明

目录

8. 决策树应用的实际例子

8.1. 方法和过程

8.1.1. 定义行为

8.1.2. 确定属性

8.1.3. 构建决策树

8.1.4. 实施行为

8.1.5. 实时更新

8.2. Python代码


8. 决策树应用的实际例子

模拟空战游戏中,AI使用决策树算法,控制多个NPC敌方战机协同攻击玩家。

8.1. 方法和过程

8.1.1. 定义行为

敌方战机可能的行为包括:进攻、防守、掩护、撤退等。

8.1.2. 确定属性

影响决策的属性可能包括:

敌方战机的数量、位置、速度、武器状态

玩家战机的位置、速度、武器状态等

8.1.3. 构建决策树

根据属性构建决策节点,例如:

  • 如果敌方战机数量大于玩家,且敌方战机位置靠近玩家,则选择进攻。
  • 如果敌方战机数量少于玩家,且敌方战机位置分散,则选择掩护和撤退。
  • 如果敌方战机有优势武器,则选择优先使用优势武器进攻。
  • 考虑敌机的武器状态和剩余弹药:在决定使用哪种武器进攻时,应该考虑武器的可用性和剩余弹药。
  • 考虑盟友和敌人的位置:在决定行动时,应该考虑盟友和敌人的相对位置,以避免友军伤害和优先攻击较弱的敌人。
  • 增加撤退逻辑:当敌机健康状态很低时,应该优先考虑撤退而不是进攻。
  • 引入随机性:在决策过程中引入一些随机性,使得敌机的行为更加难以预测。
  • 优化机动规避逻辑:机动规避时,应该考虑玩家的位置和速度,以便更有效地规避攻击。
  • 协同策略
    • 制定敌方战机之间的协同策略,例如:
    • 分配攻击目标,确保每架敌方战机都有明确的攻击对象。
    • 制定掩护策略,保护处于劣势的战机。
    • 制定撤退策略,当战机受损严重时撤退。

8.1.4. 实施行为

根据决策树的结果,敌方战机执行相应的行为。

8.1.5. 实时更新

战场环境是实时变化的,因此需要不断更新属性,并重新进行决策。

8.2. Python代码

 在这个实现中,EnemyFighter类代表敌方战机,具有ID、位置、速度和武器状态等属性。

EnemyFighter类中的health属性用来表示敌方战机的健康状态。decide_action方法现在考虑了更多的因素,包括战机的健康状态、与玩家的距离、敌方和盟友的数量,以及武器的状态。

EnemyFighter类的position属性现在是一个三维坐标。distance_to方法用于计算三维空间中的距离。

EnemyFighter类的evade方法,用于进行机动规避、加速,并快速改变自身所在位置。

decide_action方法现在会在距离目标小于23000时调用evade方法,并执行相应的规避动作。

EnemyFighter类用choose_weapon方法来根据距离选择合适的武器,并且在decide_action方法中考虑了武器的可用性和剩余弹药。

最后,我们模拟了一个战场环境,并让每架敌方战机做出决策。

以下上代码

import math  
import random  
  
class EnemyFighter:  
    def __init__(self, id, position, speed, weapon_status, health, ammo):  
        self.id = id  
        self.position = position  # (x, y, z)  
        self.speed = speed  
        self.weapon_status = weapon_status  # 字典,包含武器名称和状态  
        self.health = health  
        self.ammo = ammo  # 字典,包含武器名称和剩余弹药  
  
    def distance_to(self, other_position):  
        return math.sqrt((self.position[0] - other_position[0])**2 +  
                         (self.position[1] - other_position[1])**2 +  
                         (self.position[2] - other_position[2])**2)  
  
    def choose_weapon(self, distance_to_player):  
        available_weapons = [weapon for weapon, status in self.weapon_status.items() if status == "可用"]  
        if not available_weapons:  
            return None  
          
        # 根据距离选择合适的武器  
        if distance_to_player <= 500:  
            return "机炮"  
        elif 500 < distance_to_player <= 5000:  
            return "近距空空弹"  
        elif 5000 < distance_to_player <= 23000:  
            return "中距空空弹"  
        elif 23000 < distance_to_player <= 100000:  
            return "远程空空弹"  
        return None  
  
    def evade(self, player_position):  
        max_evade_distance = 500  
        evade_direction = (random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1))  
        evade_distance = random.uniform(0, max_evade_distance)  
        self.position = (  
            self.position[0] + evade_direction[0] * evade_distance,  
            self.position[1] + evade_direction[1] * evade_distance,  
            self.position[2] + evade_direction[2] * evade_distance  
        )  
        self.speed *= 1.5  
  
    def decide_action(self, player_position, allies, enemies):  
        if self.health < 30:  
            return "撤退"  
          
        distance_to_player = self.distance_to(player_position)  
        weapon = self.choose_weapon(distance_to_player)  
          
        if distance_to_player < 23000:  
            self.evade(player_position)  
            return "机动规避,加速,并快速改变位置"  
          
        if weapon:  
            if self.ammo[weapon] > 0:  
                return f"使用{weapon}进攻"  
            else:  
                return "武器弹药耗尽,寻找补给或撤退"  
          
        return "等待时机接近目标或寻找其他敌人"  
  
# 模拟战场环境 
player_position = (5000, 5000, 0)  
enemies = [  
    EnemyFighter(1, position=(1000, 1000, 0), speed=100, weapon_status="全武器可用", health=100),  
    EnemyFighter(2, position=(1500, 1500, 0), speed=120, weapon_status="全武器可用", health=80),  
    EnemyFighter(3, position=(2000, 2000, 0), speed=110, weapon_status="全武器可用", health=60)  
]  
allies = [  
    EnemyFighter(4, position=(3000, 3000, 0), speed=100, weapon_status="全武器可用", health=100),  
    EnemyFighter(5, position=(3500, 3500, 0), speed=100, weapon_status="全武器可用", health=90)  
]  
  
# 敌方战机做出决策  
for enemy in enemies:  
    action = enemy.decide_action(player_position, allies, enemies)  
    print(f"敌方战机{enemy.id}(位置:{enemy.position},健康:{enemy.health})决定:{action}")


原文地址:https://blog.csdn.net/m0_37694276/article/details/140262747

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!