游戏AI算法,敌人跟随玩家

我正在使用LigGdx制作一款游戏,看起来像是一款RPG游戏。当敌人处于警戒状态时,它需要跟随玩家,但它只能向前、向后、向左和向右移动,并且在碰撞时需要绕过障碍物,寻找到达玩家的最佳路径。我在游戏开发方面是个新手,我的算法可能完全错误,所以,我真的需要帮助…

private void enemyInAlert(Enemy enemy, float delta) {    detectDirection(enemy);    enemyWalking(enemy, delta);    if (Math.round(getDistanceXofLastPosition(enemy)) == 0 && Math.round(getDistanceYofLastPosition(enemy)) == 0) {        enemy.setState(States.IDLE);        lastPosition = null;    }}private void detectDirection(Enemy enemy) {    float diff = getDistanceXofLastPosition(enemy) - getDistanceYofLastPosition(enemy);    if (diff < 0) {        getDirectionX(enemy);    } else if (diff > 0) {        getDirectionY(enemy);    }}private void getDirectionY(Enemy enemy) {        int enemyY = Math.round(enemy.getY());        int lastPositionY = Math.round(lastPosition.getY());        if (enemyY < lastPositionY && enemy.isDirectionBlocked(Direction.FORWARD) == false) { //敌人需要向前走            enemy.setDirection(Direction.FORWARD);            enemy.blockDirection(Direction.BACKWARD);        } else if (enemyY > lastPositionY && enemy.isDirectionBlocked(Direction.FORWARD) == false) { //敌人需要向后走            enemy.setDirection(Direction.BACKWARD);            enemy.blockDirection(Direction.FORWARD);        } else { //敌人需要改变方向            if (enemy.isDirectionBlocked(Direction.LEFT) == false || enemy.isDirectionBlocked(Direction.LEFT) == false) {                enemy.blockDirection(Direction.BACKWARD);                enemy.blockDirection(Direction.FORWARD);                getDirectionX(enemy);            } else {                sortRandomDirection(enemy);            }        }    }    private void getDirectionX(Enemy enemy) {        int enemyX = Math.round(enemy.getX());        int lastPositionX = Math.round(lastPosition.getX());        if (enemyX < lastPositionX && enemy.isDirectionBlocked(Direction.RIGHT) == false) { //敌人需要向右走             enemy.setDirection(Direction.RIGHT);            enemy.blockDirection(Direction.LEFT);        } else if (enemyX > lastPositionX && enemy.isDirectionBlocked(Direction.LEFT) == false) {            enemy.setDirection(Direction.LEFT);            enemy.blockDirection(Direction.RIGHT);        } else { //敌人需要改变方向            if (enemy.isDirectionBlocked(Direction.FORWARD) == false && enemy.isDirectionBlocked(Direction.BACKWARD) == false) {                enemy.blockDirection(Direction.LEFT);                enemy.blockDirection(Direction.RIGHT);                getDirectionY(enemy);            } else {                sortRandomDirection(enemy);            }        }    }

我接受建议,我可以更改所有代码,不留情面… 抱歉我的英语不好 😀

谢谢!!

编辑:现在,我正在尝试使用A*,或类似的东西。:D … 我的代码:

    private void calculateRoute(Enemy enemy) {        int lowerPath = getDistanceXofLastPosition(enemy.getBounds()) + getDistanceYofLastPosition(enemy.getBounds());        path = new ArrayList<Rectangle>();        Rectangle finalRect = new Rectangle(enemy.getBounds());        List<Rectangle> openList = new ArrayList<Rectangle>();        while (getDistanceXofLastPosition(finalRect) > 0 || getDistanceYofLastPosition(finalRect) > 0) {            for (int i = -1; i < 2; i+= 1) {                outerloop:                for (int j = -1; j < 2; j+= 1) {                    Rectangle temp = new Rectangle(finalRect);                    temp.offSet(i, j);                    if (openList.contains(temp)) {                        continue;                    }                    if ((i == -1 && j == -1) || (i == 1 && j == -1) || (i == 0 && j == 0) || (i == 1 && j == -1) || (i == 1 && j == 1)) {                        continue;                    }                    for (Collider collider : colliders) {                        if (collider.isSolid() && Utils.detectCollision(temp, collider.getBounds())) {                            continue outerloop;                        }                    }                    openList.add(temp);                }            }            int lowerDistance = Integer.MAX_VALUE;            for (Rectangle rect : openList) {                int distance = getDistanceXofLastPosition(rect) + getDistanceYofLastPosition(rect);                distance = distance + lowerPath;                if (distance < lowerDistance) {                    lowerDistance = distance;                    finalRect = rect;                }            }            path.add(new Rectangle(finalRect));        }}

但是运行速度很慢,我可以做些什么来提高性能?


回答:

你可能需要研究一下A*算法。

你可以轻松地将你的地图转换成一个图,使用每个瓦片作为顶点,并使该顶点与所有靠近它的其他顶点通过边连接。边的成本可能是可变的,例如,在河上移动一个瓦片可能比在平地上移动一个瓦片的成本更高。

然后你可以使用路径搜索算法来寻找从一点到另一点的最佳路径。使用这种算法会有两个缺点:

  1. 它有很高的计算成本
  2. 它总是找到最优解,使你的机器人比普通玩家更聪明 🙂

如果计算和存储成本确实是个问题,你可以选择A*的变种之一,例如

  • IDA*,用于降低内存需求,通过迭代解决方案的深度
  • SMA*,限制算法可以使用的内存量

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注