Javafx 带障碍的广度优先搜索

Javafx 带障碍的广度优先搜索,javafx,breadth-first-search,path-finding,Javafx,Breadth First Search,Path Finding,我目前正在制作一个游戏作为学校项目,我试图找出敌人的路径。我已经做了一个基本的BFS,它工作得很好,但是没有考虑到障碍物,所以当试图接近玩家时,敌人会被障碍物卡住。我尝试过不同的方法,但我得到的只是空指针(我有点理解,但我不知道如何让它工作) 公共类BFS{ 私人玩家; 私人领域; 专用队列; 私人散列图父母; 私有数组列表; 公共BFS(玩家、场){ this.player=player; this.field=字段; this.queue=新建LinkedList(); this.paren

我目前正在制作一个游戏作为学校项目,我试图找出敌人的路径。我已经做了一个基本的BFS,它工作得很好,但是没有考虑到障碍物,所以当试图接近玩家时,敌人会被障碍物卡住。我尝试过不同的方法,但我得到的只是空指针(我有点理解,但我不知道如何让它工作)

公共类BFS{
私人玩家;
私人领域;
专用队列;
私人散列图父母;
私有数组列表;
公共BFS(玩家、场){
this.player=player;
this.field=字段;
this.queue=新建LinkedList();
this.parents=newhashmap();
this.adjTiles=新的ArrayList();
}
公共图书馆(S){
int x=player.getIndiceX();
int y=player.getIndiceY();
Tile player=field.getnextile(y,x);
这个。parents.clear();
this.queue.clear();
这个.adjTiles.clear();
this.queue.add(field.getnextile(y,x));
this.parents.put(field.getnextile(y,x),field.getnextile(y,x));
而(!queue.isEmpty()){
Tile temp=queue.remove();
y=温度getI();
x=温度getJ();
如果(x>0){
this.adjTiles.add(field.getnextile(y,x-1));
}
如果(y>0){
this.adjTiles.add(field.getnextile(y-1,x));
}
if(x<24){
this.adjTiles.add(field.getnextile(y,x+1));
}
if(y<24){
this.adjTiles.add(field.getnextile(y+1,x));
}
对于(int i=0;i
我如何使用它(我的分幅在25x25地图上是32x32,敌人移动4像素乘4像素)

public-void-movedentity(动画版){
Tile nextTile=this.bfs.searchWay(e);
Tile-enemyAt=this.map.getnextile(e.getIndiceY(),e.getIndiceX());
如果(nextile.getI()==enemyAt.getI()&&nextile.getJ()enemyAt.getJ()){
e、 移动权利(实体、无生命实体);
}
if(nextile.getI()>enemyAt.getI()&&nextile.getJ()==enemyAt.getJ()){
e、 向下移动(实体、无生命实体);
}   
}
敌人如何在游戏中陷入困境:

敌人如何在尝试包含等状态概念后陷入困境


您能否提供一个示例用例,具体问题是什么?您需要做的就是检查瓷砖是否是内部循环中的障碍
for(Tile t:adjTiles){if(!t.isBlocked()&&this.parents.putIfAbsent(t,temp)==null){this.queue.add(t);}}
所以我添加了ingame的屏幕截图和敌人运动的代码谢谢你的回答,我尝试了你刚才说的Fabian,但是没有用,给了我空指针异常,我真的不明白为什么,因为你说的是有道理的,敌人只是被困在无处的地方(我会放一个截图)编辑:在主帖子中添加了截图,你看到这个帖子没有得到太多的关注。为什么会这样呢?因为se不能调试我们看不到的代码。要获得更好、更高效的帮助,您需要发布。
public class BFS {
    
    private Player player;
    private Field field;
    private Queue<Tile> queue;
    private HashMap<Tile, Tile> parents;
    private ArrayList<Tile> adjTiles;
    
    public BFS(Player player, Field field) {
        this.player = player;
        this.field = field;
        this.queue = new LinkedList<>();
        this.parents = new HashMap<Tile, Tile>();
        this.adjTiles = new ArrayList<>();
    }
    
    public void lancerBFS() {
        int x = player.getIndiceX();
        int y = player.getIndiceY();
        Tile player = field.getNextTile(y, x);
        
        this.parents.clear();
        this.queue.clear();
        this.adjTiles.clear();
    
        this.queue.add(field.getNextTile(y, x));
        this.parents.put(field.getNextTile(y, x), field.getNextTile(y, x));
        
        while (!queue.isEmpty()) {
            Tile temp = queue.remove();
            y = temp.getI();
            x = temp.getJ();
            
            if (x > 0) {
                this.adjTiles.add(field.getNextTile(y, x-1));
            }
            if (y > 0) {
                this.adjTiles.add(field.getNextTile(y-1, x));
            }
            if (x < 24) {
                this.adjTiles.add(field.getNextTile(y, x+1));
            }
            if (y < 24) {
                this.adjTiles.add(field.getNextTile(y+1, x));
            }
            
            for (int i = 0 ; i < adjTiles.size() ; i++) {
                
                if (!this.parents.containsKey(adjTiles.get(i))) {
                    this.parents.put(this.adjTiles.get(i), temp);
                    this.queue.add(this.adjTiles.get(i));
                }               
            }
            
            this.adjTiles.clear();
        }       
    }
    
    public Tile searchWay(AnimatedEntity entity) {
        int x = entity.getIndiceX();
        int y = entity.getIndiceY();
        
        Tile t = this.field.getNextTile(y, x);
        
        return this.parents.get(t);
    }
    
    public HashMap<Tile, Tile> getParents() {
        return parents;
    }   
}
public void moveEnemy(AnimatedEntity e) {
    Tile nextTile = this.bfs.searchWay(e);
    Tile enemyAt = this.map.getNextTile(e.getIndiceY(), e.getIndiceX());
    
    if (nextTile.getI() == enemyAt.getI() && nextTile.getJ() < enemyAt.getJ()) {
        e.moveLeft(entities, inanimatedEntities);
    }
    if (nextTile.getI() < enemyAt.getI() && nextTile.getJ() == enemyAt.getJ()) {
        e.moveUp(entities, inanimatedEntities);
    }
    if (nextTile.getI() == enemyAt.getI() && nextTile.getJ() > enemyAt.getJ()) {
        e.moveRight(entities, inanimatedEntities);
    }
    if (nextTile.getI() > enemyAt.getI() && nextTile.getJ() == enemyAt.getJ()) {
        e.moveDown(entities, inanimatedEntities);
    }   
}