Welt mit while-Schleife umzäunen

thoff430

Mitglied
Hallo miteinander!



Ziel ist es, mittels einer while-Schleife die Welt unabhängig von der Größe zu umzäunen. Dafür soll eine Methode placeFences() geschrieben werden, die Gebrauch davon macht, dass man die Welt fragen kann, wie groß sie eigentlich ist.

Wie geht's weiter?

Der Code entspricht dem linken Bild. Rechts ist das Ziel zu sehen.

Java:
public class ChickenWorld  extends World
{

    private static final int MAXWIDTH = 16, MAXHEIGHT = 16, CELLSIZE = 30;
    public int x, y;
    public int width = getWidth();
    
    /**
     * Constructor for objects of class ChickenWorld.
     * 
     */
    public ChickenWorld() {    
        super(MAXWIDTH, MAXHEIGHT, CELLSIZE); 
        populate ();
    }

    public void populate () {
        Barnfield fryde = new Barnfield ();
        Fence fence = new Fence();
        addObject(fence, 0, 0);
        addObject(fryde, 8, 8);
    }
    
    public void placeFences () {
        
    }

}
 
für jedes Feld x,y:
schaue ob x oder y == 0 oder x oder y == max fields
wenn ja, dann mach ein Zaun hin

Gruß,

Martin
 
So geht's anscheinend schonmal nicht... ich knobel mal weiter.

Java:
public void placeFences () {
        while ((x==0)||(y==0)||(x==width)||(y==width)){
        Fence fence = new Fence();
            addObject(fence, x, y); 
        }
    }
 
Mit einer Schleife: Bei einer Iteration der Schleife kann z.B. 1 oder 2 Felder gesetzt werden, nicht beliebig oder unterschiedlich viele.

D.h. du müsstest einen Schleife schreiben, die oben macht, eine, die unten macht, und eine, die jeweils zwei Felder in einer Reihe/Zeile macht.

Damit vermeidest du geschachtelte Schleifen. 😱 😱
 
Um die oberste Zeile vollzubekommen hab ich mir das hier gedacht:

Java:
for (int x = 0; x <= width; x++){
        Fence fence = new Fence();
            addObject(fence, x, 0); 
        }

Was mach ich hier im Wesentlichen falsch? Ich bekomme keinen Zaun hingesetzt.
 
Hab zwar nicht viel mit Greenfoot gemacht und kenn mich mit dem Initialisierungsprozess nicht aus aber ich würde mal raten, dass [c]public int width = getWidth();[/c] als erstes im Konstruktor ausgeführt wird und dann der [c]super[/c]-Aufruf und damit wäre width 0. Gib einfach mal width aus oder nimm deine Konstante, die müsste den selben Wert haben.
 
Du hast meinen pseudocode falsch implementiert

nicht solange x, y == 0 ist sondern foreach (Field in Array) (für jedes)

Gruß,
Martin
 
Du hast meinen pseudocode falsch implementiert

nicht solange x, y == 0 ist sondern foreach (Field in Array) (für jedes)

Gruß,
Martin

Sorry, Arrays kann ich noch nicht anwenden. Im Prinzip muss, laut Aufgabenstellung, das ganze mit einer while-Schleife realisierbar sein.

Ich bin erst gerade am einarbeiten in Java, allgemein ins Programmieren. Erstmal muss ich die "Grammatik" lernen... ich will nicht einfach irgendwelche einfachen und womöglich besseren Lösungen kopieren und anwenden, sondern erstmal wirklich die einzelnen Grundbausteine der Sprache kennenlernen um sie dann anzuwenden.

Wenn das ganze nur mit while gelöst werden soll, gibt es da eine Möglichkeit? Ohne arrays, keine for-Schleifen.
 
Zuletzt bearbeitet:
while und for sind komplett gegeneinander austauschbar. Wenn du folgende for-Schleife hast:
Java:
for(int i=0;i<getWidth();i++)
{
    //Tu irgendwas
}
ist das identisch mit folgender while-Schleife:
Java:
int i=0;
while(i<getWidth())
{
    //Tu irgendwas
    i++;
}
 
Code:
for (int i = 0; i < leength(); i++) {
 // Huhn bei 0,i
 // Huhn bei i,0
 // Huhn bei i,leength()
 // Huhn bei leength(),i
}

😀 ^^
 
Juhu, es funktioniert... fast! 🙂

Ich kann jeweils nur eine vertikale und eine horizontale Reihe bauen. Der Rest will nicht.
Ich bekomme nur die unterste Reihe hin, vertausche ich die addObject-Methoden, nur die oberste. Ähnliches bei den vertikalen Reihen.

Java:
public void placeFences () {        
        while (x <= width ){
            Fence fence = new Fence();
            addObject(fence, x, width); // wird gemacht
            addObject(fence, x, 0);  // wird nicht gemacht
            x++;
        }
 
Zuletzt bearbeitet:
Eventuell kannst du einen Fence nur einmal hinzufügen? Hast du mal versucht 2 verschiedene Instanzen zu übergeben?
 
Ja gut, dann geht das anscheinend nicht 🙂 Aber wie krieg ich jetzt trotzdem zwei horizontale und zwei vertikale Reihen hin...anstatt nur die Hälfte?
 
Du meinst damit, ich soll noch eine zweite ChickenWorld-Instanz erstellen?

Ich gehe stark davon aus, dass wir das nicht machen sollen bzw es nicht nötig haben. Bei anderen konnte ich sehen, dass die Aufgabe mit nur einer Instanz gelöst wurde. Auch in der Aufgabenbeschreibung steht nichts dergleichen drin.

Würd ja gerne die genaue Aufgabenstellungen hier posten, allerdings sind diese auf Niederländisch.

edit: Hab eine zweite erstellt, allerdings kann ich nur eine davon anzeigen lassen. Entweder ChickenWorld oder ChickenWorld2, aber nicht beide "kombiniert".
 
Zuletzt bearbeitet:
Ich spreche von den Fence instanzen, nicht von der ganzen Welt.
Du versuchst im Moment einen Zaun zweimal zu setzen, eventuell geht das ja gar nicht.
 
Sorry, bin noch ein wenig schwer von Begriff 😀

Java:
public void placeFences () {        
        while (x <= width){
            Fence fence = new Fence();
            Fence2 fence2 = new Fence2();
            addObject(fence, x, width); 
            addObject(fence2, x, 0);
            x++;
        }
        
        while (y <= width){
            Fence fence = new Fence();
            Fence2 fence2 = new Fence2();
            addObject(fence, width, y); 
            addObject(fence2, 0, y);
            y++;
        }

Funktioniert soweit ganz gut! Ich frag mich aber, ob es nicht auch nur mit einer Instanz möglich ist. Ich müsste sonst, damit das Huhn den Zaun auch als solchen erkennt, noch mehr anpassen als gefordert.

Kann ich nicht noch irgendwie praktisch Gebrauch von getHeight() machen?
 
Zuletzt bearbeitet:
Warum hast du jetzt ne Klasse Fence2?
Tuts nicht einfach sowas?
Java:
Fence fence = new Fence();
Fence fence2 = new Fence();


Ich frag mich aber, ob es nicht auch nur mit einer Instanz möglich ist. Ich müsste sonst, damit das Huhn den Zaun auch als solchen erkennt, noch mehr anpassen als gefordert.
Ja anscheinend nicht.
 
Ich hab oben nicht bedacht, dass es nicht um Hühner um Zäunen geht, sondern um Zäune um Hühner. Somit müssen also Zäune statt Hühner gesetzt werden. ^^

Und andere Sache: Es kommt drauf an, welche Bestandteile Fence ausmachen, also was das für ein Objekt ist, welche Attribute und Eigenschaften es besitzt usw.
 
Oh Gott, ich werfe hier in meinem Anfängertum noch wichtige Begriffe durcheinander. ;(

Es funktioniert jetzt wunderbar, vielen Dank!

@ emailundlos Falls es dich interessiert:

Java:
public class Fence  extends Actor
{
    private int height;
    
    public Fence () {
        height = 20;
    }
        
    public void scale (int percentage) {
        height = height * percentage / 100;
    }
    
    public int getHeight () {
        return height;
    }
}
 
Chicken muss wiederholt einen Schritt weitergehen. Wenn es vor einem Zaun steht, muss es sich nach rechts (oder links) drehen und weitergehen, bis sich neben Chicken kein Zaun mehr befindet oder es wieder vor einem Zaun steht. Dann muss es wieder nach rechts (oder links) drehen und so fortfahren. Einmal bei dem Feld angekommen, bei dem der Zaun anfing, hat es den Zaun einmal umrundet.
Code:
while (notFence)
    move
turnRight

while (notFinish)
    if (fenceLeft)
        if (notFenceFront)
            move
        else
            turnRight
    else
        turnLeft
 

Neue Themen


Zurück
Oben