# Programmvorschläge für Schulprojekt



## Disorder257 (30. Mrz 2011)

Hallo liebe Java-Gemeinde,

ich bin zurzeit auf der Suche nach einem Programm das ich für die Abschlussprüfung des Fachabiturs schreiben kann. Da ich derzeitig noch absolut unentschlossen bin, welche Art von Programm es werden soll, bitte ich euch eure Ideen zu schreiben was ich realisieren könnte.

Ich den vorherigen Jahren gab es eine große Zahl von kleinen Spielen wie zum Beispiel 4 Gewinnt, einen einarmigen Banditen, Black Jack oder auch Programme zum Berechnen von Funktionen 4ten Grades inklusive zeichnen.

Als Entwicklungswerkzeug würde ich JOE oder den Java Editor benutzen wollen.

Wie sieht es aus, habt Ihr eventuell eine Idee die im Rahmen meiner Fähigkeiten liegen könnte?(Ich programmiere seit etwa 2 Jahren in der Schule.)

Mit freundlichen Grüßen

Disorder257


----------



## Gast2 (30. Mrz 2011)

Spiele sind doch immer sehr beliebt.

Warum nicht z.B. ein Roboter durch einen Weg durch ein Labyrinth suchen lassen? Da kannst du auch gleich dich mit sowas wie verschiedenen Suchstrategien beschäftigen und visualisieren wie sich die Wegfindung ändert wenn du statt einem A* Algorithmus einen anderen wählst.

Wenn du vorhast Informatik oder so zu studieren wirst du dich freuen damit schon Bekanntschaft gemacht zu haben.

Aber als gut gemeinter Tip:
Ich würde dir als IDE sehr Eclipse oder Netbeans ans Herz legen. Das macht dir das Leben wirklich einfacher....


----------



## Disorder257 (30. Mrz 2011)

Hi,

der Vorschlag ist gar nicht schlecht.
Hilf mir vllt. ein wenig auf die Sprünge was ist ein A* Algorithmus?
Ich hab schon einmal versucht mich mit Eclipse auseinander zu setzen, was aber nicht unbedingt von Erfolg gekrönt war. Ich bin es gewohnt in der Schule alles zu Fuß zu programmieren.


----------



## Eldorado (30. Mrz 2011)

A*-Algorithmus ? Wikipedia !?


----------



## Gast2 (30. Mrz 2011)

A* ist ein sehr bekannter Such-Algorithmus. Er bestimmt in einen Graphen den kürzesten Weg von einem Konten zu einem beliebigen anderen. Wird oft benutzt um halt Wegfindungsprobleme zu lösen und immer sehr beliebt in den ersten Semestern Informatik...

A*-Algorithmus ? Wikipedia

Eclipse ist sehr intuitiv zu bedienen und wenn du nicht klar kommst frag einfach hier nach, da wird dir mit Sicherheit geholfen. Aber größere Projecte zu Fuß in JOE oder in dem murkeligen Java Editor zu programmieren ist mutig. Da musst du schon eine gewisse Leidensbereitschaft haben.


----------



## Disorder257 (30. Mrz 2011)

Okay, ich habe mir das mal angeschaut.
Der Algorithmus sucht mir also die kürzeste Strecke zum einem unbekannten Ziel.
Wege die nicht Funktionieren werden auf eine Liste geschrieben und somit für den weiteren Verlauf ausgeschlossen.

Also muss ich nur einen Startpunkt definieren?

Ich werde mich Zuhause noch einmal mit Eclipse usw. beschäftigen um mir nicht unnötig das Leben schwer zu machen.


----------



## Gast2 (30. Mrz 2011)

Ganz so einfach ist es nicht 

Du musst schon einen Start und einen Zielpunkt definieren und deine Welt als Graph darstellen. Wenn du das hast kannst du ganz stumpf den Algorithmus implementieren.

Ein gutes Tutorial:
Tile Map Path Finding with A Star (A*) | Coke And Code - Java Games and Games Development

Weitere Beispiel Implementierung: /trunk/java/ - a-star - Raster based a* search - Google Project Hosting


----------



## Disorder257 (30. Mrz 2011)

Ich hatte mir das so vorgestellt:

Als erstes wollte ich eine Zeichenfläche erstellen und auf dieser Zeichenfläche mit drawString quasi das Labyrinth erstellen, wobei ich mit den String keine Strecken im eigentlichen Sinn erstelle sonder nur Punkte die hintereinander gehängt sind und somit einen Strich ergeben.
Damit habe ich dann ja die Punkte auf meinem Koordinatenkreuz die nicht durchdrungen werden können, oder sehe ich das falsch?

Und dann könne ich ja den Algorithmus benutzen.

Soweit die Theorie.

Jetzt konfrontiere mich mit den harten Fakten


----------



## muckelzwerg (30. Mrz 2011)

Du kannst Dir mal überlegen, ob Du das Suchproblem ganz allgemein programmierst und den A* dann als einen von verschiedenen Suchalgorithmen verwendest.
Wenn Du bei Schnittstellen und Softwaretechnik ein bisschen aufpasst, kannst Du ziemlich flott ein Programm schreiben, dass die gleiche Suchaufgabe mit verschiedenen (auswählbaren) Suchverfahren löst. Im wesentlichen unterscheiden die sich alle nur in der Auswahl des nächsten zu versuchenden Knotens/Schrittes. Tiefensuche nimmt immer den "nächsten ersten", Breitensuche immer alle nächsten, dann alle übernächsten ..., Greedy wählt immer den direkt besten und der gute A* dann endlich den geschätzt Besten.

Die nächste Abstraktion, wäre das Aswechseln von Heuristiken, also den Schätzfunktionen. Die hängen dann schon etwas konkreter an der jeweilgen Aufgabe dran. 

Noch eine Abstraktion mehr und Du kannst sogar das konkrete Problem abtrennen. Dann hättest Du ein Programm, das verschiedene Suchverfahren auf z.B. Pfadsuche, X-Damen Problem, 8-Puzzle, Sudoku, ... anwendet.


----------



## Dow Jones (30. Mrz 2011)

Hallo Disorder,

gibt es irgendwelche Bedingungen die dein Projekt erfüllen muss um als Abschlussarbeit anerkannt zu werden? Alternativ zum A* Algo lässt sich sicherlich in jedem Bereich etwas passendes finden, z.B. ein Packer basierend auf der Burrows-Wheeler-Transformation oder ein Image-Resizer basierend auf Seam Carving. Ist beides nicht so trocken, (relativ) einfach zu implementieren, es macht Eindruck, es gibt dabei auch einen theoretischen Anteil den man - falls gefordert - behandeln kann, man kann die Projekte beliebig weit ausbauen falls sie den Ansprüchen nicht genügen, und man kann sie später auch selber verwenden.


----------



## Gast2 (30. Mrz 2011)

Disorder257 hat gesagt.:


> Ich hatte mir das so vorgestellt:
> 
> Als erstes wollte ich eine Zeichenfläche erstellen und auf dieser Zeichenfläche mit drawString quasi das Labyrinth erstellen, wobei ich mit den String keine Strecken im eigentlichen Sinn erstelle sonder nur Punkte die hintereinander gehängt sind und somit einen Strich ergeben.
> Damit habe ich dann ja die Punkte auf meinem Koordinatenkreuz die nicht durchdrungen werden können, oder sehe ich das falsch?



Falscher Ansatz, nicht von der Visualisierung starten. z.B.:


```
int[][] matrix = new int[][]{
			{99,99,99,99,99,99,99, 1,99},
			{99,99,99,99,99,99,99, 1,99},
			{99,99,99,99,99,99,99, 1,99},
			{99,99,99, 1, 1, 1, 1, 1,99},
			{99,99,99, 1,99,99, 3,99,99},
			{99,99,99, 1,99,99, 5,99,99},
			{99,99,99, 1, 9, 9, 3,99,99},
			{99,99,99, 1, 1, 1, 1,99,99},
			{99,99,99,99,99,99, 1,99,99}
		};
		
		findway(matrix[0][7], matrix[8][6]);
```

dabei steht die Zahl in jeder "Zelle" wie teuer es ist die "Zelle" zu betreten. Soll der Robotor den Weg gehen:

```
0,7 -> 1,7 -> 2,7 -> 3,7 -> 3,6 -> 3,5 -> 3,4 -> 3,3 -> 4,3 -> 5,3 -> 6,3 -> 7,3 -> 7,4 -> 7,5 -> 7,6 -> 8,6
oder
0,7 -> 1,7 -> 2,7 -> 3,7 -> 3,6 -> 4,6 -> 5,6 -> 6,6 -> 7,6 -> 8,6
```

Wie du so ein Graph/Grid/Matrix dann visualisierst ist zweitrangig.


----------



## Disorder257 (30. Mrz 2011)

> Du kannst Dir mal überlegen, ob Du das Suchproblem ganz allgemein programmierst und den A* dann als einen von verschiedenen Suchalgorithmen verwendest.
> Wenn Du bei Schnittstellen und Softwaretechnik ein bisschen aufpasst, kannst Du ziemlich flott ein Programm schreiben, dass die gleiche Suchaufgabe mit verschiedenen (auswählbaren) Suchverfahren löst. Im wesentlichen unterscheiden die sich alle nur in der Auswahl des nächsten zu versuchenden Knotens/Schrittes. Tiefensuche nimmt immer den "nächsten ersten", Breitensuche immer alle nächsten, dann alle übernächsten ..., Greedy wählt immer den direkt besten und der gute A* dann endlich den geschätzt Besten.
> 
> Die nächste Abstraktion, wäre das Aswechseln von Heuristiken, also den Schätzfunktionen. Die hängen dann schon etwas konkreter an der jeweilgen Aufgabe dran.
> ...



Also ich glaube bei sowas würde ich dann an meine Grenzen stoßen.



> Hallo Disorder,
> 
> gibt es irgendwelche Bedingungen die dein Projekt erfüllen muss um als Abschlussarbeit anerkannt zu werden? Alternativ zum A* Algo lässt sich sicherlich in jedem Bereich etwas passendes finden, z.B. ein Packer basierend auf der Burrows-Wheeler-Transformation oder ein Image-Resizer basierend auf Seam Carving. Ist beides nicht so trocken, (relativ) einfach zu implementieren, es macht Eindruck, es gibt dabei auch einen theoretischen Anteil den man - falls gefordert - behandeln kann, man kann die Projekte beliebig weit ausbauen falls sie den Ansprüchen nicht genügen, und man kann sie später auch selber verwenden.



Die Projekte sind vom Inhalt her nicht begrenzt, es ist sogar erwünscht sich mit etwas auseinander zu setzen was nicht Inhalt des Programmierunterrichts war. Insofern habe ich da freie Hand.
Ich wäre natürlich für etwas was Eindruck macht, aber mein Lehrer ist ehemaliger Programmierer von IBM und der Hinsicht lässt der sich von optisch "hübschen" Programmen eher weniger beeindrucken.
Ich sollte allerdings darauf achten das es etwas ist was nicht 4000 mal im Internet vorhanden ist, da sehr gern recherchiert wird 



@fassy

Stellen die Einsen in der Matrix also den möglichen Weg dar und es wird immer getestet wie der Wert in der Zellen ist? Die Tür öffnet sich wenn eine Zelle einen bestimmten Wert hat oder wie hab ich das zu verstehen?


----------



## Gast2 (30. Mrz 2011)

Nein, die Zahlen in der Matrix sagen wie "teuer" es ist die Zelle zu überqueren.

Stell dir ein Autorennen vor. Zellen mit 1 sind z.B. die Strasse, 3 = Wiese, 9 = Schotter, 99 Wasser.

Am schnellsten/billigsten geht es auf der Strasse, alles klar?


----------



## Disorder257 (30. Mrz 2011)

Also ist es im Prinzip möglich über Schotter zu fahren aber es ist nicht der kürzeste Weg und würde somit nicht in Frage kommen. Okay :bae:

Gut das ihr alle so eine Geduld habt


----------



## diggaa1984 (30. Mrz 2011)

der weg wäre schon kürzer (siehe matrix) aber er ist im kontext des autorennens, nicht der schnellste .. bsp schikane mit sandumrandung ^^ .. kannt gerne 30m weg sparen aber im sand schiebste mehr zeitverlust als beim regulären abfahren der schikane aufm asphalt


----------



## Disorder257 (30. Mrz 2011)

Okay ich denke ich habe es prinzipiell verstanden.
Wie kann ich denn jetzt vorgehen? Sollte ich als erstes eine Matrix erstellen und damit quasi das Spielfeld vordefinieren?


----------



## diggaa1984 (31. Mrz 2011)

ein durchdachter plan was du nun genau umsetzen willst wäre das erste 
ein spielfeld als matrix darzustellen, mag wohl die einfachste art sein am anfang. die frage ist wie gut du damit später arbeiten kannst


----------



## Disorder257 (31. Mrz 2011)

Gut ich werde mich am Freitag mal ein wenig mit meinem Lehrer zusammensetzten und da mal schauen wie ich da genau vorgehen kann.

Erstmal ein dickes Danke für die Denkanstöße.


----------



## Disorder257 (11. Apr 2011)

Hallo zusammen,

ich habe mich nach Legitimation meines Lehrers mal an das Projekt gesetzt und schon einmal grob alles umgesetzt, was Ihr mir hier als Ansatz vorgeschlagen habt.

Wie sollte ich jetzt weiter vorgehen?
Was sollte noch gemacht werden bevor die Implementierung des Algorithmus vorgenommen wird?

Hier einmal der Quelltext:

```
import java.awt.*;
import java.awt.event.*;


public class roboter extends Frame {
  // Anfang Variablen
  int [][] matrix = new int[][]{
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99, 1, 1, 1, 1, 1, 1, 1,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1, 1, 1, 1,99,99},
  {99,99,99, 99,99,99,1,99,99},
  };
  // Ende Variablen

  public roboter(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    
    
    int frameWidth = 600;
    int frameHeight = 600;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);

    // Anfang Komponenten

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }



  public static void main(String[] args) {
    new roboter("Roboter");
    
    


    
  }
     public void paint(Graphics g)
   {
      g.setColor(Color.white);
      g.drawRect(20,40,495,495);
      for( int y = 40; y <= 500; y +=55 )
      {
           for( int x = 20; x <= 500; x +=55 )
           {
           if(matrix[(x-20)/55][(y-40)/55] == 1)
           {
             g.setColor(Color.gray);
           }
           else if(matrix[(x-20)/55][(y-40)/55] == 99)
           {
             g.setColor(new Color(0,150,0));
           }
           g.fillRect(x,y,55,55);
           }

      }


   }//Ende Methode paint
   

   
}
```

Und so sieht es aus:


----------



## Gast2 (11. Apr 2011)

Zuersteinmal solltest du deine Klasse 
	
	
	
	





```
roboter
```
 in 
	
	
	
	





```
Roboter
```
, bzw. noch besser 
	
	
	
	





```
RoboterFrame
```
umbennen 
Danach solltest du ein gescheites Datenmodel erstellen. Das kann z.b. aus zwei Klassen 
	
	
	
	





```
Roboter
```
und 
	
	
	
	





```
Spielfeld
```
 bestehen.
Damit hättest du dann schonmal deine Daten sauber vom View getrennt.


----------



## Ark (11. Apr 2011)

Disorder257 hat gesagt.:


> Wie sollte ich jetzt weiter vorgehen?
> Was sollte noch gemacht werden bevor die Implementierung des Algorithmus vorgenommen wird?



GUI von Logik trennen. (Mist, EikeB war hier schneller. ^^) Das, was fassy sagte (nämlich gedanklich nicht mit der Visualisierung zu beginnen, sondern die Logik zu verstehen), ist auch ein guter Punkt, der bei jeder Entwicklung von Software beachtet werden sollte. Deine A*-Implementierung sollte auch dann funktionieren können, wenn nichts am Bildschirm angezeigt wird. Damit es gar nicht erst zu einer solchen (äußerst unerwünschten) Abhängigkeit kommt, sollte man das Darstellende vom Verarbeitenden trennen. In deinem Fall bedeutet das: Benenne deine bisherige Klasse roboter um in Roboteranzeige (oder so ähnlich), denn es ist bestenfalls eine Anzeige dessen, was der Roboter tut. Erzeuge dann eine neue Klasse Roboter, die NICHT von Frame erbt, und verschiebe die Matrix aus der alten Klasse in diese neue Klasse. Das ist zwar noch immer ziemlich weit entfernt von sauberem Entwurf, aber es ist WESENTLICH besser als der bisherige Code.
Magic numbers durch benannte Konstanten ersetzen. Was bedeutet diese 55 in paint(Graphics), Zeile 61? Was bedeutet die 55 in Zeile 63? Bedeuten beide Zahlen das gleiche? Wenn ja: gib der 55 einen Namen! Wenn es sich also um die Seitenlänge eines Kästchens in der Anzeige handelt, dann mach eine [c]private final int SEITENLÄNGE = 55;[/c]. Damit ist erstens klar, was gemeint ist (hilft unheimlich beim Lesen!), und zweitens eine Änderung VIEL leichter (wenn man z.B. feststellt, dass 55 doch zu groß ist und 30 gereicht hätte). Genauso sollten auch die Zahlen in deiner Matrix Namen bekommen (von wegen WASSER, SCHOTTER etc.).
Es gibt noch viele andere Mängel, aber die sind, im Gegensatz zu den oben genannten, für dich (als Anfänger) noch nicht so relevant. 

Viel Spaß beim Weiterbasteln.

Ark

PS@Disorder257: Du bist ein echter Segen für dieses Forum. Endlich jemand, der, obwohl er neu hier ist, was tut und nicht nur haben will - und zusammenhängende Fragen stellen kann. :toll: (Das soll jetzt nur meinen persönlichen Eindruck widerspiegeln. In letzter Zeit hatte ich das Gefühl, dass das Forum zuhauf von zwitschernden help vampires heimgesucht würde. Vielleicht habe ich aber auch immer nur in die falschen Threads geguckt …)


----------



## Disorder257 (11. Apr 2011)

Soooo, dann habe ich mal versucht deine Tipps zu beherzigen. Problem ist nur wie kann ich die Matrix in die Roboter.java auslagern, die im Ordner Komponenten ist?

Der Quelltext sieht im Moment so aus:


```
import java.awt.*;
import java.awt.event.*;
//import Komponenten.Roboter;


public class roboterFrame extends Frame {
  // Anfang Variablen
private final int Kantenlaenge =55;
private final int Grass =99;
private final int Straße =1;

  int [][] matrix = new int[][]{
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass},
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass},
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass},
  {Grass ,Straße,Straße,Straße,Straße,Straße,Straße,Straße,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Grass ,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Grass ,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Straße,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Straße,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Straße,Straße,Straße,Grass ,Grass},
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass ,Grass},
  };
  
  
  /*
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99, 1, 1, 1, 1, 1, 1, 1,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1, 1, 1, 1,99,99},
  {99,99,99, 99,99,99,1,99,99},
  */


  public roboterFrame (String title) {
    // Frame-Initialisierung
    super("Roboter");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    
    
    int frameWidth = 600;
    int frameHeight = 600;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);

    // Anfang Komponenten

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }



  public static void main(String[] args) {
    new roboterFrame("Roboter");
    
    


    
  }
     public void paint(Graphics g)
   {
      g.setColor(Color.white);
      g.drawRect(20,40,495,495);
      for( int y = 40; y <= 500; y +=Kantenlaenge)
      {
           for( int x = 20; x <= 500; x +=Kantenlaenge )
           {
           if(matrix[(x-20)/Kantenlaenge][(y-40)/Kantenlaenge] == Straße)
           {
             g.setColor(Color.gray);
           }
           else if(matrix[(x-20)/Kantenlaenge][(y-40)/Kantenlaenge] == Grass)
           {
             g.setColor(new Color(0,150,0));
           }
           g.fillRect(x,y,Kantenlaenge,Kantenlaenge);
           }

      }


   }//Ende Methode paint
   

   
}
```

Und die Klasse Roboter die ausgelagert werden soll so:


```
import java.awt.*;
import java.awt.event.*;


public class Roboter
{
  // Variablen
  int [][] matrix = new int[][]{
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99, 1, 1, 1, 1, 1, 1, 1,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1, 1, 1, 1,99,99},
  {99,99,99, 99,99,99,1,99,99},
  };
}
```


Es muss ja die Matrix zurückgegeben werden.
Muss ich dazu Return oder so etwas ähnlich einfügen?


----------



## Disorder257 (12. Apr 2011)

Habs doch hinbekommen

Nach ausgiebigem überlegen habe ich mir gedacht, dass ich das Labyrinth Problem auch mit der Linke-Hand-Regel lösen kann. Wenn man durch ein Labyrinth läuft und die linke Hand immer an der linken Mauer ist, findet man immer heraus. 

Problem: Das ist nicht immer der kürzeste Weg

Ich hatte daran gedacht beide Methoden zu kombinieren, also zwischendurch auch noch abzufragen welche Wertigkeit das Feld hat. So kann ich auch noch den kürzesten weg finden.

Was haltet ihr davon?

Habe ich einen Denkfehler?


----------



## muckelzwerg (12. Apr 2011)

Ist nicht wirklich "sauber". 
Du solltest eigentlich recht leicht den A* unabhängig entwickeln können. Wir haben das damals mit den Javaklasen für Bäume (Treenodes ableiten) gemacht.
Wurzel ist die Startsituation. Also das Labyrinth mit dem "Hamster" in seinem Startfeld. 
Dann ermittelst Du die möglichen Nachfolgesituationen. Das sind alle Bretter mit dem Hamster ein Feld weiter.
Die werden bewertet anhand der Funktionen des A*. Der optimale Nachfolger wird ausgewählt und im nächsten Schritt geprüft. 
Im Wesentlichen hast Du eine Queue, in der Du die Knoten speicherst, die als nächstes betrachtet werden sollen.
Dann brauchst Du ein bisschen "Drumrum" für den Test, ob Du am Ziel bist etc.
Die Nachfolger der Knoten holst Du direkt aus den überschriebenen Funktionen vom Treenode o.Ä. 
Wenn man das sauber durchzieht, kommt da auch sehr schönes Java bei raus.


----------



## Disorder257 (12. Apr 2011)

Das ist ja alles schön und gut, nur habe ich leider niemanden der mir den A* erklärt. Ich habe gerade irgendwie null Ahnung was ich machen soll


----------



## muckelzwerg (12. Apr 2011)

Welche Erklärungen hast Du Dir denn angesehen und was verstehst Du daran nicht?


----------



## Disorder257 (13. Apr 2011)

Ich hab mir den Wikipedia Eintrag zum A*Algortithmus angesehen und dieses Beispiel-Programm von einem gewissen Sebastian Kleinau Sebastian Kleinau | Document Details | A-Star Algorithmus

Der Wikipedia-Eintrag war von der Programmierung her einfach unverständlich zumal alles vermutlich in Delphi? programmiert ist.

Ich hab einfach keinen Ansatz wo ich anfangen könnte. Ich denke ein wenig pseudo-Text würde schon helfen

Aktueller Stand:
	
	
	
	





```
import java.awt.*;
import java.awt.event.*;



public class roboterFrame extends Frame {
  // Anfang Variablen

public int Kantenlaenge =55;
public int Grass =99;
public int Straße =1;
int x=20,y=40;


  int [][] matrix = new int[][]{
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass},
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass},
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass},
  {Grass ,Straße,Straße,Straße,Straße,Straße,Straße,Straße,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Grass ,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Grass ,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Straße,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Grass ,Grass ,Straße,Grass ,Grass},
  {Grass ,Grass ,Grass ,Straße,Straße,Straße,Straße,Grass ,Grass},
  {Grass ,Grass ,Grass ,Grass ,Grass ,Grass ,Straße,Grass ,Grass},
  };
  
  
  /*
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99,99,99,99,99,99,99, 1,99},
  {99, 1, 1, 1, 1, 1, 1, 1,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99,99,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1,99,99, 1,99,99},
  {99,99,99, 1, 1, 1, 1,99,99},
  {99,99,99, 99,99,99,1,99,99},
  */


  public roboterFrame (String title) {
    // Frame-Initialisierung
    super("Roboter");
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { System.exit(0); }
    });
    
    
    int frameWidth = 600;
    int frameHeight = 600;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2 ;
    setLocation(x, y);

    // Anfang Komponenten

    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }



  public static void main(String[] args) {
    new roboterFrame("roboterFrame");
    
    


    
  }
     public void paint(Graphics g)
   {
      g.setColor(Color.white);
      g.drawRect(20,40,495,495);
      for( int y = 40; y <= 500; y +=Kantenlaenge){
           for( int x = 20; x <= 500; x +=Kantenlaenge ){
                if(matrix[(x-20)/Kantenlaenge][(y-40)/Kantenlaenge] == Straße)
                {
                g.setColor(Color.gray);
                }
                else if(matrix[(x-20)/Kantenlaenge][(y-40)/Kantenlaenge] == Grass)
                {
                g.setColor(new Color(0,150,0));
                }
                g.fillRect(x,y,Kantenlaenge,Kantenlaenge);
           }

      }
      //Startpunkt
      g.setColor(Color.BLUE);
      g.fillRect(x, y+7*Kantenlaenge, Kantenlaenge, Kantenlaenge);
      //Endpunkt
      g.setColor(Color.RED);
      g.fillRect(x+6*Kantenlaenge, y+6*Kantenlaenge, Kantenlaenge, Kantenlaenge);
      Image img;
      img = getToolkit().getImage("super_mario2.gif");
      g.drawImage(img,40,40,this);
      



   }//Ende Methode paint



   
}
```


----------

