Pacman java游戏运行非常慢,当智能幽灵移动时几乎冻结(DIjkstra算法最短路径)
我遇到的问题是,每当我启用samrt pacaman的计时器,试图找到pacman teh游戏的位置时,它运行得非常慢。我就是不明白为什么 Vakje的意思是盒子。 智能幽灵是一个智能幽灵。 Buur的意思是邻居。 SpeleElement意味着游戏元素。 对不起,荷兰编码。 代码如下: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
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;
}