# Turm von Hanoi



## F4ckHanoi (27. Mai 2015)

Halli hallo,

also ich hatte die Aufgabe die Türme von Hanoi in ein GUI umzusetzen. Ich habe die Türme und die Scheiben per Rectangle erstellt. Nun fehlt mir die Animation. Wenn ich eine Scheibe in eine andere Position setzen möchte, kann ich die alte Scheibe, die in einem Array gespeichert ist nicht löschen. Ich weiß, dass ich jedesmal eine neue Grafik zeichnen muss. Ich kann es aber nicht umsetzen und bin halt zurzeit total verwirrt.

Ich würde mich freuen wenn Ihr mir helfen würdet.

Hier ist der Code:


```
import java.awt.*;

import javax.swing.*;


public class TuermeRunnable extends JPanel implements Runnable{

    public Thread thread = new Thread(this);
    public static int turmLength = 6;
    public Rectangle [] tuerme = new Rectangle[turmLength];
    public static int turmSpace = 41;
    public static int turmWidth = 40;
    public static int turmX = 20;

    TuermeRunnable(){
        thread.start();
    }
    
    
    public void define(int x, int y, int w){
        for(int i = 0; i < tuerme.length; i++){
            tuerme[i] = new Rectangle(x+((turmX)*i), y-((turmSpace)*i), w-((turmWidth)*i), 40);
        }
    }


    public void paintComponent(Graphics g){
        define(85, 700, 340);
        
        //Linien
        /* ******************************* */
        g.setColor(new Color(255, 100, 20));
        g.fillRect(250, 220, 15, 500);
        g.setColor(new Color(0, 0, 0));
        
        g.setColor(new Color(255, 100, 20));
        g.fillRect(855, 220, 15, 500);
        g.setColor(new Color(0, 0, 0));
        
        g.setColor(new Color(255, 100, 20));
        g.fillRect(1500, 220, 15, 500);
        g.setColor(new Color(0, 0, 0));
        /* ******************************* */
        
        //Scheiben
            for(int i = 0; i < tuerme.length; i++){
                    g.setColor(new Color(70, 70, 70));
                    g.fillRect(tuerme[i].x, tuerme[i].y, tuerme[i].width, tuerme[i].height);
                    g.setColor(new Color(0, 0, 0));
            }
        }
    
    
    public int moveFrame = 1000, moveSpeed = 0;
    public void bewege(char start, char ablage, char ziel, int scheiben)
    {
     if(moveSpeed >= moveFrame){
        moveFrame = 0;
        if(scheiben == 1){
            //System.out.println("Lege die oberste Scheibe von " + "Turm " + a + " auf Turm " + c + ".");
            
            if(Character.toString(ziel).equals("a")){
                    tuerme[scheiben+4].setLocation(1435, 700);
            }
            
            if(Character.toString(ziel).equals("b")){
                tuerme[scheiben+3].setLocation(768, 700);
            }
        }else{
               bewege(start, ablage, ziel, scheiben-1);
               bewege(start, ziel, ablage, 1);
               bewege(ziel, start, ablage, scheiben-1);
        }
     }else{
         moveSpeed += 1;
     }
}
    
    public void run() {
        while(true){
            repaint();
            try{
                Thread.sleep(1);
                bewege('a', 'b', 'c', turmLength);
            }catch(Exception e){}
        }
    }
    
    

}
```


----------



## VfL_Freak (27. Mai 2015)

Moin,

schon mal die Suche bemüht ??
http://www.java-forum.org/search.php?searchid=268743

Gruß Klaus


----------



## F4ckHanoi (27. Mai 2015)

Ihre Suchanfrage erzielte keine Treffer. Bitte versuchen Sie es mit anderen Suchbegriffen.

GG hast ja voll geholfen ..


----------



## VfL_Freak (27. Mai 2015)

Moin,

hää?? Ich sehe hier über den Link 24 Ergebnisse .....
Hast Du denn mal "Turm von Hanoi" selbst in die Suchmaske eingegeben??

Gruß Klaus


----------



## F4ckHanoi (27. Mai 2015)

Nein habe ich nicht und ich bekomme keine Treffer.


----------



## Joose (27. Mai 2015)

@VfL_Freak: Ich bekomme auch keine Suchergebnisse auf deinen Link (wahrscheinlich ist die Suche User gebunden?)

@F4ckHanoi: Benutze die Forumsuche wie Vfl_Freak schon gesagt hat, da finden sich sehr viele Threads welche sich mit diesem Thema beschäftigen.


----------



## Maggot (27. Mai 2015)

VfL_Freak hat gesagt.:


> Moin,
> 
> schon mal die Suche bemüht ??
> http://www.java-forum.org/search.php?searchid=268743
> ...



Hallo.

Wenn ich auf den Link klicke sehe ich auch keine Suchergebnisse. Ist wohl session bedingt. 

Und @F4ckHanoi: Gib doch mal in der Suche "Turm von Hanoi" ein. Da bekommst du dann eine Liste mit Suchergebnissen. Unter anderem einen Thread mit dem Namen Türme von Hanoi in "Java ist auch eine Insel" (http://www.java-forum.org/java-basi...me-hanoi-java-insel.html?highlight=Turm+Hanoi)

Dort kann dir sicher weitergeholfen werden.


----------



## VfL_Freak (27. Mai 2015)

Moinsen,



Joose hat gesagt.:


> @VfL_Freak: Ich bekomme auch keine Suchergebnisse auf deinen Link (wahrscheinlich ist die Suche User gebunden?)


ok, das wäre natürlich eine Erklärung  

Gruß Klaus


----------



## F4ckHanoi (28. Mai 2015)

Trotzdem hilft es mir nicht!

Ihr habt mich glaube ich auch falsch verstanden. Ich verstehe die Logik prinzipiell schon, kann es aber nicht genau umsetzen. Ich würde mich freuen wenn mir jemand weiter helfen könnte, am besten einer der sich mit Rectangle auskennt. Ich weiß sogar was ich machen muss, kann es aber irgendwie nicht umsetzen (code).

Ich positioniere die Spalten wo anders hin und die alten sollen gelöscht werden und jedesmal müsste es neu eingezeichnet werden. Wäre nett wenn Jemand mir weiter helfen könnte!

MfG


----------



## Joose (28. Mai 2015)

F4ckHanoi hat gesagt.:


> Ich verstehe die Logik prinzipiell schon, kann es aber nicht genau umsetzen.



Also die Türme von Hanoi als Konsolenprogramm funktioniert bei dir?



F4ckHanoi hat gesagt.:


> Ich positioniere die Spalten wo anders hin und die alten sollen gelöscht werden und jedesmal müsste es neu eingezeichnet werden.



Was für Spalten meinst du? Die Türme?
Theoretisch hast du für jede Scheibe ein Objekt im Code, die Position jeder Scheibe wird angepasst und das ganze neu gezeichnet (altes wird nicht gelöscht, es wird einfach nur neu gezeichnet )

Ich würde hier einfach mal ganz einfach anfangen und einfach nur ein Rectangle zeichnen lassen und diese per Code alle paar Sekunden etwas zu bewegen. Wenn das mal klappt kannst du probieren diese Lösung auf "Türme von Hanoi" umzulegen.


----------



## F4ckHanoi (7. Jun 2015)

Ich habe jetzt vieles versucht und habs immer noch nicht hinbekommen. Ich weiss das es immer neu gezeichnet wird und genau da liegt mein Problem. Ich müsste es so programmieren: wenn ein Turm positioniert wird, (angenommen das ganz oberste), dann darf es nicht wie vorher zeichnen. Nun muss eine neue Zeichnung folgen und die position muss dabei gleich bleiben. Bei mir sieht es so aus: Die oberste Scheibe wird positioniert aber da es immer wieder gezeichnet wird, sieht man die oberste Scheibe nun Zweimal. Einmal wo es positioniert ist und einmal wo es immer war.


----------



## Maggot (8. Jun 2015)

F4ckHanoi hat gesagt.:


> Ich habe jetzt vieles versucht und habs immer noch nicht hinbekommen. Ich weiss das es immer neu gezeichnet wird und genau da liegt mein Problem. Ich müsste es so programmieren: wenn ein Turm positioniert wird, (angenommen das ganz oberste), dann darf es nicht wie vorher zeichnen. Nun muss eine neue Zeichnung folgen und die position muss dabei gleich bleiben. Bei mir sieht es so aus: Die oberste Scheibe wird positioniert aber da es immer wieder gezeichnet wird, sieht man die oberste Scheibe nun Zweimal. Einmal wo es positioniert ist und einmal wo es immer war.



Poste doch deinen aktuellen Code, dann können wir dir besser helfen.


----------



## F4ckHanoi (10. Jun 2015)

Siehe doch ganz oben, da ist mein Code.
Hab nichts geändert..

aber hier nochmal:

GUI:


```
import java.awt.*;

import javax.swing.*;


public class TuermeGUI extends JFrame{

    public static String title = "Türme";
    public static Dimension size = new Dimension(1800, 800);
    TuermeRunnable turm;
    

    public TuermeGUI(){
        
        setTitle(title);
        setSize(size);
        //setResizable(false);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        init();
    }
    
    
    public void init(){
        setLayout(new GridLayout(1, 1, 0, 0));
        turm = new TuermeRunnable();
        add(turm);
        setVisible(true);
    }
    
    
    public static void main(String args[]){
        TuermeGUI frame = new TuermeGUI();
    }
}
```


Applikation: 


```
import java.awt.*;

import javax.swing.*;


public class TuermeRunnable extends JPanel implements Runnable{

    public Thread thread = new Thread(this);
    public static int turmLength = 6;
    public Rectangle [] tuerme = new Rectangle[turmLength];
    public static int turmSpace = 41;
    public static int turmWidth = 40;
    public static int turmX = 20;

    TuermeRunnable(){
        thread.start();
    }
    
    
    public void define(int x, int y, int w){
        for(int i = 0; i < tuerme.length; i++){
            tuerme[i] = new Rectangle(x+((turmX)*i), y-((turmSpace)*i), w-((turmWidth)*i), 40);
        }
    }


    public void paintComponent(Graphics g){
        define(85, 700, 340);
        
        //Türme
        /* ******************************* */
        g.setColor(new Color(255, 100, 20));
        g.fillRect(250, 220, 15, 500);
        g.setColor(new Color(0, 0, 0));
        
        g.setColor(new Color(255, 100, 20));
        g.fillRect(855, 220, 15, 500);
        g.setColor(new Color(0, 0, 0));
        
        g.setColor(new Color(255, 100, 20));
        g.fillRect(1500, 220, 15, 500);
        g.setColor(new Color(0, 0, 0));
        /* ******************************* */
        
        //Scheiben
            for(int i = 0; i < tuerme.length; i++){
                    g.setColor(new Color(70, 70, 70));
                    g.fillRect(tuerme[i].x, tuerme[i].y, tuerme[i].width, tuerme[i].height);
                    g.setColor(new Color(0, 0, 0));
            }
        }
    
    
    public int moveFrame = 1000, moveSpeed = 0;
    public void bewege(char start, char ablage, char ziel, int scheiben)
    {
     if(moveSpeed >= moveFrame){
        moveFrame = 0;
        if(scheiben == 1){
            //System.out.println("Lege die oberste Scheibe von " + "Turm " + a + " auf Turm " + c + ".");
            
            if(Character.toString(ziel).equals("a")){
                    tuerme[scheiben+4].setLocation(1435, 700);
            }
            
            if(Character.toString(ziel).equals("b")){
                tuerme[scheiben+3].setLocation(768, 700);
            }
        }else{
               bewege(start, ablage, ziel, scheiben-1);
               bewege(start, ziel, ablage, 1);
               bewege(ziel, start, ablage, scheiben-1);
        }
     }else{
         moveSpeed += 1;
     }
}
    
    public void run() {
        while(true){
            repaint();
            try{
                Thread.sleep(1);
                bewege('a', 'b', 'c', turmLength);
            }catch(Exception e){}
        }
    }
    
    

}
```


----------



## F4ckHanoi (17. Jun 2015)

Ihr hilft ja wirklich toll.
Vielen dank echt danke.

Nur eine befriedigend bekommen herzlichen Glückwunsch.
Ver****te s******e ey.

Auf jeden Fall erstmal alle warnen auf diesen s****** Forum zu kommen


----------



## Maggot (17. Jun 2015)

F4ckHanoi hat gesagt.:


> Ihr hilft ja wirklich toll.
> Vielen dank echt danke.
> 
> Nur eine befriedigend bekommen herzlichen Glückwunsch.
> ...



Gratulation zu deinem Befriedigend. Wäre ich dein Lehrer und wüsste wie sehr du dich da reingehängt hast, hättest du von mir ein Nicht Genügend bekommen. 

Du erwartest wirklich das dir hier jemand deine Aufgaben macht, damit du gute Noten bekommst?


----------



## VfL_Freak (17. Jun 2015)

Moin,



F4ckHanoi hat gesagt.:


> Ihr hilft ja wirklich toll.
> Vielen dank echt danke.
> Nur eine befriedigend bekommen herzlichen Glückwunsch.
> Ver****te s******e ey.
> Auf jeden Fall erstmal alle warnen auf diesen s****** Forum zu kommen


und Du glaubst, dass Beleidigungen helfen ????? :noe:

Gruß Klaus


----------



## camelCase90 (17. Jun 2015)

Jeder ist seines eigenen Schicksals-Schmied.


----------



## BK117 (17. Jun 2015)

Hallo, um mal wieder zum Thema zu kommen:
Habe ich das richtig verstanden?
Du zeichnest deine Rectangle durch die in den drei Arrays gespeicherten Daten? Und willst du eine Animation von einem zum anderen und dann die Daten aus dem ersten Array löschen? 

Ja? Oder war das anders gemeint?
Wenn ja. Was von dem, was ich oben beschrieben habe, verstehst du nicht?

Gruß Nico


----------



## F4ckHanoi (21. Jun 2015)

Bist du behindert oder so?

Ich habe bis dahin alles selber gemacht. Außerdem bin ich noch lange keine richtiger Programmierer. Wie soll ich etwas machen, wovon ich keine Ahnung habe?

Ich habe nur um Hilfe und Tipps gebeten aber da keiner Lust dazu hatte, habe ich nicht so eine gute Note bekommen. Wo bitte habe ich dir gesagt, dass du die Aufgabe für mich machen sollst?

Denk erst nach bevor du schreibst. 

Thx bb, werde die Aufgabe trotzdem noch schaffen. 
Brauche euere Hilfe und diese kack Forum nicht mehr.


----------



## BK117 (21. Jun 2015)

Warum musst du mich direkt so beleidigen? Ich habe nur versucht, nett wieder aufs Thema zurück zu kommen. Außerdem habe ich nie behauptet, dass du etwas kopiert hast. Also bitte sag mir, warum du so auf uns reagierst. Bitte sag uns was dich stört. Ich werde mich bemühen, dass ich den Fehler in Zukunft nicht mehr mache.

MfG BK


----------



## Joose (4. Jul 2015)

F4ckHanoi hat gesagt.:


> Nur eine befriedigend bekommen herzlichen Glückwunsch.



Immer noch besser als ein "Nicht genügend" oder?

Auch wenn du frustriert bist über deine Note, ist das kein Grund beleidigend zu werden.
Du gehst in die Schule/zur Universität und du sollst deine Aufgaben erledigen, dabei darfst du dir natürlich Hilfe besorgen.
Am Ende bist du aber trotzdem selber verantwortlich für deine Leistungen und Noten!



F4ckHanoi hat gesagt.:


> Ich habe bis dahin alles selber gemacht. Außerdem bin ich noch lange keine richtiger Programmierer. Wie soll ich etwas machen, wovon ich keine Ahnung habe?



Indem du versuchst das Problem in kleinere Teile aufzuteilen und jeden Teil einzeln probierst zu lösen.
Es wird immer wieder Aufgaben/Probleme geben, bei welchen du nicht gleich eine Lösung kommst!



F4ckHanoi hat gesagt.:


> Ich habe nur um Hilfe und Tipps gebeten aber da keiner Lust dazu hatte, habe ich nicht so eine gute Note bekommen. Wo bitte habe ich dir gesagt, dass du die Aufgabe für mich machen sollst?



Du kannst uns nicht die Schuld geben wenn du eine schlechte Note bekommen hast!
Wir alle hier sind freiwillig in diesem Forum unterwegs und helfen anderen Leuten auch auf freiwilliger Basis.
Wenn du deine Note von der Hilfe in diesem Forum abhängig machst ist das nicht unser Problem!




F4ckHanoi hat gesagt.:


> Denk erst nach bevor du schreibst.



Das solltest du ebenfalls machen! Beleidigungen sind hier einfach fehl am Platz.


----------

