Attribute eines anderen Objektes überprüfen und danach handeln

thoff430

Mitglied
Hallo miteinander!

Ich muss hier wieder einmal einfache Aufgaben lösen und es hapert immer noch an der Umsetzung in Java.

Gearbeitet wird noch mit Greenfoot. Die Aufgabe:

Das Huhn Eier suchen lassen und sie dann ausbrüten (durch ein anderes Bild ersetzen, diese Aufgabe hab ich schon gelöst). Nun soll das Huhn aber auch aufhören bereits ausgebrütete Eier immer wieder ausbrüten zu wollen. Natürlich geht das einfach, in dem ich das Ei frage, ob es bereits ausgebrütet ist oder nicht und dementsprechend meine Methode ausführe oder halt nicht.

Ich bin aber immer noch in der Phase, in der ich erst herausfinde, wie Java eigentlich funktioniert.



Hier mal der Code, die wichtigen Stellen hab ich markiert, irrevante Methoden der Übersichtlichkeit halber entfernt. Das eigentliche Problem liegt in der Klasse Barnfield (ganz unten)

Klasse Egg:
Java:
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Egg  extends Actor
{
    public boolean hatched;
    
    public Egg () {
        hatched = false; 
    }
   
    public void hatch() {
        hatched = true;
        GreenfootImage hatched_egg = new GreenfootImage("egg_hatched.png");
        setImage(hatched_egg);
    }
    
    public boolean isHatched() {
        return hatched;
    }
}

Klasse Chicken:
Java:
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Chicken  extends Actor
{
    private static final int EAST  = 0, WEST  = 1, NORTH = 2, SOUTH = 3;

    private int direction;
    private GreenfootImage chickenRight, chickenLeft;

    
    public Chicken () {
        chickenLeft = getImage();
        chickenRight  = new GreenfootImage(chickenLeft);
        chickenRight.mirrorHorizontally();
        setDirection(WEST);
    }


    /**
     * Check whether there is an egg in the same cell as we are.
     */
    public boolean foundEgg() {
        return getOneObjectAtOffset(0, 0, Egg.class) != null;
    }
    
             
    public void layEgg() {
        getWorld().addObject(new Egg (), getX (), getY ());
    }
    
    public Egg takeEgg() {
        Actor egg_actor = getOneObjectAtOffset(0, 0, Egg.class);
        if (egg_actor != null) {
            return (Egg) egg_actor;
        } else {
            ShowError ("There was no egg in this cell");
            return null;
        }
    }
 
             
}

Barnfield, Subklasse von Chicken:
Java:
import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


public class Barnfield  extends Chicken
{
    //public boolean eggUnhatched = foundUnhatchedEgg ();

    private int eggsHatched;
    /**
     * Act - do whatever the Fryde wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() {
        hatchEggs ();
    }
    
    /**
     * Hatch an egg.
     */
    public void hatchEgg () {
         Egg egg_found = takeEgg ();
         egg_found.hatch();
         egg_found.hatched = true;
         eggsHatched++;
    }
    
    /**
     * Tells Fryde if she has 
     * has found an unhatched egg
     */
    public boolean foundUnhatchedEgg () { // dies sollten wir selbst erstellen. was mach ich hier falsch?
        if (hatched) { // hatched kann nicht gefunden werden, obwohl als public deklariert...
            return false; //.... dass es so nicht geht weiß ich, nur wie krieg ich den wert abgefragt?
        } 
        return true;
    }
    
    
        
    
    /**
     * Turn right
     */
    public void turnRight() {
        turn (); // from Barnfield
        turnLeft (); // inherited from Chicken
    }

    
    
    
    public boolean eggAhead () {
        if (canMove ()) {
            move ();
            if (foundEgg ()) {   // found an egg, have to go back
                moveBackwards ();
                return true;
            }
            else {   // there was no egg
                moveBackwards ();
                return false;
            }
        }
        else
            return false;
    }
    


    private void hatchEggs () {
        lookForEgg  ();
        if (canMove ()) {
            move ();
        }
        if (foundEgg ()) {
            hatchEgg ();
        }
    }

          
    

}
 
Zuletzt bearbeitet:
Hm, ziemlich viel Code aber sowas ähnliches müsste es sein:

Java:
private void findAndHatchEggs () {
        if (canMove ()) {
            move ();
            if (foundEgg () && !isHatched())
                hatchEgg ();
        }
    }

Einfach noch prüfen ob das Ei nicht ausgebrütet ist..
 
Öh also ich hab immer noch nicht ganz den Überblick aber eig. kannst du das hatched an unzähligen Stellen abfragen..

Java:
    public void hatchEgg () {
         Egg egg_found = takeEgg ();
         egg_found.hatch();
         egg_found.hatched = true;
         eggsHatched++;
    }

da z. B. über egg_found.isHatched();
oder in der hatch(); Methode in der Egg Klasse bevor du überhaupt was machst.

edit:
Dein
Java:
public boolean foundUnhatchedEgg () { // dies sollten wir selbst erstellen. was mach ich hier falsch?
        if (hatched) { // hatched kann nicht gefunden werden, obwohl als public deklariert...
            return false; //.... dass es so nicht geht weiß ich, nur wie krieg ich den wert abgefragt?
        } 
        return true;
    }

Macht natürlich kein Sinn, da du von irgendnem Egg, also einem Objekt, das hatched abfragen musst! Hier würdest du in der aktuellen Klasse das hatched abfragen, was es ja gar nicht gibt.
Du musst erst sowas machen wie in der hatchEgg() Funktion!
Code:
Egg egg_found = takeEgg ();
Da holst du dir das aktuelle Ei und dann kannst du prüfen ob von deinem egg_found.isHatched() == true ist.
 
Zuletzt bearbeitet:
Genau an dem abfragen hapert es.



Es funktioniert auch nicht, wenn ich statt der Methode ein Attribut nehme. Was fehlt da, wieso wird weder die Methode noch das Attribut gefunden?

Ich habe bisher immer nur Attribute eines Objektes selbst abgefragt (zB, schaut das Huhn gerade nach Norden, ja oder nein?). Aber jetzt hab ich hier zwei Verschiedene Objekte. Das Huhn will etwas vom Ei wissen. Hier hab ich ein Brett vorm Kopf.

edit: ich schau mal was sich machen lässt
 
Ich kriegs nicht hin, mein Kopf qualmt. Was muss ich da machen?

Einfach
Java:
Egg egg_found = takeEgg ();
da reinschreiben funktioniert nicht. Was ich hier grad fabriziere ist eher ein zielloses rumraten...
 
Ja das war ein doofes Beispiel von mir. Schau dir meinen 2. Post an, der erklärt es dir eigentlich!

Macht natürlich kein Sinn, da du von irgendnem Egg, also einem Objekt, das hatched abfragen musst! Hier würdest du in der aktuellen Klasse das hatched abfragen, was es ja gar nicht gibt.

Da hast du ja kein Objekt.
Wie gesagt erst per
Code:
Egg egg_found = takeEgg ();
das Ei auf dem aktuellen Feld HOLEN und dann kannst du seine egg_found.isHatched(); Funktion prüfen.

Mögliche Lösungen:

Java:
public void hatchEgg () {
         Egg egg_found = takeEgg ();
         if(!egg.found.isHatched()){
                  egg_found.hatch();
                  egg_found.hatched = true;
                  eggsHatched++;
         }
    }

ODER:

Java:
private void findAndHatchEggs () {
        Egg egg_found = takeEgg ();
        if (canMove ()) {
            move ();
            if (foundEgg () && !egg_found.isHatched())
                hatchEgg ();
        }
    }
ODER (wahrscheinlich das einfachste..):

Java:
public void hatch() {
        if(!isHatched){
                hatched = true;
                GreenfootImage hatched_egg = new GreenfootImage("egg_hatched.png");
                setImage(hatched_egg);
        }
    }
 
Zuletzt bearbeitet:
Vielen Dank! Ich hatte echt Knoten im Kopf, werd die Lösungen noch im Detail studieren und mal mit dem vergleichen, was ich probiert habe.

In der Uni wurden wir einfach vor solchen Aufgaben gesetzt ohne uns erst überhaupt mit Java vertraut zu machen. Inzwischen werden einige Sachen aber klarer. Zum Glück ^^
 

Zurück
Oben