游戏AI –行为树简介

游戏AI是一个非常广泛的主题,尽管有很多资料,但我找不到能以较慢,更容易理解的速度缓慢介绍这些概念的东西。 本文将尝试解释如何基于行为树的概念来设计一个非常简单但可扩展的AI系统。

什么是AI?

人工智能是参与游戏的实体表现出的类似于人类的行为。 这是实体对智能和周到动作的幻想,而不是实际的智能推理驱动的行为。 目的是试图欺骗玩家,使他们认为其他“智能”实体是由人类而不是机器控制的。 说起来容易做起来难,但是我们可以使用很多技巧来实现一些真正好的,看似随机和“智能”的行为。

一个例子

在跳入有趣的话题之前,让我们起草一个我们想要实现的目标的计划。 同样,我将以机器人为例。 想象一下一个竞技场,机器人将在其中争夺战,最后一个站位的机器人都是赢家。

竞技场将是一块木板,机器人将随机放置在上面。 我们将其制作为基于回合的游戏,以便我们可以追踪整个AI的发展,但可以轻松地将其转变为实时游戏。

规则很简单:

  • 木板是矩形
  • 机器人可以在任一方向上每转一圈将瓷砖移动到任何相邻的未占用瓷砖上
  • 机器人具有一定范围,并且可以向其范围内的机器人发射
  • 机器人将具有通常的属性:它们造成的伤害和生命值

为了简单起见,我们将使用非常简单的结构。 该应用程序将具有Droid类和Board类。 机器人将具有以下定义它的属性:

public class Droid {

    final String name;
    int x;
    int y;
    int range;
    int damage;
    int health;

    Board board;

    public Droid(String name, int x, int y, int health, int damage, int range) {
        this.name = name;
        this.x = x;
        this.y = y;
        this.health = health;
        this.damage = damage;
        this.range = range;
    }

    public void update() {
        // placeholder for each turn or tick
    }

    /* ... */
    /* getters and setters and toString() */
    /* ... */
}

Droid只是具有一些属性的简单pojo。 这些属性不言自明,但这是它们的简短摘要:

  • name -这个机器人的唯一名称,可用于ID,以及。
  • xy –网​​格上的坐标。
  • healthdamagerange -它说了什么。
  • board –是机器人所在的Board以及其他机器人的参考。 我们需要这样做,因为机器人将通过了解其环境(即board <./ li>)来做出决策。

还有一个空的update()方法,每次droid结束旋转时都会调用该方法。 如果是实时游戏,则从游戏循环(最好是从游戏引擎)中调用update方法。

还有一些明显的getter和setter以及toString()方法,它们从清单中省略了。 Board类非常简单。

public class Board {

    final int width;
    final int height;

    private List<Droid> droids = new ArrayList<Droid>();

    public Board(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public int getWidth() {
        return width;
    }

    public int getHeight() {
        return height;
    }

    public void addDroid(Droid droid) {
        if (isTileWalkable(droid.getX(), droid.getY())) {
            droids.add(droid);
            droid.setBoard(this);
        }
    }

    public boolean isTileWalkable(int x, int y) {
        for (Droid droid : droids) {
            if (droid.getX() == x && droid.getY() == y) {
                return false;
            }
        }
        return true;
    }

    public List<Droid> getDroids() {
        return droids;
    }
}

它具有widthheight ,并且包含机器人列表。 它还包含一些方便的方法来检查给定坐标上是否已存在机器人,以及一种轻松地逐个添加机器人的方法。

到目前为止,这是相当标准的。 我们可以在板上散布一些机器人,但它们不会做任何事情。 我们可以创建板,向其中添加一些机器人,然后开始调用update() 。 它们只是一些愚蠢的机器人。

不太傻的机器人

为了使droid做某事,我们可以在其update()方法中实现逻辑。 这就是所谓的每一次跳动或在我们的情况下每转一次的方法。 例如,我们希望我们的机器人在竞技场(木板)上徘徊,如果他们看到射程范围内的其他机器人,请接合它们并开始向它们射击直到它们死亡。 这将是非常基本的AI,但仍然是AI。

伪代码如下所示:
if enemy in range then fire missile at it
otherwise pick a random adjacent tile and move there

这意味着,机器人之间的任何相互作用都将导致僵持,较弱的机器人会被破坏。 我们可能要避免这种情况。 因此,我们可以补充一下,如果机器人有可能丢失,请尝试逃跑。 仅在无处可逃时站起来战斗。

if enemy in range then
if enemy is weaker then fight escape route exists then escape fight wander

一切都很好。 机器人将开始“智能化”地行动,但除非我们添加更多代码来做更多聪明的事情,否则它们仍然非常有限。 而且,它们将起到相同的作用。 想象一下,如果将它们放在更复杂的舞台上。 在竞技场上,有一些道具如力量道具可以增强力量,可以避免障碍。 例如,当机器人四处飞来飞去时,请决定在拿起医疗/修理包与拿起武器加电之间。
它很快就会失控。 如果我们想要一个行为不同的机器人该怎么办。 一个是攻击机器人,另一个是修理机器人。 我们当然可以通过对象合成来实现这一目标 ,但是机器人的大脑将极其复杂,游戏设计的任何变化都需要付出巨大的努力才能适应。

让我们看看是否可以提出一个可以解决这些问题的系统。

大脑来了

我们可以将机器人的AI模块视为某种大脑。 大脑由遵循一系列规则作用于机器人的几个例程组成。 这些规则支配着例程的执行,因此它将生存和赢得比赛的机会最大化作为最终目标。 如果我们想到由例程组成的人类大脑,并以马斯洛的需求层次作为参考,我们可以立即识别出一些例程。

  • 生理程序 –每次都需要执行的程序,否则将没有任何生命
  • 生存例程 –一旦满足生活条件,就必须执行此例程,以确保长期生存
  • 有抱负的例程 –如果在维持生计后仍需要再次执行生计时还剩下时间,将执行此例程

让我们分解一下人类的智慧。 人类需要呼吸才能生存。 每次呼吸都消耗能量。 一个人可以呼吸这么多,直到能量耗尽。 要补充能量,就需要吃饭。 一个人只有在他/她有食物可支配的情况下才能吃饭。 如果没有可用的食物

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值