您的位置:首页 > 财经 > 产业 > 游戏AI的创造思路-技术基础-决策树(2)

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

2024/10/6 2:23:36 来源:https://blog.csdn.net/m0_37694276/article/details/140262747  浏览:    关键词:游戏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}")

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com