Java Greenfoot error in class with no error indication

245 Views Asked by At

error

Greenfoot tells me there is an error in the code, but doesn't show me any indication of an error, so it can't be a syntax issue. I tried playing around with the brackets and I restarted Greenfoot, nothing helps. I am trying to do a simple program which would make a Rover move and collected Rocks every time there is one on the field it stands on, and if there are no rocks it places a mark.

Here's the code, has anyone an idea on how to fix this?

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

public class Rover extends Actor
{
    private Display anzeige;

    /**
     * Die Anweisungen der Methode act werden ausgeführt, wenn der Act-Button
     * im Hauptfenster geklickt wird.
     */
    public void act() 
    {
        while (!huegelVorhanden("vorne"))
        {
            fahre();
            if (gesteinVorhanden())
                nimmGestein();
                
            markeVorhanden();
        }
    } 

    /**
     * Der Rover bewegt sich ein Feld in Fahrtrichtung weiter.
     * Sollte sich in Fahrtrichtung ein Objekt der Klasse Huegel befinden oder er sich an der Grenze der Welt befinden,
     * dann erscheint eine entsprechende Meldung auf dem Display.
     */
    public void fahre()
    {
        int posX = getX();
        int posY = getY();

        if (huegelVorhanden("vorne"))
        {
            nachricht("Zu steil!");
        }
        else if (getRotation() == 270 && getY() == 1)
        {
            nachricht("Ich kann mich nicht bewegen");
        }
        else
        {
            move(1);
            Greenfoot.delay(1);
        }

        if (posX == getX() && posY == getY() && !huegelVorhanden("vorne"))
        {
            nachricht("Ich kann mich nicht bewegen");
        }
    }

    /**
     * Der Rover dreht sich um 90 Grad in die Richtung, die mit richtung („links“ oder „rechts“) übergeben wurde.
     * Sollte ein anderer Text (String) als "rechts" oder "links" übergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
     */
    public void drehe(String richtung)
    {
        if (richtung == "rechts")
        {
            turn(90);
            //setRotation(getRotation()+90);
        }
        else if (richtung == "links")
        {
            turn(-90);
            // setRotation(getRotation()-90);
        }
        else
        {
            nachricht("Befehl nicht korrekt!");
        }
    }

    /**
     * Der Rover gibt durch einen Wahrheitswert (true oder false )zurück, ob sich auf seiner 
     * Position ein Objekt der Klasse Gestein befindet.
     * Eine entsprechende Meldung erscheint auch auf dem Display.
     */
    public boolean gesteinVorhanden()
    {
        if (getOneIntersectingObject(Gestein.class) != null)
        {
            nachricht("Gestein gefunden!");
            return true;
        }

        nachricht("Kein Gestein vorhanden!");
        return false;
    }

    public void bergSeiteAbfahren()
    { 
        while (huegelVorhanden("rechts"))
        {
            fahre();
        }
    }

    public void steineSammeln()
    {
        fahren();
            
        while (gesteinVorhanden())
        {
            nimmGestein();
            fahren();
        }
        setzeMarke();
    }  

    /**
     * Der Rover überprüft, ob sich in richtung ("rechts", "links", oder "vorne") ein Objekt der Klasse Huegel befindet.
     * Das Ergebnis wird auf dem Display angezeigt.
     * Sollte ein anderer Text (String) als "rechts", "links" oder "vorne" übergeben werden, dann erscheint eine entsprechende Meldung auf dem Display.
     */
    public boolean huegelVorhanden(String richtung)
    {
        int rot = getRotation();

        if (richtung == "vorne" && rot == 0 || richtung == "rechts" && rot == 270 || richtung == "links" && rot == 90)
        {
            if (getOneObjectAtOffset(1, 0, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung == "vorne" && rot == 180 || richtung == "rechts" && rot == 90 || richtung == "links" && rot == 270)
        {
            if (getOneObjectAtOffset(-1, 0, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung == "vorne" && rot == 90 || richtung == "rechts" && rot == 0 || richtung == "links" && rot == 180)
        {
            if (getOneObjectAtOffset(0, 1, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung == "vorne" && rot == 270 || richtung == "rechts" && rot == 180 || richtung == "links" && rot == 0)
        {
            if (getOneObjectAtOffset(0, -1, Huegel.class) != null)
            {
                return true;
            }
        }

        if (richtung != "vorne" && richtung != "links" && richtung != "rechts")
        {
            nachricht("Befehl nicht korrekt!");
        }

        return false;
    }

    /**
     * Der Rover nimmt das Gestein auf seiner Position auf.
     * Sollte kein Objekt der Klasse Gestein vorhanden sein, dann erscheint
     * eine entsprechende Meldung auf dem Display.
     */
    public void nimmGestein()
    {
        if (gesteinVorhanden())
        {
            Greenfoot.delay(1);
            removeTouching(Gestein.class);
        }
        else 
        {
            nachricht("Hier ist kein Gestein");
        }
    }

    /**
     * Der Rover erzeugt ein Objekt der Klasse „Marke“ auf seiner Position.
     */
    public void setzeMarke()
    {
        getWorld().addObject(new Marke(), getX(), getY());
    }

    /**
     * *Der Rover gibt durch einen Wahrheitswert (true oder false )zurück,
     * *ob sich auf seiner Position ein Objekt der Marke befindet.
     * Eine entsprechende Meldung erscheint auch auf dem Display.
     */
    public boolean markeVorhanden()
    {
        if (getOneIntersectingObject(Marke.class) != null)
        {
            nachricht("Beep Boop");
            return true;
        }

        nachricht("Keine Marke vorhanden!");
        return false;
    }

    public void entferneMarke()
    {
        if (markeVorhanden())
        {
            removeTouching(Marke.class);
        }
    }

    private void nachricht(String pText)
    {
        if (anzeige != null)
        {
            anzeige.anzeigen(pText);
            Greenfoot.delay(1);
            anzeige.loeschen();
        }
    }

    private void displayAusschalten()
    {
        getWorld().removeObject(anzeige);
    }

    protected void addedToWorld(World world)
    {
        setImage("images/rover.png");
        world = getWorld();
        anzeige = new Display();
        anzeige.setImage("images/nachricht.png");
        world.addObject(anzeige, 7, 0);
        if (getY() == 0)
        {
            setLocation(getX(), 1);
        }
        anzeige.anzeigen("Ich bin bereit");
    }

    class Display extends Actor
    {
        GreenfootImage bild; 

        public Display()
        {
            bild = getImage();
        }

        public void act() 
        {
        }  

        public void anzeigen(String pText)
        {
            loeschen();
            getImage().drawImage(new GreenfootImage(pText, 25, Color.BLACK, new Color(0, 0, 0, 0)), 10, 10);
        }

        public void loeschen()
        {
            getImage().clear();
            setImage("images/nachricht.png");
        }
    }
0

There are 0 best solutions below