Mit einer Schleife eine Treppe zeichnen

KogoroMori21

Aktives Mitglied
Guten Tag,
ich komme irgendwie bei der Aufgabe 2 a) mit der Treppe nicht weiter. Im Anhang befindet sich meine Zeile Code.

Ich weiß das ich das mit zwei Schleifen machen muss die ineinander verschachtelt sind, aber ich weiß nicht wie ich das anstellen soll. Theoretisch könnte ich für jede Zeile die Rechtecke zeichnen, aber das wäre gemogelt, also muss ich es mit einer Schleife darstellen 🙂.

Ich bedanke mich jetzt schon mal für eure Mühen!
Code:
public class Dekoration {
    Interaktionsbrett ib = new Interaktionsbrett();
        
        public void treppe() {
            int i = 1;
            
            while ( i<=7) {
                                
                this.ib.neuesRechteck(30 * i,30 ,30,30);
                this.ib.neuesRechteck(30 * i*2,60 ,30,30);
                this.ib.neuesRechteck(30 * i*3,90 ,30,30);
                this.ib.neuesRechteck(30 * i*4,120 ,30,30);
                this.ib.neuesRechteck(30 * i*5,150 ,30,30);
                this.ib.neuesRechteck(30 * i*6,180 ,30,30);
                this.ib.neuesRechteck(30 * i*7,210 ,30,30);
                i = i + 7;
                
                
      }
    }       
}
 

Anhänge

  • Aufgabenstellung.JPG
    Aufgabenstellung.JPG
    47,9 KB · Aufrufe: 31
  • Code.JPG
    Code.JPG
    99,8 KB · Aufrufe: 26
Zuletzt bearbeitet:
In der Aufgabenstellung steht "mit Hilfe zweier ineinandergeschachtelter Schleifen". Jetzt schaue deinen Code an 🙂

Als Beispiel hier mal eine Kleine Treppe auf der Konsole:
Java:
public class XTreppe {
    public static void main(String... args) {
        for (int i = 1; i <= 7; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print('X');
            }
            System.out.println();
        }
    }
}
 
Schau dir das gewünschte Bild an und überlege, welche Schleife für welchen Teil zuständig ist. Dazu musst du schauen, welche Elemente x-mal in einer bestimmten Weise vorkommen, z.B.

***
***

Du siehst je 3 gleiche Elemente (*) und das zweimal (in zwei Zeilen).
 
Mein Beispiel hilft ja erstmal gezielt für a)

Eventuell helfen dir gedanklich noch diese Tipps:
b) Die Pyramide ähnelt der Treppe, nur dass die einzelnen Zeilen ein gewisses Offset haben. Dieses Offset verringert sich mit jeder Zeile
c) Jede 2. Zeile hat eine andere "Definition". Ich schmeiße hier mal den Modulo-Operator in den Raum.
 
In der Aufgabenstellung steht "mit Hilfe zweier ineinandergeschachtelter Schleifen". Jetzt schaue deinen Code an 🙂

Als Beispiel hier mal eine Kleine Treppe auf der Konsole:
Java:
public class XTreppe {
    public static void main(String... args) {
        for (int i = 1; i <= 7; i++) {
            for (int j = 1; j <= i; j++) {
                System.out.print('X');
            }
            System.out.println();
        }
    }
}
Hey, wenn ich deine Schleife nehme und das mit dem this.ib.neuesRechteck probiere dann entsteht die Treppe immer noch nicht. Ich versteh nicht wieso, auf der Console zeigt er die Treppe an mit dem ('X') aber wenn ich das System.out.println ersetze durch
this.ib.neuesRechteck(30 * i,30 ,30,30);
dann entsteht die Treppe komischerweise nicht :/
 
Ich in guter Dinge, dass du den Dreh raus hast. Wenn du a verstanden hast sollten b und c auch nicht so schwer sein
Code:
        public void pyramide() {
            int rows = 5, k = 0;

            for(int i = 1; i <= rows; ++i, k = 0) {
                for(int space = 1; space <= rows - i; ++space) {
                    this.ib.neuesRechteck(30 * k, 30 * i, 30, 30 );
                    this.ib.neuesRechteck(30 * rows, 30 * k, 30, 30 );
                }

                while(k != 2 * i - 1) {
                    this.ib.neuesRechteck(30 * k, 30 * i, 30, 30 );
                    ++k;
                }

            }
        }
    }
Hey sorry ich bins nochmal, ich komme einfach seid freitag nicht weiter bei b), ich probier die ganze zeit rum aber kriege die pyramide irgendwie nicht ausgegeben. Hab es mit System.out.println versucht und die Pyramide lässt sich auf der Konsole darstellen aber nicht auf dem Interakationsbrett.
Und ich kriege es auch nicht hin das in zwei schleifen zu verpacken...
 

Anhänge

  • code.JPG
    code.JPG
    67,6 KB · Aufrufe: 7
Bei b sollten die Schleifen gleich bleiben wie bei a. Nur die x Position eines rechtecks verändert sich um ein offset. Dieses offset ändert sich je Zeile, also in jedem Durchlauf der äußeren Schleife
 
Guten Tag Leute, ich bins nochmal und hoffe es ist das letzte mal..
Ich habe einen Ansatz bei Aufgabe c) kriege aber die restliche Mauer nicht hin..
Code:
    public void mauer() {
        
        for (int i = 0; i <= 18; i++) {
            i++;
            for (int j = 1; j <= i; j++) {               
                this.ib.neuesRechteck(30 , 30 , 30 * i , 30 );
 

Anhänge

  • aufgabe c).JPG
    aufgabe c).JPG
    95,9 KB · Aufrufe: 5
for (int i = 0; i <= 18; i++) { i++; for (int j = 1; j <= i; j++) { this.ib.neuesRechteck(30 , 30 , 30 * i , 30 );
Im übrigen hast du hier immer die die gleiche Position x und y. Dafür machst du jedes Rechteck breiter. Optisch kommt man so bestimmt auch ans Ziel, ist aber vermutlich nicht Sinn der Übung 😀 Die Letzten beiden Werte müssten immer Konstant bleiben, außer für die Füllstücke
 
Für das Verschieben (Schritt 2) gibt es aus meiner Sicht 3 Möglichkeiten
1. Du iterierst wie gehabt mit einer Schleife über die Zeilen. Anhand des Modulo-Operators wählst du dir eine Zeilendefinition aus (if-else)
2. Du iteriert wie gehabt mit einer Schleife über die Zeilen. Du hast 1 Zeilendefinition, aber bestimmst mit Modulo die Parameter (Tenary)
3. Du hast 2 for-Schleifen für die Zeilen. Eine Schleife iteriert die geraden und die andere Schleife iteriert die ungerade Zeilen. Jede Schleife hat ihre eigene Definition. Für die Variante brauchst du keinen Modulo, sondern einen Schleifen-Fortschritt von i += 2 anstatt i++.
 
Für das Verschieben (Schritt 2) gibt es aus meiner Sicht 3 Möglichkeiten
1. Du iterierst wie gehabt mit einer Schleife über die Zeilen. Anhand des Modulo-Operators wählst du dir eine Zeilendefinition aus (if-else)
2. Du iteriert wie gehabt mit einer Schleife über die Zeilen. Du hast 1 Zeilendefinition, aber bestimmst mit Modulo die Parameter (Tenary)
3. Du hast 2 for-Schleifen für die Zeilen. Eine Schleife iteriert die geraden und die andere Schleife iteriert die ungerade Zeilen. Jede Schleife hat ihre eigene Definition. Für die Variante brauchst du keinen Modulo, sondern einen Schleifen-Fortschritt von i += 2 anstatt i++.
Du hast mir echt geholfen, vielen Dank aber irgendwie komm ich trotzdem nicht drauf..
 
Selbstgebaut, sind nur wenige Zeilen Code und soll relativ nah an dem sein, was Kogoro da verwenden soll
Falls du daran teilhaben willst @mihe7... ^^Einfach mal quick & dirty hingebaut

Java:
public class Interaktionsbrett extends JFrame {
    private static double OFFSET = 10;

    private List<Rectangle2D> rechtecke = new ArrayList<>();

    public Interaktionsbrett() {
        setTitle("Interaktionsbrett");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JComponent zeichnung = new JComponent() {
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D)g;
                rechtecke.forEach(g2d::draw);
            }
        };
        zeichnung.setPreferredSize(new Dimension(400, 400));
        add(zeichnung);

        pack();
        setVisible(true);
    }

    public void neuesRechteck(double x, double y, double breite, double hoehe) {
        rechtecke.add(new Rectangle2D.Double(OFFSET + x, OFFSET + y, breite, hoehe));
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben