0

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");
        }
    }
the busybee
  • 10,755
  • 3
  • 13
  • 30
  • 1
    If this is the complete source, you need to add a final curly brace to close the class definition of `Rover`. The error marker might be really small at the end of the source. -- BTW, I have formatted your source. Please get used to the standard Java style, and use the auto-ident feature of the editor (look into the menu, it has a convenient keyboard shortcut, too). – the busybee Aug 31 '22 at 09:38
  • I also think it's just the last curly brace. You can always use an IDE such as InteliJ, Eclipse or VisualStudio Code to check the syntax of your code if it's not possible in Greenfoot. Also using the correct formating will help you to find such mistakes easier – David Aug 31 '22 at 14:00
  • @David Greenfoot is commonly used by beginners in school or similar and it is a good choice. Exposure to heavy IDEs will intimidate and distract them a lot in my experience. ;-) Commonly such errors are quite visible, **if** users use the features of Greenfoot. Not using them is a hint of lacking guidance by the teachers. – the busybee Sep 01 '22 at 07:57
  • @busybee I know it's for learning, wasn't sure if greenfoot shows errors. I was just suggesting to copy paste the code to for example VSCode to check the syntax of the file and continue using greenfoot. I have used greenfoot like 6 years ago, but kind of wish to just have started learning with a normal tool instead – David Sep 01 '22 at 14:28

0 Answers0