[Edit]: Sorry habe vorhin ausversehn im AWT, Swing und SWT Forum unangemeldet gepostet. Bitte löschen!
Hallo Leute hab mal wieder ne Frage und zwar schreibe ich zur Zeit eine Facharbeit in Informatik über das Thema "Pathfinding in Java" und hab hierzu follgendes Beispielapplet, dass den A*-Algorithmus simulieren soll:
Das erste Problem ist ich krieg die Aplication nicht vernünftig beendet, weil ich nicht weiss wo die Threads gesetzt und beendet werden müssen.
Das zweite Problem ist, dass die Darstellung nicht richtig funktioniert: manchmal ja, manchmal halb, manchmal fast garnicht.
Ich hoffe ihr könnt mir weiterhelfen!
Danke schon mal im Voraus!
Mfg Deniz Engin a.k.a Halo_Player
Hallo Leute hab mal wieder ne Frage und zwar schreibe ich zur Zeit eine Facharbeit in Informatik über das Thema "Pathfinding in Java" und hab hierzu follgendes Beispielapplet, dass den A*-Algorithmus simulieren soll:
Code:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class A_Stern //implements KeyListener
{
Vector offen=new Vector();
Vector geschlossen=new Vector();
Quadrat aktuell;
Frame frame=new Frame();
int size=32;
int start,ziel;
int[] matrix=new int[32*32];
public static void main(String[] args) {A_Stern start=new A_Stern();}
public A_Stern()
{
frame.setSize(960,960);
Dimension d=Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((d.width-frame.getSize().width)/2,(d.height-frame.getSize().height)/2);
frame.setVisible(true);
erstelleMatrix();
start=position(10,15); // Hier wird der Startpunkt eingetragen !
ziel=position(20,15);
Quadrat pfad=berechnePfad(start,ziel);
paint(frame.getGraphics());
if(pfad==null)
{
System.out.println("Es gibt keinen Pfad");
}else
zeigePfad(pfad);
}
public void erstelleMatrix()
{
// erst mal ein leeres Array
for(int i=0;i<size;i++)
for(int o=0;o<size;o++)
matrix[i+o*size]=0;
// Die Hindernisse
for(int i=0;i<22;i++)
matrix[position(15,i)]=1;
for(int i=0;i<22;i++)
matrix[position(3+i,5)]=1;
for(int i=0;i<22;i++)
matrix[position(3+i,20)]=1;
}
public int position(int x, int y) {return x+y*size;}
public int getX(int position) {return position%size;}
public int getY(int position) {return position/size;}
public void paint(Graphics g)
{
g.setColor(Color.black);
for(int i=0;i<size;i++)
for(int o=0;o<size;o++)
{
if(matrix[i+o*size]==1)
{
g.fillRect(i*30,o*30,30,30);
}
}
g.setColor(Color.red);
g.fillRect(getX(start)*30,getY(start)*30,30,30);
g.setColor(Color.green);
g.fillRect(getX(ziel)*30,getY(ziel)*30,30,30);
for(int i=0;i<offen.size();i++) // zeige offene Liste
{
g.setColor(Color.blue);
Quadrat q=((Quadrat)offen.elementAt(i));
g.fillRect(getX(q.position)*30,getY(q.position)*30,30,30);
g.setColor(Color.black);
g.drawString("Q"+q.G,getX(q.position)*30,getY(q.position)*30+15);
g.drawString("F"+q.F,getX(q.position)*30,getY(q.position)*30+30);
}
if(aktuell!=null)
{
g.setColor(Color.yellow);
g.fillRect(getX(aktuell.position)*30,getY(aktuell.position)*30,30,30);
}
}
public void zeigePfad(Quadrat aktuell)
{
int lauf=0;
do
{
Graphics g=frame.getGraphics();
g.setColor(Color.red);
g.fillRect(getX(aktuell.position)*30,getY(aktuell.position)*30,30,30);
g.drawString(""+lauf++,getX(aktuell.position)*30,getY(aktuell.position)*30);
aktuell=aktuell.parent;
}while(aktuell!=null);
}
public Quadrat berechnePfad(int start, int ziel)
{
offen.addElement(new Quadrat(start,null));
do
{
if(!offen.isEmpty())
{
aktuell=(Quadrat)offen.firstElement(); // Suche in der offenen Liste nach dem Quadrat mit dem < F-Wert.
verschiebe(aktuell);
check(1,0,10); // Quadrate rechts
check(-1,0,10);
check(0,1,10);
check(0,-1,10);
check(1,1,14);
check(1,-1,14);
check(-1,-1,14);
check(-1,1,14);
}
else
return null;
}
while(aktuell.position!=ziel);
return aktuell;
}
public void verschiebe(Quadrat quadrat) // Verschiebe Quadrat aus offener in geschlossene Liste
{
geschlossen.addElement(quadrat);
offen.removeElement(quadrat);
}
public void check(int x, int y, int kosten)
{
int nummer=aktuell.position+x+y*size;
int px=getX(aktuell.position),py=getY(aktuell.position);
if((px+x)>0 && (px+x)<size && (py+y)>0 && (py+y)<size)
if(matrix[nummer]==0) // begehbar
if(inListe(geschlossen,nummer)==null) // noch nicht in geschlossener Liste
{
Quadrat temp=inListe(offen,nummer);
if(temp==null)
{
Quadrat quadrat=new Quadrat(nummer,aktuell);
quadrat.G=aktuell.G+kosten;
quadrat.H=(Math.abs(getX(ziel)-getX(nummer))+Math.abs(getY(ziel)-getY(nummer)))*10;
quadrat.F=quadrat.G+quadrat.H;
// Quadrat sortiert in die offenen Liste eintragen
einfuegen(quadrat);
}else
{
if((aktuell.G+kosten)<temp.parent.G)
{
temp.parent=aktuell;
temp.G=aktuell.G+kosten;
temp.F=temp.G+temp.H;
}
}
}
}
public boolean einfuegen(Quadrat quadrat)
{
if(offen.isEmpty())
{
offen.addElement(quadrat);
}else
{
int i=0;
do
{
if(((Quadrat)offen.elementAt(i)).F>=quadrat.F)
{
offen.insertElementAt(quadrat,i);
return true;
}
i++;
}while(i<offen.size());
offen.addElement(quadrat);
}
return true;
}
public Quadrat inListe(Vector liste,int nummer)
{
if(liste.size()>0)
for(int i=0;i<liste.size();i++)
if(((Quadrat)liste.elementAt(i)).position==nummer)
return (Quadrat)liste.elementAt(i);
return null;
}
public class Quadrat
{
int position;
Quadrat parent;
int F=0,H,G=0;
public Quadrat(int position,Quadrat parent)
{
this.position=position;
this.parent=parent;
}
}
}
Das erste Problem ist ich krieg die Aplication nicht vernünftig beendet, weil ich nicht weiss wo die Threads gesetzt und beendet werden müssen.
Das zweite Problem ist, dass die Darstellung nicht richtig funktioniert: manchmal ja, manchmal halb, manchmal fast garnicht.
Ich hoffe ihr könnt mir weiterhelfen!
Danke schon mal im Voraus!
Mfg Deniz Engin a.k.a Halo_Player