Turm von Hanoi

F4ckHanoi

Mitglied
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:

Java:
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

Top Contributor
Moin,

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

Gruß Klaus
 

Joose

Top Contributor
@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

Bekanntes Mitglied

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.
 

F4ckHanoi

Mitglied
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
 
Zuletzt bearbeitet:

Joose

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

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

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

Mitglied
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

Bekanntes Mitglied
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

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

aber hier nochmal:

GUI:

Java:
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:

Java:
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){}
        }
    }
    
    

}
 
Zuletzt bearbeitet:

F4ckHanoi

Mitglied
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

Bekanntes Mitglied
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

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?
 

BK117

Aktives Mitglied
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 ;)
 
Zuletzt bearbeitet:

F4ckHanoi

Mitglied
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

Aktives Mitglied
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

Top Contributor
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!

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!

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!


Denk erst nach bevor du schreibst.

Das solltest du ebenfalls machen! Beleidigungen sind hier einfach fehl am Platz.
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben