Javafx 带障碍的广度优先搜索
我目前正在制作一个游戏作为学校项目,我试图找出敌人的路径。我已经做了一个基本的BFS,它工作得很好,但是没有考虑到障碍物,所以当试图接近玩家时,敌人会被障碍物卡住。我尝试过不同的方法,但我得到的只是空指针(我有点理解,但我不知道如何让它工作)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(玩家、场){
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);
}
}