Pacman java游戏运行非常慢,当智能幽灵移动时几乎冻结(DIjkstra算法最短路径)

Pacman java游戏运行非常慢,当智能幽灵移动时几乎冻结(DIjkstra算法最短路径),java,swing,timer,dijkstra,shortest-path,Java,Swing,Timer,Dijkstra,Shortest Path,我遇到的问题是,每当我启用samrt pacaman的计时器,试图找到pacman teh游戏的位置时,它运行得非常慢。我就是不明白为什么 Vakje的意思是盒子。 智能幽灵是一个智能幽灵。 Buur的意思是邻居。 SpeleElement意味着游戏元素。 对不起,荷兰编码。 代码如下: public abstract class Spookje extends Poppetje { private Queue<Vakje> vakjesToInspect = new LinkedL

我遇到的问题是,每当我启用samrt pacaman的计时器,试图找到pacman teh游戏的位置时,它运行得非常慢。我就是不明白为什么

Vakje的意思是盒子。 智能幽灵是一个智能幽灵。 Buur的意思是邻居。 SpeleElement意味着游戏元素。 对不起,荷兰编码。 代码如下:

public abstract class Spookje extends Poppetje {
private Queue<Vakje> vakjesToInspect = new LinkedList<Vakje>();
private ArrayList<Vakje> visitedvakjes = new ArrayList<Vakje>();
private ArrayList<Vakje> currentVakjes = new ArrayList<Vakje>();
private ArrayList<Vakje> previousVakjes = new ArrayList<Vakje>();
protected Stack<Vakje> movementStack = new Stack<Vakje>();
protected boolean searching = false;

@Override
public void Bewegen(Direction direction) {

}


  private void reset() {
    vakjesToInspect.clear();
    visitedvakjes.clear();
    movementStack.clear();
    currentVakjes.clear();
    previousVakjes.clear();
}

private void search() {
    while (!vakjesToInspect.isEmpty()) {
        Vakje current = vakjesToInspect.remove();
        visitedvakjes.add(current);
        checkNeighbors(current);
    }
}

private void checkNeighbors(final Vakje vakje) {

    for (Vakje u : vakje.buren.values()) {
        if (u.isPacman()) {
            if (!visitedvakjes.contains(u)) {
                vakjesToInspect.add(u);
                currentVakjes.add(u);
                previousVakjes.add(vakje);
            }
            buildMovementStack(u);
            setSearching(false);
            break;
        } else {
            if (!visitedvakjes.contains(u)) {
                vakjesToInspect.add(u);
                currentVakjes.add(u);
                previousVakjes.add(vakje);
            }
        }
    }

}

private void buildMovementStack(Vakje vakje) {
    Vakje current = vakje;

    while (current != this.vakje && !movementStack.contains(current)) {

        movementStack.push(current);
        int index = currentVakjes.indexOf(current);

        Vakje nextStep = previousVakjes.get(index);
        current = nextStep;
    }
}

public void setSearching(boolean searching) {
    this.searching = searching;
}

private void createInitialState() {
    Vakje vakje = this.vakje;
    vakjesToInspect.add(vakje);
}

public void SearchIt() {
    reset();
    createInitialState();
    search();
}

protected void findPacman() {
    reset();
    createInitialState();
    search();
}
}

以下是调用绘图的代码:

public class Speelboard {
public Timer timdronkenspook = new Timer(400, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!FirstRun) {

            for (Vakje vakje : vakken) {
                if (vakje.has(DronkenSpook.class)) {
                    if (vakje.get(DronkenSpook.class) instanceof DronkenSpook) {
                        ((DronkenSpook) vakje.get(DronkenSpook.class)).Move();
                    }

                }
            }

            gamepanel.repaint();
        }
    }
});

public Timer timslimspook = new Timer(100, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!FirstRun) {
            for (Vakje vakje : vakken) {
                if (vakje.has(IntelligentSpook.class)) {
                    if (vakje.get(IntelligentSpook.class) instanceof IntelligentSpook) {
                        ((IntelligentSpook) vakje.get(IntelligentSpook.class)).Move();
                    }
                }
            }

            gamepanel.repaint();
        }

    }
});

public Timer timpacman = new Timer(190, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!FirstRun) {
            pacman.Bewegen();

        }

        if (pacman.getgegetenbolletje() > aantalBolletjes / 2 && toonKers) {
            plaatsKers();
            toonKers = false;
        }

        if (pacman.getgegetenbolletje() == aantalBolletjes) {

            aantalBolletjes = 0;
            volgendeLevel();

            gamepanel.addkeyPacman();
        }
        gamepanel.repaint();

    }
});

public ArrayList<Vakje> vakken = new ArrayList<Vakje>();

private ArrayList<Vakje> vakjes;
public ArrayList<SpelElement> spelElements;
public LevelHandler levelhandler = new LevelHandler();
private int[] level;
public Pacman pacman;
public DronkenSpook dronkenspook;
public int aantalBolletjes;
public int timeplayed = 1;
private boolean toonKers = true;

Image gameover = new ImageIcon("gameover.png").getImage();
Image win = new ImageIcon("youwin.png").getImage();

Vakje vak;
public GamePanel gamepanel;

public Speelboard(GamePanel gamepanel) {
    this.setLevel(levelhandler.level_one);
    this.laden();
    this.gamepanel = gamepanel;

}

public void setLevel(int[] level) {
    this.level = level;
}

public int[] getLevel() {
    return level;
}

public Speelboard() {
    this.setLevel(levelhandler.level_one);
    this.laden();

}

public void laden() {
    vakken = new ArrayList<>();
    for (int i = 0; i < level.length; i++) {

        switch (level[i]) {
            case 0:
                aantalBolletjes = aantalBolletjes + 1;
                vakken.add(new Leegvakje(new NormaalBolletje(10)));
                break;
            case 1:
                vakken.add(new Muur(40, 40, 40, 40));
                break;
            case 2:
                vakken.add(new Leegvakje(new IntelligentSpook(pacman)));
                break;
            case 3:
                pacman = new Pacman();
                vakken.add(new Leegvakje(pacman));
                break;
            case 4:
                dronkenspook = new DronkenSpook();

                vakken.add(new Leegvakje(dronkenspook));
                break;
            case 5:
                vakken.add(new Leegvakje(new SuperBolletje(0)));
                break;
        }
    }
    this.vakjesVerdelen();

}

private void vakjesVerdelen() {
    int y = 0;
    int x = 0;
    int i = 0;
    for (Vakje vakje : vakken) {
        vakje.setyPos(y);
        vakje.setxPos(x);
        x = x + vakje.getWidth();

        // Dit checkt of er kolommen naast zijn
        if (i % levelhandler.rowMax == 0) {
            vakje.toevoegenBuurVakje(Direction.EAST, (Vakje) vakken.get(i + 1));
        } else if (i % levelhandler.rowMax == levelhandler.rowMax - 1) {
            vakje.toevoegenBuurVakje(Direction.WEST, (Vakje) vakken.get(i - 1));
        } else {
            vakje.toevoegenBuurVakje(Direction.EAST, (Vakje) vakken.get(i + 1));
            vakje.toevoegenBuurVakje(Direction.WEST, (Vakje) vakken.get(i - 1));
        }

        // Dit checkt of er rijen boven en onder zijn
        if (Math.floor(i / levelhandler.rowMax) == 0) {
            vakje.toevoegenBuurVakje(Direction.SOUTH, (Vakje) vakken.get(i + levelhandler.rowMax));
        } else if (Math.floor(i / levelhandler.rowMax) == this.level.length / levelhandler.rowMax - 1) {
            vakje.toevoegenBuurVakje(Direction.NORTH, (Vakje) vakken.get(i - levelhandler.rowMax));
        } else {
            vakje.toevoegenBuurVakje(Direction.SOUTH, (Vakje) vakken.get(i + levelhandler.rowMax));
            vakje.toevoegenBuurVakje(Direction.NORTH, (Vakje) vakken.get(i - levelhandler.rowMax));
        }

        i++;

        if (i % levelhandler.rowMax == 0) {
            y = y + vakje.getHeight();
            x = 0;
        }
    }
    pacman.setActive(true);
    FirstRun = false;
}

public void plaatsKers() {
    ArrayList<Vakje> vakjes = this.zoekLeegVakje();
    Random random = new Random();

    Vakje kersVak = vakjes.get(random.nextInt(vakjes.size()));

    Kers kersje = new Kers(100);
    kersje.setVakje(kersVak);
    kersVak.addSpelElement(kersje);
}

private void endGame(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    if (pacman.getcheckGamestatus() == false) {
        gamepanel.stop();
        pacman.setActive(false);
        g2.setColor(Color.black);
        g2.fillRect(0, 0, 1240, 687);

        g2.setColor(Color.white);
        g2.setFont(new Font("TimesRoman", Font.PLAIN, 24));

        if (timeplayed <= 3) {
            g2.drawImage(gameover, -100, 0, 1100, 500, null);
        } else if (timeplayed == 4) {
            g2.drawImage(win, -180, 0, 1100, 500, null);
        }

        g2.setFont(new Font("TimesRoman", Font.PLAIN, 20));
        g2.drawString("Uw score: " + pacman.score, 360, 500);
        g2.drawString("Druk op R om opnieuw te starten of druk op de restart knop", 200, 50);
    }
}

private ArrayList<Vakje> zoekLeegVakje() {
    ArrayList<Vakje> LeegVakjes = new ArrayList<>();
    for (Vakje vakje : this.vakken) {
        if (vakje.isEmpty()) {
            LeegVakjes.add(vakje);
        }
    }

    return LeegVakjes;
}

public Speelboard(ArrayList<SpelElement> spelElements, ArrayList<Vakje> vakjes) {
    this.spelElements = spelElements;
    this.vakjes = vakjes;
}
public boolean FirstRun = true;

public void draw(Graphics g) {

    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.BLACK);
    g2.fillRect(1, 400, 200, 100);
    g2.setColor(Color.white);
    g2.setFont(new Font("Helvetica Neue", Font.CENTER_BASELINE, 24));
    g2.setRenderingHint(
            RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
    g2.drawString("Score: " + pacman.score, 40, 470);
    g2.drawString("levens: " + pacman.levens, 40, 500);

    g2.setColor(Color.lightGray);

    for (Vakje vakje : vakken) {
        vakje.draw(g);
    }
    endGame(g);

}

public void volgendeLevel() {
    timeplayed++;

    switch (timeplayed) {
        case 2:
            timdronkenspook.setDelay(300);
            this.setLevel(levelhandler.level_two);

            break;
        case 3:
            timdronkenspook.setDelay(230);
            this.setLevel(levelhandler.level_three);
            break;
    }

    if (timeplayed <= 3) {
        this.laden();

    } else {
        pacman.SetcheckGamestatus(false);
    }
}

public ArrayList<Vakje> getVakjes() {
    return vakjes;
}

public ArrayList<SpelElement> getSpelElements() {
    return spelElements;
}

public int getaantalbolletje() {
    return aantalBolletjes;
}

public void setaantalbolletjes(int aantalbolletjes) {
    aantalBolletjes = aantalbolletjes;
}
公共类专用板{
公共计时器timdronkenspook=新计时器(400,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(!FirstRun){
用于(Vakje-Vakje:vakken){
如果(vakje.has(DronkenSpook.class)){
if(vakje.get(DronkenSpook.class)DronkenSpook实例){
((DronkenSpook)vakje.get(DronkenSpook.class)).Move();
}
}
}
gamepanel.repaint();
}
}
});
公共计时器timslimspook=新计时器(100,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(!FirstRun){
用于(Vakje-Vakje:vakken){
if(vakje.has(IntelligentSpook.class)){
if(vakje.get(IntelligentSpook.class)IntelligentSpook的实例){
((IntelligentSpook)vakje.get(IntelligentSpook.class)).Move();
}
}
}
gamepanel.repaint();
}
}
});
公共计时器timpacman=新计时器(190,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
如果(!FirstRun){
pacman.Bewegen();
}
if(pacman.getgegetenbolletje()>aantalBolletjes/2&&toonKers){
plaatsKers();
toonKers=假;
}
if(pacman.getgegetenbolletje()==aantalBolletjes){
aantalBolletjes=0;
volgendeLevel();
gamepanel.addkeyPacman();
}
gamepanel.repaint();
}
});
public ArrayList vakken=new ArrayList();
私人ArrayList vakjes;
公共阵列列表;
public-LevelHandler-LevelHandler=new-LevelHandler();
私有int[]级别;
公共吃豆人;
公共DronkenSpook DronkenSpook;
安塔博利特耶斯公共酒店;
公共int timeplayed=1;
私有布尔toonKers=true;
Image gameover=新图像图标(“gameover.png”).getImage();
Image-win=new-ImageIcon(“youwin.png”).getImage();
瓦克杰·瓦克;
公共游戏面板游戏面板;
公共Speelboard(游戏面板游戏面板){
this.setLevel(levelhandler.level_one);
这个;
this.gamepanel=gamepanel;
}
公共void setLevel(int[]级别){
这个水平=水平;
}
public int[]getLevel(){
回报水平;
}
公共配电板(){
this.setLevel(levelhandler.level_one);
这个;
}
公共图书馆{
vakken=新的ArrayList();
对于(int i=0;ipublic class Speelboard {
public Timer timdronkenspook = new Timer(400, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!FirstRun) {

            for (Vakje vakje : vakken) {
                if (vakje.has(DronkenSpook.class)) {
                    if (vakje.get(DronkenSpook.class) instanceof DronkenSpook) {
                        ((DronkenSpook) vakje.get(DronkenSpook.class)).Move();
                    }

                }
            }

            gamepanel.repaint();
        }
    }
});

public Timer timslimspook = new Timer(100, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!FirstRun) {
            for (Vakje vakje : vakken) {
                if (vakje.has(IntelligentSpook.class)) {
                    if (vakje.get(IntelligentSpook.class) instanceof IntelligentSpook) {
                        ((IntelligentSpook) vakje.get(IntelligentSpook.class)).Move();
                    }
                }
            }

            gamepanel.repaint();
        }

    }
});

public Timer timpacman = new Timer(190, new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        if (!FirstRun) {
            pacman.Bewegen();

        }

        if (pacman.getgegetenbolletje() > aantalBolletjes / 2 && toonKers) {
            plaatsKers();
            toonKers = false;
        }

        if (pacman.getgegetenbolletje() == aantalBolletjes) {

            aantalBolletjes = 0;
            volgendeLevel();

            gamepanel.addkeyPacman();
        }
        gamepanel.repaint();

    }
});

public ArrayList<Vakje> vakken = new ArrayList<Vakje>();

private ArrayList<Vakje> vakjes;
public ArrayList<SpelElement> spelElements;
public LevelHandler levelhandler = new LevelHandler();
private int[] level;
public Pacman pacman;
public DronkenSpook dronkenspook;
public int aantalBolletjes;
public int timeplayed = 1;
private boolean toonKers = true;

Image gameover = new ImageIcon("gameover.png").getImage();
Image win = new ImageIcon("youwin.png").getImage();

Vakje vak;
public GamePanel gamepanel;

public Speelboard(GamePanel gamepanel) {
    this.setLevel(levelhandler.level_one);
    this.laden();
    this.gamepanel = gamepanel;

}

public void setLevel(int[] level) {
    this.level = level;
}

public int[] getLevel() {
    return level;
}

public Speelboard() {
    this.setLevel(levelhandler.level_one);
    this.laden();

}

public void laden() {
    vakken = new ArrayList<>();
    for (int i = 0; i < level.length; i++) {

        switch (level[i]) {
            case 0:
                aantalBolletjes = aantalBolletjes + 1;
                vakken.add(new Leegvakje(new NormaalBolletje(10)));
                break;
            case 1:
                vakken.add(new Muur(40, 40, 40, 40));
                break;
            case 2:
                vakken.add(new Leegvakje(new IntelligentSpook(pacman)));
                break;
            case 3:
                pacman = new Pacman();
                vakken.add(new Leegvakje(pacman));
                break;
            case 4:
                dronkenspook = new DronkenSpook();

                vakken.add(new Leegvakje(dronkenspook));
                break;
            case 5:
                vakken.add(new Leegvakje(new SuperBolletje(0)));
                break;
        }
    }
    this.vakjesVerdelen();

}

private void vakjesVerdelen() {
    int y = 0;
    int x = 0;
    int i = 0;
    for (Vakje vakje : vakken) {
        vakje.setyPos(y);
        vakje.setxPos(x);
        x = x + vakje.getWidth();

        // Dit checkt of er kolommen naast zijn
        if (i % levelhandler.rowMax == 0) {
            vakje.toevoegenBuurVakje(Direction.EAST, (Vakje) vakken.get(i + 1));
        } else if (i % levelhandler.rowMax == levelhandler.rowMax - 1) {
            vakje.toevoegenBuurVakje(Direction.WEST, (Vakje) vakken.get(i - 1));
        } else {
            vakje.toevoegenBuurVakje(Direction.EAST, (Vakje) vakken.get(i + 1));
            vakje.toevoegenBuurVakje(Direction.WEST, (Vakje) vakken.get(i - 1));
        }

        // Dit checkt of er rijen boven en onder zijn
        if (Math.floor(i / levelhandler.rowMax) == 0) {
            vakje.toevoegenBuurVakje(Direction.SOUTH, (Vakje) vakken.get(i + levelhandler.rowMax));
        } else if (Math.floor(i / levelhandler.rowMax) == this.level.length / levelhandler.rowMax - 1) {
            vakje.toevoegenBuurVakje(Direction.NORTH, (Vakje) vakken.get(i - levelhandler.rowMax));
        } else {
            vakje.toevoegenBuurVakje(Direction.SOUTH, (Vakje) vakken.get(i + levelhandler.rowMax));
            vakje.toevoegenBuurVakje(Direction.NORTH, (Vakje) vakken.get(i - levelhandler.rowMax));
        }

        i++;

        if (i % levelhandler.rowMax == 0) {
            y = y + vakje.getHeight();
            x = 0;
        }
    }
    pacman.setActive(true);
    FirstRun = false;
}

public void plaatsKers() {
    ArrayList<Vakje> vakjes = this.zoekLeegVakje();
    Random random = new Random();

    Vakje kersVak = vakjes.get(random.nextInt(vakjes.size()));

    Kers kersje = new Kers(100);
    kersje.setVakje(kersVak);
    kersVak.addSpelElement(kersje);
}

private void endGame(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    if (pacman.getcheckGamestatus() == false) {
        gamepanel.stop();
        pacman.setActive(false);
        g2.setColor(Color.black);
        g2.fillRect(0, 0, 1240, 687);

        g2.setColor(Color.white);
        g2.setFont(new Font("TimesRoman", Font.PLAIN, 24));

        if (timeplayed <= 3) {
            g2.drawImage(gameover, -100, 0, 1100, 500, null);
        } else if (timeplayed == 4) {
            g2.drawImage(win, -180, 0, 1100, 500, null);
        }

        g2.setFont(new Font("TimesRoman", Font.PLAIN, 20));
        g2.drawString("Uw score: " + pacman.score, 360, 500);
        g2.drawString("Druk op R om opnieuw te starten of druk op de restart knop", 200, 50);
    }
}

private ArrayList<Vakje> zoekLeegVakje() {
    ArrayList<Vakje> LeegVakjes = new ArrayList<>();
    for (Vakje vakje : this.vakken) {
        if (vakje.isEmpty()) {
            LeegVakjes.add(vakje);
        }
    }

    return LeegVakjes;
}

public Speelboard(ArrayList<SpelElement> spelElements, ArrayList<Vakje> vakjes) {
    this.spelElements = spelElements;
    this.vakjes = vakjes;
}
public boolean FirstRun = true;

public void draw(Graphics g) {

    Graphics2D g2 = (Graphics2D) g;
    g2.setColor(Color.BLACK);
    g2.fillRect(1, 400, 200, 100);
    g2.setColor(Color.white);
    g2.setFont(new Font("Helvetica Neue", Font.CENTER_BASELINE, 24));
    g2.setRenderingHint(
            RenderingHints.KEY_TEXT_ANTIALIASING,
            RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
    g2.drawString("Score: " + pacman.score, 40, 470);
    g2.drawString("levens: " + pacman.levens, 40, 500);

    g2.setColor(Color.lightGray);

    for (Vakje vakje : vakken) {
        vakje.draw(g);
    }
    endGame(g);

}

public void volgendeLevel() {
    timeplayed++;

    switch (timeplayed) {
        case 2:
            timdronkenspook.setDelay(300);
            this.setLevel(levelhandler.level_two);

            break;
        case 3:
            timdronkenspook.setDelay(230);
            this.setLevel(levelhandler.level_three);
            break;
    }

    if (timeplayed <= 3) {
        this.laden();

    } else {
        pacman.SetcheckGamestatus(false);
    }
}

public ArrayList<Vakje> getVakjes() {
    return vakjes;
}

public ArrayList<SpelElement> getSpelElements() {
    return spelElements;
}

public int getaantalbolletje() {
    return aantalBolletjes;
}

public void setaantalbolletjes(int aantalbolletjes) {
    aantalBolletjes = aantalbolletjes;
}